From 89b6137144a69c4f4165d7dc2297eebe12400a3b Mon Sep 17 00:00:00 2001
From: root <root@debian-BULLSEYE-live-builder-AMD64>
Date: Wed, 20 Sep 2023 14:51:17 +0200
Subject: [PATCH] Feat: real great work made by valentin and adil, in a great
 communion of spirit

---
 work/hello-1/Makefile      |   5 +-
 work/hello-1/hello         | Bin 0 -> 15952 bytes
 work/hello-1/hello-1.mod.c |  47 ++++++++++
 work/hello-1/hello-2.c     |  24 +++++
 work/hello-1/hello-2.mod.c |  47 ++++++++++
 work/hello-1/hello-3.c     |  26 ++++++
 work/hello-1/hello-3.mod.c |  47 ++++++++++
 work/hello-1/hello-5.c     |  68 ++++++++++++++
 work/hello-1/hello-5.mod.c |  52 +++++++++++
 work/hello-1/hello.c       |   7 ++
 work/hello-1/modules.order |   4 +
 work/tp1/Makefile          |   9 ++
 work/tp1/chardev.c         | 184 +++++++++++++++++++++++++++++++++++++
 work/tp1/chardev.mod.c     |  57 ++++++++++++
 work/tp1/modules.order     |   1 +
 15 files changed, 577 insertions(+), 1 deletion(-)
 create mode 100755 work/hello-1/hello
 create mode 100644 work/hello-1/hello-1.mod.c
 create mode 100644 work/hello-1/hello-2.c
 create mode 100644 work/hello-1/hello-2.mod.c
 create mode 100644 work/hello-1/hello-3.c
 create mode 100644 work/hello-1/hello-3.mod.c
 create mode 100644 work/hello-1/hello-5.c
 create mode 100644 work/hello-1/hello-5.mod.c
 create mode 100644 work/hello-1/hello.c
 create mode 100644 work/hello-1/modules.order
 create mode 100644 work/tp1/Makefile
 create mode 100644 work/tp1/chardev.c
 create mode 100644 work/tp1/chardev.mod.c
 create mode 100644 work/tp1/modules.order

diff --git a/work/hello-1/Makefile b/work/hello-1/Makefile
index 5288f36..b06c2df 100644
--- a/work/hello-1/Makefile
+++ b/work/hello-1/Makefile
@@ -1,6 +1,9 @@
 KDIR=../../build/kvm/
 
-obj-m += hello-1.o 
+obj-m += hello-1.o
+obj-m += hello-2.o
+obj-m += hello-3.o
+obj-m += hello-5.o
 PWD := $(CURDIR) 
 
 all: 
diff --git a/work/hello-1/hello b/work/hello-1/hello
new file mode 100755
index 0000000000000000000000000000000000000000..297a392588eb66dbe792595b2e025125c668e489
GIT binary patch
literal 15952
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

literal 0
HcmV?d00001

