# HG changeset patch # User Louis Opter # Date 1325802452 -3600 # Node ID 5b128dbd2c17573c4f9868f8ae331d4fe6618527 # Parent e94d4a9e6bd5cf78c49a22a75045f2595d775a54 WIP on the PCI LKM + improve the UseRathaxes CMake "library" to easily build a kernel module from the sources generated by rathaxes diff -r e94d4a9e6bd5 -r 5b128dbd2c17 maintainers_add_add_rathaxes_lkm_in_use_rathaxes_cmake_file.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/maintainers_add_add_rathaxes_lkm_in_use_rathaxes_cmake_file.patch Thu Jan 05 23:27:32 2012 +0100 @@ -0,0 +1,85 @@ +# HG changeset patch +# Parent d2807f4a86fdd8e40cf6ee1a5f19fefd1d3fccae +maintainers: add the equivalent of ADD_RATHAXES_EXECUTABLE for kernel modules, only support Linux for now + +diff --git a/maintainers/CMakeScripts/Templates/MakefileLKM.in b/maintainers/CMakeScripts/Templates/MakefileLKM.in +new file mode 100644 +--- /dev/null ++++ b/maintainers/CMakeScripts/Templates/MakefileLKM.in +@@ -0,0 +1,12 @@ ++KDIR = /lib/modules/$(shell uname -r)/build ++obj-m := @LKM_OBJECTS@ ++ ++all: ++ $(MAKE) -C $(KDIR) SUBDIRS=$(shell pwd) modules ++ ++install: ++ $(MAKE) -C $(KDIR) SUBDIRS=$(shell pwd) modules_install ++ depmod -a ++clean: ++ rm -rf *~ ++ $(MAKE) -C $(KDIR) M=$(PWD) clean +diff --git a/maintainers/CMakeScripts/UseRathaxes.cmake b/maintainers/CMakeScripts/UseRathaxes.cmake +--- a/maintainers/CMakeScripts/UseRathaxes.cmake ++++ b/maintainers/CMakeScripts/UseRathaxes.cmake +@@ -114,6 +114,8 @@ + "${RATHAXES_SOURCE_DIR}/rathaxes/compiler/rtx*.cw[sp]" + "${RATHAXES_SOURCE_DIR}/rathaxes/compiler/rathaxes.cws") + ++ # ADD_CUSTOM_COMMAND + ADD_CUSTOM_TARGET is a CMake idiom to add a target ++ # that should be rebuilt automatically when its sources change. + STRING(REPLACE ";" ", " SYSTEMS "${SYSTEMS}") + ADD_CUSTOM_COMMAND(OUTPUT ${OUTPUTS} + COMMAND ${_RTX_CODEWORKER_COMMAND} "cache" "clear" +@@ -160,3 +162,51 @@ + ADD_EXECUTABLE(${NAME} "${RATHAXES_SOURCE}_${SYSTEM}.c") + ADD_DEPENDENCIES(${NAME} ${RATHAXES_SOURCE}) + ENDFUNCTION(ADD_RATHAXES_EXECUTABLE NAME RATHAXES_SOURCE) ++ ++# This function build a native kernel module from a previously generated ++# Rathaxes sources. It works by setting up a build directory and calling the ++# native build tools from there. ++# ++# Usage: ADD_RATHAXES_LKM(NAME RATHAXES_SOURCE [SYSTEM]) ++# ++# RATHAXES_SOURCE must corresponds to the first argument of a call to ++# ADD_RATHAXES_SOURCES. ++# ++# The third argument SYSTEM may be used if the target system doesn't correspond ++# to CMAKE_SYSTEM_NAME. ++FUNCTION(ADD_RATHAXES_LKM NAME RATHAXES_SOURCE) ++ IF (${ARGC} EQUAL 2) ++ SET(SYSTEM ${CMAKE_SYSTEM_NAME}) ++ ELSE (${ARGC} EQUAL 2) ++ SET(SYSTEM ${ARGV2}) ++ ENDIF (${ARGC} EQUAL 2) ++ ++ IF (${SYSTEM} MATCHES "Linux") ++ # Create a little build space for the native Linux build-chain. ++ SET(MODULE_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${NAME}.dir/${SYSTEM}Build/") ++ ++ # Generate the Linux Makefile to build a Linux kernel module ++ SET(MODULE_MAKEFILE "${MODULE_BUILD_DIR}/Makefile") ++ SET(LKM_OBJECTS "${RATHAXES_SOURCE}_${SYSTEM}.o") ++ CONFIGURE_FILE("${RATHAXES_SOURCE_DIR}/maintainers/CMakeScripts/Templates/MakefileLKM.in" ++ "${MODULE_MAKEFILE}") ++ ++ SET(KERNEL_OBJECT_NAME "${RATHAXES_SOURCE}_${SYSTEM}.ko") ++ ADD_CUSTOM_COMMAND(OUTPUT "${KERNEL_OBJECT_NAME}" ++ # The linux Makefile to build kernel module is quite ++ # picky about file location and its own name. Let's ++ # copy our source side by side with the Makefile: ++ COMMAND "${CMAKE_COMMAND}" "-E" "copy" "${RATHAXES_SOURCE}_${SYSTEM}.c" "${MODULE_BUILD_DIR}" ++ # Then call make in the little build space we created ++ COMMAND "${CMAKE_COMMAND}" "-E" "chdir" "${MODULE_BUILD_DIR}" "${CMAKE_BUILD_TOOL}" ++ # Finally copy the generated .ko back into the current binary dir ++ COMMAND "${CMAKE_COMMAND}" "-E" "copy" "${MODULE_BUILD_DIR}/${KERNEL_OBJECT_NAME}" "${CMAKE_CURRENT_BINARY_DIR}" ++ COMMENT "Building Rathaxes Linux LKM for ${NAME}" ++ VERBATIM ++ DEPENDS "${RATHAXES_SOURCE}_${SYSTEM}.c") ++ ++ ADD_CUSTOM_TARGET("${NAME}" ALL DEPENDS "${KERNEL_OBJECT_NAME}") ++ ELSE (${SYSTEM} MATCHES "Linux") ++ MESSAGE(STATUS "Don't know how to build kernel modules for ${SYSTEM} (yet)") ++ ENDIF (${SYSTEM} MATCHES "Linux") ++ENDFUNCTION(ADD_RATHAXES_LKM NAME RATHAXES_SOURCE) diff -r e94d4a9e6bd5 -r 5b128dbd2c17 rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch --- a/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch Thu Jan 05 20:53:28 2012 +0100 +++ b/rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch Thu Jan 05 23:27:32 2012 +0100 @@ -5,12 +5,16 @@ 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 @@ +@@ -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 @@ -48,19 +52,20 @@ 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,9 @@ +@@ -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 +12,11 @@ +@@ -11,11 +13,11 @@ required sequence LKM::init() { provided chunk LKM::includes; @@ -178,7 +183,7 @@ + typedef int ${PCI::Device}; + + int err; -+ ${PCI::Device} *dev = NULL; /* Doesn't work with a pointer */ ++ ${PCI::Device} dev = NULL; /* Doesn't work with a pointer */ + + err = pci_enable_device(pdev); +// if (err < 0) /* `if' doesn't work */ diff -r e94d4a9e6bd5 -r 5b128dbd2c17 series --- a/series Thu Jan 05 20:53:28 2012 +0100 +++ b/series Thu Jan 05 23:27:32 2012 +0100 @@ -1,2 +1,3 @@ rathaxes_add_a_linux_lkm.patch rathaxes_start_to_implement_pci_stuff_in_the_lkm.patch +maintainers_add_add_rathaxes_lkm_in_use_rathaxes_cmake_file.patch