Mercurial > archived > louis > epitech > mq > rathaxes
diff rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch @ 10:44a25ffd5c8c
Reorganize the patch queue a bit: put the cmake patch first then the LKM patch then the PCI part
author | Louis Opter <louis@lse.epitech.net> |
---|---|
date | Fri, 06 Jan 2012 13:43:06 +0100 |
parents | 5b128dbd2c17 |
children | efee5f0249e2 |
line wrap: on
line diff
--- a/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch Fri Jan 06 12:55:07 2012 +0100 +++ b/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch Fri Jan 06 13:43:06 2012 +0100 @@ -1,5 +1,5 @@ # HG changeset patch -# Parent 23fc39d03d6679b631adc6c22f312e6cda9aa82f +# Parent 873b66890128280637d97a24221258bb297a1ac8 rathaxes: start to implement the PCI registration part in the LKM sample diff --git a/rathaxes/samples/lkm/CMakeLists.txt b/rathaxes/samples/lkm/CMakeLists.txt @@ -31,7 +31,20 @@ template sequence LKM::init() { -@@ -17,7 +19,7 @@ +@@ -10,22 +12,29 @@ + { + #include <linux/module.h> + #include <linux/kernel.h> +- typedef int lkm_headers_include_stamp; + ++ typedef int include_linux_module_stamp; ++ typedef int include_linux_kernel_stamp; ++ } ++ ++ chunk LKM::data() ++ { + MODULE_DESCRIPTION(${config.description}); + MODULE_AUTHOR(${config.author}); MODULE_LICENSE(${config.license}); } @@ -40,15 +53,35 @@ { /* * Rathaxes doesn't yet support arbitrary "decorators" like __init -@@ -34,7 +36,7 @@ + * or __exit. + */ +- static int __attribute__((__section__(.init.text))) rtx_module_init(void) ++ static int __attribute__((__section__(".init.text"))) rtx_module_init(void) + { + ${pointcut ::IMPLEMENTATION}; ++ ++ return 0; + } + + module_init(rtx_module_init); +@@ -34,14 +43,14 @@ template sequence LKM::exit() { - chunk LKM::exit + chunk LKM::code() { - static void __attribute((__section__(.exit.text))) rtx_module_exit(void) +- static void __attribute((__section__(.exit.text))) rtx_module_exit(void) ++ static void __attribute__((__section__(".exit.text"))) rtx_module_exit(void) { + ${pointcut ::IMPLEMENTATION}; + } + +- module_exit(rtx_module_init); ++ module_exit(rtx_module_exit); + } + } + } diff --git a/rathaxes/samples/lkm/lkm.rti b/rathaxes/samples/lkm/lkm.rti --- a/rathaxes/samples/lkm/lkm.rti +++ b/rathaxes/samples/lkm/lkm.rti @@ -82,7 +115,7 @@ diff --git a/rathaxes/samples/lkm/lkm.rtx b/rathaxes/samples/lkm/lkm.rtx --- a/rathaxes/samples/lkm/lkm.rtx +++ b/rathaxes/samples/lkm/lkm.rtx -@@ -1,5 +1,15 @@ +@@ -1,19 +1,35 @@ -device LKM use LKM, Log +device LKM use LKM, PCI, Log { @@ -99,7 +132,15 @@ LKM::init() { Log::info("Hello this is LKM"); -@@ -12,7 +22,11 @@ ++ PCI::register(); + } + + LKM::exit() + { + Log::info("Good bye this was LKM"); ++ PCI::unregister(); + } + } configuration { @@ -108,26 +149,24 @@ LKM::description = "Hello World Loadable Kernel Module (LKM)"; LKM::license = "BSD"; + -+ PCI::vendor_id = "0x8080"; -+ PCI::product_id = "0x42"; ++ PCI::vendor_id = 0x8086; ++ PCI::product_id = 0x100f; } diff --git a/rathaxes/samples/lkm/pci.blt b/rathaxes/samples/lkm/pci.blt new file mode 100644 --- /dev/null +++ b/rathaxes/samples/lkm/pci.blt -@@ -0,0 +1,103 @@ -+with PCI, LKM +@@ -0,0 +1,129 @@ ++with PCI, LKM, Log +{ + template type PCI::Device() + { -+ /* -+ * chunk LKM::includes() -+ * { -+ * #include <linux/pci.h> -+ * -+ * typedef int include_linux_pci_stamp; -+ * } -+ */ ++ chunk LKM::includes() ++ { ++ #include <linux/pci.h> ++ ++ typedef int include_linux_pci_stamp; ++ } + + chunk ::decl() + { @@ -155,25 +194,6 @@ + const struct pci_device_id *); + } + -+ chunk LKM::data() -+ { -+ /* -+ * CNorm doesn't seem to like "dynamic" arrays (i.e: you always -+ * have to specify the exact size). -+ */ -+ static struct pci_device_id rtx_pci_device_table[2] = { -+ { ${config.vendor_id}, ${config.product_id}, 0, PCI_ANY_ID, PCI_ANY_ID }, -+ { 0, } -+ }; -+ -+ static struct pci_driver rtx_pci_driver = { -+ .name = ${config.name}, -+ .id_table = rtx_pci_device_table, -+ .probe = rtx_pci_probe, -+ .remove = rtx_pci_remove -+ }; -+ } -+ + chunk LKM::code() + { + static int /* __devinit */ rtx_pci_probe(struct pci_dev *pdev, @@ -183,7 +203,7 @@ + typedef int ${PCI::Device}; + + int err; -+ ${PCI::Device} dev = NULL; /* Doesn't work with a pointer */ ++ ${PCI::Device} *dev = NULL; + + err = pci_enable_device(pdev); +// if (err < 0) /* `if' doesn't work */ @@ -218,12 +238,59 @@ + } + } + } ++ ++ template sequence PCI::register() ++ { ++ chunk LKM::data() ++ { ++ /* ++ * CNorm doesn't seem to like "dynamic" arrays (i.e: you always ++ * have to specify the exact size). ++ */ ++ static struct pci_device_id rtx_pci_device_table[2] = { ++ { ${config.vendor_id}, ${config.product_id}, 0, PCI_ANY_ID, PCI_ANY_ID }, ++ { 0, } ++ }; ++ ++ static struct pci_driver rtx_pci_driver = { ++ .name = ${config.name}, ++ .id_table = rtx_pci_device_table, ++ .probe = rtx_pci_probe, ++ .remove = rtx_pci_remove ++ }; ++ } ++ ++ chunk ::CALL ++ { ++ /* ++ * So how do we use the return value in the parent context? ++ */ ++ pci_register_driver(&rtx_pci_driver); ++ /* ++ * if (pci_register_driver(&rtx_pci_driver)) ++ * { ++ * `if' still doesn't work. ++ * ++ * Also, can I call the Log interface from here? ++ * ${Log::info("Message")}; doesn't seem to work. ++ * } ++ */ ++ } ++ } ++ ++ template sequence PCI::unregister() ++ { ++ chunk ::CALL ++ { ++ pci_unregister_driver(&rtx_pci_driver); ++ } ++ } +} diff --git a/rathaxes/samples/lkm/pci.rti b/rathaxes/samples/lkm/pci.rti new file mode 100644 --- /dev/null +++ b/rathaxes/samples/lkm/pci.rti -@@ -0,0 +1,25 @@ +@@ -0,0 +1,30 @@ +interface PCI : LKM +{ + provided type PCI::Device; @@ -234,12 +301,17 @@ + provided sequence PCI::register() + { + provided chunk ::CALL; ++ provided chunk LKM::data; ++ } ++ ++ provided sequence PCI::unregister() ++ { ++ provided chunk ::CALL; + } + + required sequence PCI::probe(PCI::Device) + { + provided chunk LKM::prototypes; -+ provided chunk LKM::data; + provided chunk LKM::code; + } +