diff --git a/work/hello-1/hello-1.mod.c b/work/hello-1/hello-1.mod.c
new file mode 100644
index 0000000..c50ac50
--- /dev/null
+++ b/work/hello-1/hello-1.mod.c
@@ -0,0 +1,47 @@
+#include <linux/module.h>
+#define INCLUDE_VERMAGIC
+#include <linux/build-salt.h>
+#include <linux/elfnote-lto.h>
+#include <linux/export-internal.h>
+#include <linux/vermagic.h>
+#include <linux/compiler.h>
+
+#ifdef CONFIG_UNWINDER_ORC
+#include <asm/orc_header.h>
+ORC_HEADER;
+#endif
+
+BUILD_SALT;
+BUILD_LTO_INFO;
+
+MODULE_INFO(vermagic, VERMAGIC_STRING);
+MODULE_INFO(name, KBUILD_MODNAME);
+
+__visible struct module __this_module
+__section(".gnu.linkonce.this_module") = {
+	.name = KBUILD_MODNAME,
+	.init = init_module,
+#ifdef CONFIG_MODULE_UNLOAD
+	.exit = cleanup_module,
+#endif
+	.arch = MODULE_ARCH_INIT,
+};
+
+#ifdef CONFIG_RETPOLINE
+MODULE_INFO(retpoline, "Y");
+#endif
+
+
+
+static const struct modversion_info ____versions[]
+__used __section("__versions") = {
+	{ 0xbdfb6dbb, "__fentry__" },
+	{ 0x122c3a7e, "_printk" },
+	{ 0x5b8239ca, "__x86_return_thunk" },
+	{ 0x76800044, "module_layout" },
+};
+
+MODULE_INFO(depends, "");
+
+
+MODULE_INFO(srcversion, "93D1874613E2633FD08C40F");
diff --git a/work/hello-1/hello-2.c b/work/hello-1/hello-2.c
new file mode 100644
index 0000000..336c9c3
--- /dev/null
+++ b/work/hello-1/hello-2.c
@@ -0,0 +1,24 @@
+/*
+ * hello-1.c - The simplest kernel module.
+ */
+#include <linux/init.h> /* Needed for the macros */
+#include <linux/module.h> /* Needed by all modules */
+#include <linux/printk.h> /* Needed for pr_info() */
+
+static int __init hello_2_init(void)
+{
+    pr_info("Hello world 2.\n");
+
+    /* A non 0 return means init_module failed; module can't be loaded. */
+    return 0;
+}
+
+static void __exit hello_2_exit(void)
+{
+    pr_info("Goodbye world 2.\n");
+}
+
+module_init(hello_2_init);
+module_exit(hello_2_exit);
+
+MODULE_LICENSE("GPL");
diff --git a/work/hello-1/hello-2.mod.c b/work/hello-1/hello-2.mod.c
new file mode 100644
index 0000000..44d3a1a
--- /dev/null
+++ b/work/hello-1/hello-2.mod.c
@@ -0,0 +1,47 @@
+#include <linux/module.h>
+#define INCLUDE_VERMAGIC
+#include <linux/build-salt.h>
+#include <linux/elfnote-lto.h>
+#include <linux/export-internal.h>
+#include <linux/vermagic.h>
+#include <linux/compiler.h>
+
+#ifdef CONFIG_UNWINDER_ORC
+#include <asm/orc_header.h>
+ORC_HEADER;
+#endif
+
+BUILD_SALT;
+BUILD_LTO_INFO;
+
+MODULE_INFO(vermagic, VERMAGIC_STRING);
+MODULE_INFO(name, KBUILD_MODNAME);
+
+__visible struct module __this_module
+__section(".gnu.linkonce.this_module") = {
+	.name = KBUILD_MODNAME,
+	.init = init_module,
+#ifdef CONFIG_MODULE_UNLOAD
+	.exit = cleanup_module,
+#endif
+	.arch = MODULE_ARCH_INIT,
+};
+
+#ifdef CONFIG_RETPOLINE
+MODULE_INFO(retpoline, "Y");
+#endif
+
+
+
+static const struct modversion_info ____versions[]
+__used __section("__versions") = {
+	{ 0x5b8239ca, "__x86_return_thunk" },
+	{ 0xbdfb6dbb, "__fentry__" },
+	{ 0x122c3a7e, "_printk" },
+	{ 0x76800044, "module_layout" },
+};
+
+MODULE_INFO(depends, "");
+
+
+MODULE_INFO(srcversion, "429C9C7906F80F08EC81A8E");
diff --git a/work/hello-1/hello-3.c b/work/hello-1/hello-3.c
new file mode 100644
index 0000000..28b7f9e
--- /dev/null
+++ b/work/hello-1/hello-3.c
@@ -0,0 +1,26 @@
+/*
+ * hello-1.c - The simplest kernel module.
+ */
+#include <linux/init.h> /* Needed for the macros */
+#include <linux/module.h> /* Needed by all modules */
+#include <linux/printk.h> /* Needed for pr_info() */
+
+static int hello3_data __initdata = 3;
+
+static int __init hello_3_init(void)
+{
+    pr_info("Hello world %d.\n", hello3_data);
+
+    /* A non 0 return means init_module failed; module can't be loaded. */
+    return 0;
+}
+
+static void __exit hello_3_exit(void)
+{
+    pr_info("Goodbye world 3.\n");
+}
+
+module_init(hello_3_init);
+module_exit(hello_3_exit);
+
+MODULE_LICENSE("GPL");
diff --git a/work/hello-1/hello-3.mod.c b/work/hello-1/hello-3.mod.c
new file mode 100644
index 0000000..ab3d9de
--- /dev/null
+++ b/work/hello-1/hello-3.mod.c
@@ -0,0 +1,47 @@
+#include <linux/module.h>
+#define INCLUDE_VERMAGIC
+#include <linux/build-salt.h>
+#include <linux/elfnote-lto.h>
+#include <linux/export-internal.h>
+#include <linux/vermagic.h>
+#include <linux/compiler.h>
+
+#ifdef CONFIG_UNWINDER_ORC
+#include <asm/orc_header.h>
+ORC_HEADER;
+#endif
+
+BUILD_SALT;
+BUILD_LTO_INFO;
+
+MODULE_INFO(vermagic, VERMAGIC_STRING);
+MODULE_INFO(name, KBUILD_MODNAME);
+
+__visible struct module __this_module
+__section(".gnu.linkonce.this_module") = {
+	.name = KBUILD_MODNAME,
+	.init = init_module,
+#ifdef CONFIG_MODULE_UNLOAD
+	.exit = cleanup_module,
+#endif
+	.arch = MODULE_ARCH_INIT,
+};
+
+#ifdef CONFIG_RETPOLINE
+MODULE_INFO(retpoline, "Y");
+#endif
+
+
+
+static const struct modversion_info ____versions[]
+__used __section("__versions") = {
+	{ 0x5b8239ca, "__x86_return_thunk" },
+	{ 0xbdfb6dbb, "__fentry__" },
+	{ 0x122c3a7e, "_printk" },
+	{ 0x76800044, "module_layout" },
+};
+
+MODULE_INFO(depends, "");
+
+
+MODULE_INFO(srcversion, "C0F43BFE7A1B717A042758A");
diff --git a/work/hello-1/hello-5.c b/work/hello-1/hello-5.c
new file mode 100644
index 0000000..01a180b
--- /dev/null
+++ b/work/hello-1/hello-5.c
@@ -0,0 +1,68 @@
+/* 
+ * hello-5.c - Demonstrates command line argument passing to a module. 
+ */ 
+#include <linux/init.h> 
+#include <linux/kernel.h> /* for ARRAY_SIZE() */ 
+#include <linux/module.h> 
+#include <linux/moduleparam.h> 
+#include <linux/printk.h> 
+#include <linux/stat.h> 
+ 
+MODULE_LICENSE("GPL"); 
+ 
+static short int myshort = 1; 
+static int myint = 420; 
+static long int mylong = 9999; 
+static char *mystring = "blah"; 
+static int myintarray[2] = { 420, 420 }; 
+static int arr_argc = 0; 
+ 
+/* module_param(foo, int, 0000) 
+ * The first param is the parameters name. 
+ * The second param is its data type. 
+ * The final argument is the permissions bits, 
+ * for exposing parameters in sysfs (if non-zero) at a later stage. 
+ */ 
+module_param(myshort, short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); 
+MODULE_PARM_DESC(myshort, "A short integer"); 
+module_param(myint, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); 
+MODULE_PARM_DESC(myint, "An integer"); 
+module_param(mylong, long, S_IRUSR); 
+MODULE_PARM_DESC(mylong, "A long integer"); 
+module_param(mystring, charp, 0000); 
+MODULE_PARM_DESC(mystring, "A character string"); 
+ 
+/* module_param_array(name, type, num, perm); 
+ * The first param is the parameter's (in this case the array's) name. 
+ * The second param is the data type of the elements of the array. 
+ * The third argument is a pointer to the variable that will store the number 
+ * of elements of the array initialized by the user at module loading time. 
+ * The fourth argument is the permission bits. 
+ */ 
+module_param_array(myintarray, int, &arr_argc, 0000); 
+MODULE_PARM_DESC(myintarray, "An array of integers"); 
+ 
+static int __init hello_5_init(void) 
+{ 
+    int i; 
+ 
+    pr_info("Hello, world 5\n=============\n"); 
+    pr_info("myshort is a short integer: %hd\n", myshort); 
+    pr_info("myint is an integer: %d\n", myint); 
+    pr_info("mylong is a long integer: %ld\n", mylong); 
+    pr_info("mystring is a string: %s\n", mystring); 
+ 
+    for (i = 0; i < ARRAY_SIZE(myintarray); i++) 
+        pr_info("myintarray[%d] = %d\n", i, myintarray[i]); 
+ 
+    pr_info("got %d arguments for myintarray.\n", arr_argc); 
+    return 0; 
+} 
+ 
+static void __exit hello_5_exit(void) 
+{ 
+    pr_info("Goodbye, world 5\n"); 
+} 
+ 
+module_init(hello_5_init); 
+module_exit(hello_5_exit);
\ No newline at end of file
diff --git a/work/hello-1/hello-5.mod.c b/work/hello-1/hello-5.mod.c
new file mode 100644
index 0000000..beaec19
--- /dev/null
+++ b/work/hello-1/hello-5.mod.c
@@ -0,0 +1,52 @@
+#include <linux/module.h>
+#define INCLUDE_VERMAGIC
+#include <linux/build-salt.h>
+#include <linux/elfnote-lto.h>
+#include <linux/export-internal.h>
+#include <linux/vermagic.h>
+#include <linux/compiler.h>
+
+#ifdef CONFIG_UNWINDER_ORC
+#include <asm/orc_header.h>
+ORC_HEADER;
+#endif
+
+BUILD_SALT;
+BUILD_LTO_INFO;
+
+MODULE_INFO(vermagic, VERMAGIC_STRING);
+MODULE_INFO(name, KBUILD_MODNAME);
+
+__visible struct module __this_module
+__section(".gnu.linkonce.this_module") = {
+	.name = KBUILD_MODNAME,
+	.init = init_module,
+#ifdef CONFIG_MODULE_UNLOAD
+	.exit = cleanup_module,
+#endif
+	.arch = MODULE_ARCH_INIT,
+};
+
+#ifdef CONFIG_RETPOLINE
+MODULE_INFO(retpoline, "Y");
+#endif
+
+
+
+static const struct modversion_info ____versions[]
+__used __section("__versions") = {
+	{ 0x5b8239ca, "__x86_return_thunk" },
+	{ 0x18121e8f, "param_array_ops" },
+	{ 0xd61b6a34, "param_ops_int" },
+	{ 0x65e16dde, "param_ops_charp" },
+	{ 0x16db37eb, "param_ops_long" },
+	{ 0xe284dd72, "param_ops_short" },
+	{ 0xbdfb6dbb, "__fentry__" },
+	{ 0x122c3a7e, "_printk" },
+	{ 0x76800044, "module_layout" },
+};
+
+MODULE_INFO(depends, "");
+
+
+MODULE_INFO(srcversion, "9FCBEE8537BAB4A242DD00B");
diff --git a/work/hello-1/hello.c b/work/hello-1/hello.c
new file mode 100644
index 0000000..736356e
--- /dev/null
+++ b/work/hello-1/hello.c
@@ -0,0 +1,7 @@
+#include <stdio.h> 
+
+int main(void) 
+{ 
+    printf("hello"); 
+    return 0; 
+}
\ No newline at end of file
diff --git a/work/hello-1/modules.order b/work/hello-1/modules.order
new file mode 100644
index 0000000..07bfd42
--- /dev/null
+++ b/work/hello-1/modules.order
@@ -0,0 +1,4 @@
+/root/Desktop/asee/work/hello-1/hello-1.o
+/root/Desktop/asee/work/hello-1/hello-2.o
+/root/Desktop/asee/work/hello-1/hello-3.o
+/root/Desktop/asee/work/hello-1/hello-5.o
diff --git a/work/tp1/Makefile b/work/tp1/Makefile
new file mode 100644
index 0000000..837cdd1
--- /dev/null
+++ b/work/tp1/Makefile
@@ -0,0 +1,9 @@
+KDIR=../../build/kvm/
+
+obj-m += chardev.o
+PWD := $(CURDIR) 
+
+all: 
+	make -C $(KDIR) M=$(PWD) modules 
+clean: 
+	make -C $(KDIR) M=$(PWD) clean
diff --git a/work/tp1/chardev.c b/work/tp1/chardev.c
new file mode 100644
index 0000000..e249f14
--- /dev/null
+++ b/work/tp1/chardev.c
@@ -0,0 +1,184 @@
+/* 
+ * chardev.c: Creates a read-only char device that says how many times 
+ * you have read from the dev file 
+ */ 
+ 
+#include <linux/atomic.h> 
+#include <linux/cdev.h> 
+#include <linux/delay.h> 
+#include <linux/device.h> 
+#include <linux/fs.h> 
+#include <linux/init.h> 
+#include <linux/kernel.h> /* for sprintf() */ 
+#include <linux/module.h> 
+#include <linux/printk.h> 
+#include <linux/types.h> 
+#include <linux/uaccess.h> /* for get_user and put_user */ 
+#include <linux/version.h> 
+ 
+#include <asm/errno.h> 
+ 
+/*  Prototypes - this would normally go in a .h file */ 
+static int device_open(struct inode *, struct file *); 
+static int device_release(struct inode *, struct file *); 
+static ssize_t device_read(struct file *, char __user *, size_t, loff_t *); 
+static ssize_t device_write(struct file *, const char __user *, size_t, 
+                            loff_t *); 
+ 
+#define SUCCESS 0 
+#define DEVICE_NAME "asee_mod" /* Dev name as it appears in /proc/devices   */ 
+#define BUF_LEN 16 /* Max length of the message from the device */ 
+ 
+/* Global variables are declared as static, so are global within the file. */ 
+ 
+static int major; /* major number assigned to our device driver */ 
+ 
+enum { 
+    CDEV_NOT_USED = 0, 
+    CDEV_EXCLUSIVE_OPEN = 1, 
+}; 
+ 
+/* Is device open? Used to prevent multiple access to device */ 
+static atomic_t already_open = ATOMIC_INIT(CDEV_NOT_USED); 
+ 
+static char msg[BUF_LEN + 1]; /* The msg the device will give when asked */ 
+ 
+static struct class *cls; 
+ 
+static struct file_operations chardev_fops = { 
+    .read = device_read, 
+    .write = device_write, 
+    .open = device_open, 
+    .release = device_release, 
+}; 
+ 
+static int __init chardev_init(void) 
+{ 
+    major = register_chrdev(0, DEVICE_NAME, &chardev_fops); 
+ 
+    if (major < 0) { 
+        pr_alert("Registering char device failed with %d\n", major); 
+        return major; 
+    } 
+ 
+    pr_info("I was assigned major number %d.\n", major); 
+ 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) 
+    cls = class_create(DEVICE_NAME); 
+#else 
+    cls = class_create(THIS_MODULE, DEVICE_NAME); 
+#endif 
+    device_create(cls, NULL, MKDEV(major, 0), NULL, DEVICE_NAME); 
+ 
+    pr_info("Device created on /dev/%s\n", DEVICE_NAME); 
+ 
+    return SUCCESS; 
+} 
+ 
+static void __exit chardev_exit(void) 
+{ 
+    device_destroy(cls, MKDEV(major, 0)); 
+    class_destroy(cls); 
+ 
+    /* Unregister the device */ 
+    unregister_chrdev(major, DEVICE_NAME); 
+} 
+ 
+/* Methods */ 
+
+/* Called when a process tries to open the device file, like 
+ * "sudo cat /dev/chardev" 
+ */ 
+static int device_open(struct inode *inode, struct file *file) 
+{  
+    if (atomic_cmpxchg(&already_open, CDEV_NOT_USED, CDEV_EXCLUSIVE_OPEN)) 
+        return -EBUSY; 
+
+
+    pr_info("%s\n", msg); 
+    try_module_get(THIS_MODULE); 
+ 
+    return SUCCESS; 
+} 
+ 
+/* Called when a process closes the device file. */ 
+static int device_release(struct inode *inode, struct file *file) 
+{ 
+    /* We're now ready for our next caller */ 
+    atomic_set(&already_open, CDEV_NOT_USED); 
+ 
+    /* Decrement the usage count, or else once you opened the file, you will 
+     * never get rid of the module. 
+     */ 
+    module_put(THIS_MODULE); 
+ 
+    return SUCCESS; 
+} 
+ 
+/* Called when a process, which already opened the dev file, attempts to 
+ * read from it. 
+ */ 
+static int last_writen_bytes;
+static int bytes_in_buffer = 0;
+static ssize_t device_read(struct file *filp, /* see include/linux/fs.h   */ 
+                           char __user *buffer, /* buffer to fill with data */ 
+                           size_t length, /* length of the buffer     */ 
+                           loff_t *offset) 
+{ 
+    /* Number of bytes actually written to the buffer */ 
+    int bytes_read = 0; 
+    char *msg_ptr = msg; 
+ 
+    /* Actually put the data into the buffer */ 
+    while (bytes_in_buffer > 0) { 
+        if (last_writen_bytes >= BUF_LEN) {
+            last_writen_bytes = 0;
+        }
+        /* The buffer is in the user data segment, not the kernel 
+         * segment so "*" assignment won't work.  We have to use 
+         * put_user which copies data from the kernel data segment to 
+         * the user data segment. 
+         */ 
+        
+        put_user(*(msg_ptr + last_writen_bytes), buffer++);
+        // Try to clear the read
+        *(msg_ptr + last_writen_bytes) = '\0';
+        last_writen_bytes++;
+        bytes_in_buffer--;
+        bytes_read++;
+    } 
+ 
+    *offset = last_writen_bytes; 
+ 
+    /* Most read functions return the number of bytes put into the buffer. */ 
+    return bytes_read; 
+} 
+ 
+/* Called when a process writes to dev file: echo "hi" > /dev/hello */ 
+static ssize_t device_write(struct file *filp, const char __user *buff, 
+                            size_t len, loff_t *off) 
+{ 
+    int bytes_writen = 0;
+
+    int current_bytes = last_writen_bytes;
+
+    for (int cpt = 0; cpt < len; cpt++) {
+        if (current_bytes >= BUF_LEN) {
+            current_bytes = 0;
+        }
+        get_user(*(msg + current_bytes), buff + cpt);
+        current_bytes++;
+        bytes_writen++;
+        bytes_in_buffer++;
+    }
+
+    last_writen_bytes = current_bytes;
+    *off = last_writen_bytes; 
+
+    return bytes_writen; 
+} 
+ 
+module_init(chardev_init); 
+module_exit(chardev_exit); 
+ 
+MODULE_LICENSE("GPL");
\ No newline at end of file
diff --git a/work/tp1/chardev.mod.c b/work/tp1/chardev.mod.c
new file mode 100644
index 0000000..c424c1d
--- /dev/null
+++ b/work/tp1/chardev.mod.c
@@ -0,0 +1,57 @@
+#include <linux/module.h>
+#define INCLUDE_VERMAGIC
+#include <linux/build-salt.h>
+#include <linux/elfnote-lto.h>
+#include <linux/export-internal.h>
+#include <linux/vermagic.h>
+#include <linux/compiler.h>
+
+#ifdef CONFIG_UNWINDER_ORC
+#include <asm/orc_header.h>
+ORC_HEADER;
+#endif
+
+BUILD_SALT;
+BUILD_LTO_INFO;
+
+MODULE_INFO(vermagic, VERMAGIC_STRING);
+MODULE_INFO(name, KBUILD_MODNAME);
+
+__visible struct module __this_module
+__section(".gnu.linkonce.this_module") = {
+	.name = KBUILD_MODNAME,
+	.init = init_module,
+#ifdef CONFIG_MODULE_UNLOAD
+	.exit = cleanup_module,
+#endif
+	.arch = MODULE_ARCH_INIT,
+};
+
+#ifdef CONFIG_RETPOLINE
+MODULE_INFO(retpoline, "Y");
+#endif
+
+
+
+static const struct modversion_info ____versions[]
+__used __section("__versions") = {
+	{ 0x122c3a7e, "_printk" },
+	{ 0x47143bb3, "try_module_get" },
+	{ 0x73895700, "__register_chrdev" },
+	{ 0xfb890f0b, "class_create" },
+	{ 0x41b15bc9, "device_create" },
+	{ 0xf23bcaeb, "device_destroy" },
+	{ 0xfdfe3852, "class_destroy" },
+	{ 0x6bc3fbc0, "__unregister_chrdev" },
+	{ 0xbdfb6dbb, "__fentry__" },
+	{ 0xc3aaf0a9, "__put_user_1" },
+	{ 0x5b8239ca, "__x86_return_thunk" },
+	{ 0x167e7f9d, "__get_user_1" },
+	{ 0xab632ed, "module_put" },
+	{ 0x76800044, "module_layout" },
+};
+
+MODULE_INFO(depends, "");
+
+
+MODULE_INFO(srcversion, "9201228D14671D604AADDD7");
diff --git a/work/tp1/modules.order b/work/tp1/modules.order
new file mode 100644
index 0000000..c25b792
--- /dev/null
+++ b/work/tp1/modules.order
@@ -0,0 +1 @@
+/root/Desktop/asee/work/tp1/chardev.o
-- 
GitLab