Mercurial > archived > louis > epitech > mq > rathaxes
view rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch @ 4:d102c9be499c
WIP on the PCI LKM
author | Louis Opter <louis@lse.epitech.net> |
---|---|
date | Thu, 05 Jan 2012 17:37:29 +0100 |
parents | |
children | e94d4a9e6bd5 |
line wrap: on
line source
# HG changeset patch # Parent e6e856bbde57d16b41e73cec8026d485ed722ab4 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,3 @@ 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) 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,8 @@ with LKM { ${pointcut LKM::includes}; - ${pointcut LKM::init}; - ${pointcut LKM::exit}; + ${pointcut LKM::data}; + ${pointcut LKM::code}; template sequence LKM::init() { @@ -17,7 +17,7 @@ MODULE_LICENSE(${config.license}); } - chunk LKM::init() + chunk LKM::code() { /* * Rathaxes doesn't yet support arbitrary "decorators" like __init @@ -34,7 +34,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,8 @@ interface LKM { provided pointcut LKM::includes; - provided pointcut LKM::init; - provided pointcut LKM::exit; + provided pointcut LKM::data; + provided pointcut LKM::code; required variable ::string LKM::author; required variable ::string LKM::description; @@ -11,11 +11,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,6 +22,7 @@ configuration { + LKM::name = "hello"; LKM::author = "Rathaxes"; LKM::description = "Hello World Loadable Kernel Module (LKM)"; LKM::license = "BSD"; 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,73 @@ +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::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::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,19 @@ +interface PCI : LKM +{ + provided type PCI::Device; + + provided sequence PCI::register() + { + provided chunk ::CALL; + } + + required sequence PCI::probe(PCI::Device) + { + provided chunk LKM::code; + } + + required sequence PCI::remove(PCI::Device) + { + provided chunk LKM::code; + } +}