Mercurial > archived > louis > epitech > mq > rathaxes
view rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch @ 6:5b128dbd2c17
WIP on the PCI LKM + improve the UseRathaxes CMake "library" to easily build a kernel module from the sources generated by rathaxes
author | Louis Opter <louis@lse.epitech.net> |
---|---|
date | Thu, 05 Jan 2012 23:27:32 +0100 |
parents | e94d4a9e6bd5 |
children | 44a25ffd5c8c |
line wrap: on
line source
# HG changeset patch # Parent 23fc39d03d6679b631adc6c22f312e6cda9aa82f 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 --- a/rathaxes/samples/lkm/CMakeLists.txt +++ b/rathaxes/samples/lkm/CMakeLists.txt @@ -1,3 +1,7 @@ ADD_RATHAXES_SOURCES(lkm lkm.rtx - RTI log.rti lkm.rti - BLT log.blt lkm.blt) + RTI log.rti lkm.rti pci.rti + BLT log.blt lkm.blt pci.blt) + +# We can't name lkm since it's already used as the target name to generate the +# source (with ADD_RATHAXES_SOURCES). +ADD_RATHAXES_LKM(lkm_hello lkm) diff --git a/rathaxes/samples/lkm/lkm.blt b/rathaxes/samples/lkm/lkm.blt --- a/rathaxes/samples/lkm/lkm.blt +++ b/rathaxes/samples/lkm/lkm.blt @@ -1,8 +1,10 @@ with LKM { + /* Skel of the generated C file: */ ${pointcut LKM::includes}; - ${pointcut LKM::init}; - ${pointcut LKM::exit}; + ${pointcut LKM::prototypes}; + ${pointcut LKM::data}; + ${pointcut LKM::code}; template sequence LKM::init() { @@ -17,7 +19,7 @@ MODULE_LICENSE(${config.license}); } - chunk LKM::init() + chunk LKM::code() { /* * Rathaxes doesn't yet support arbitrary "decorators" like __init @@ -34,7 +36,7 @@ template sequence LKM::exit() { - chunk LKM::exit + chunk LKM::code() { static void __attribute((__section__(.exit.text))) rtx_module_exit(void) { 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 @@ -1,8 +1,10 @@ interface LKM { provided pointcut LKM::includes; - provided pointcut LKM::init; - provided pointcut LKM::exit; + /* maybe it should be possible to use chunk ::decl in sequence templates? */ + provided pointcut LKM::prototypes; + provided pointcut LKM::data; + provided pointcut LKM::code; required variable ::string LKM::author; required variable ::string LKM::description; @@ -11,11 +13,11 @@ required sequence LKM::init() { provided chunk LKM::includes; - provided chunk LKM::init; + provided chunk LKM::code; } required sequence LKM::exit() { - provided chunk LKM::exit; + provided chunk LKM::code; } } 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 @@ -device LKM use LKM, Log +device LKM use LKM, PCI, Log { + PCI::probe(PCI::Device dev) + { + + } + + PCI::remove(PCI::Device dev) + { + + } + LKM::init() { Log::info("Hello this is LKM"); @@ -12,7 +22,11 @@ configuration { + LKM::name = "hello"; LKM::author = "Rathaxes"; LKM::description = "Hello World Loadable Kernel Module (LKM)"; LKM::license = "BSD"; + + PCI::vendor_id = "0x8080"; + PCI::product_id = "0x42"; } 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 +{ + template type PCI::Device() + { + /* + * chunk LKM::includes() + * { + * #include <linux/pci.h> + * + * typedef int include_linux_pci_stamp; + * } + */ + + chunk ::decl() + { + struct rtx_pci_device + { + struct pci_dev *pci_dev; + }; + } + + chunk ::init(pci_dev) + { + ${self}.pci_dev = pci_dev; + } + + map + { + } + } + + template sequence PCI::probe(PCI::Device dev) + { + chunk LKM::prototypes() + { + static int /* __devinit */ rtx_pci_probe(struct pci_dev *, + 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, + const struct pci_device_id *pdev_id) + { + /* workaround for CNorm __std__ dialect, shouldn't be here */ + typedef int ${PCI::Device}; + + int err; + ${PCI::Device} dev = NULL; /* Doesn't work with a pointer */ + + err = pci_enable_device(pdev); +// if (err < 0) /* `if' doesn't work */ +// goto fail; + + ${pointcut ::IMPLEMENTATION}; + + pci_set_drvdata(pdev, dev); + + return 0; + + fail: + return err; + } + } + } + + template sequence PCI::remove(PCI::Device dev) + { + chunk LKM::prototypes() + { + static void rtx_pci_remove(struct pci_dev *); + } + + chunk LKM::code() + { + static void rtx_pci_remove(struct pci_dev *pdev) + { + pci_disable_device(pdev); + + ${pointcut ::IMPLEMENTATION}; + } + } + } +} 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 @@ +interface PCI : LKM +{ + provided type PCI::Device; + + required variable ::number PCI::vendor_id; + required variable ::number PCI::product_id; + + provided sequence PCI::register() + { + provided chunk ::CALL; + } + + required sequence PCI::probe(PCI::Device) + { + provided chunk LKM::prototypes; + provided chunk LKM::data; + provided chunk LKM::code; + } + + required sequence PCI::remove(PCI::Device) + { + provided chunk LKM::prototypes; + provided chunk LKM::code; + } +}