This removes static memory addresses of sys_call_table and
kernel_restart_prepare and makes it easier to compile for a
new target
CROSS_COMPILE=arm-eabi-
CROSS_PATH=$(PWD)/../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
CROSS_COMPILE=arm-eabi-
CROSS_PATH=$(PWD)/../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
-EXTRA_CFLAGS += -DCONFIG_KEXEC -Wall
+SYS_CALL_TABLE := $(shell grep ' T sys_call_table$$' $(KDIR)/System.map | cut -f1 -d' ')
+KERNEL_RESTART_PREPARE := $(shell grep ' T kernel_restart_prepare$$' $(KDIR)/System.map | cut -f1 -d' ')
+
+EXTRA_CFLAGS += -DCONFIG_KEXEC -Wall -DSYS_CALL_TABLE=0x$(SYS_CALL_TABLE) -DKERNEL_RESTART_PREPARE=0x$(KERNEL_RESTART_PREPARE)
obj-m += kexec_load.o
kexec_load-objs := kexec.o machine_kexec.o mmu.o sys.o core.o relocate_kernel.o \
obj-m += kexec_load.o
kexec_load-objs := kexec.o machine_kexec.o mmu.o sys.o core.o relocate_kernel.o \
static int __init kexec_module_init(void)
{
static int __init kexec_module_init(void)
{
sys_call_table=(void **)find_sys_call_table();
if(sys_call_table==NULL) {
printk(KERN_ERR "Cannot find the system call address\n");
sys_call_table=(void **)find_sys_call_table();
if(sys_call_table==NULL) {
printk(KERN_ERR "Cannot find the system call address\n");
}
printk(KERN_INFO "kexec: Found sys_call_table at: %p\n", sys_call_table);
}
printk(KERN_INFO "kexec: Found sys_call_table at: %p\n", sys_call_table);
- //sys_call_table=(void **)0xc003d004;
- sys_call_table=(void **)0xc00350c4;
+ sys_call_table=(void **)SYS_CALL_TABLE;
printk(KERN_INFO "kexec: Force sys_call_table at: %p\n", sys_call_table);
/* Set kexec_load() syscall. */
printk(KERN_INFO "kexec: Force sys_call_table at: %p\n", sys_call_table);
/* Set kexec_load() syscall. */
void kernel_restart_prepare(char *cmd)
{
void kernel_restart_prepare(char *cmd)
{
-#warning assuming kernel_restart_prepare is at 0xc00779cc
- void (*original_kernel_restart_prepare)(char *) = (void (*)(char *))0xc00779cc;
+ void (*original_kernel_restart_prepare)(char *) = (void (*)(char *))KERNEL_RESTART_PREPARE;
return original_kernel_restart_prepare(cmd);
#if 0
register_reboot_notifier(&dummy_notifier_reboot);
return original_kernel_restart_prepare(cmd);
#if 0
register_reboot_notifier(&dummy_notifier_reboot);