diff --git a/kernel/binder/Makefile b/kernel/binder/Makefile index 41e72e9..c6395da 100644 --- a/kernel/binder/Makefile +++ b/kernel/binder/Makefile @@ -1,14 +1,7 @@ -ccflags-y += -I$(src) - -ifneq ($(KERNELRELEASE),) +ccflags-y += -I$(src) -Wno-int-conversion obj-m := binder_linux.o binder_linux-y := deps.o binder.o -$(obj)/deps.o: $(src)/deps.h - -$(obj)/deps.h: $(src)/gen_deps.sh - sudo $(src)/gen_deps.sh > $@ -else KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build all: @@ -19,4 +12,3 @@ install: clean: rm -rf deps.h *.o *.ko *.mod.c *.symvers *.order .*.cmd .tmp_versions -endif diff --git a/kernel/binder/deps.c b/kernel/binder/deps.c index 3433ea7..b02684e 100644 --- a/kernel/binder/deps.c +++ b/kernel/binder/deps.c @@ -5,96 +5,125 @@ #include #include #include +#include -#include "deps.h" - -static struct vm_struct *(*get_vm_area_ptr)(unsigned long, unsigned long) = GET_VM_AREA; -static void (*zap_page_range_ptr)(struct vm_area_struct *, unsigned long, unsigned long, struct zap_details *) = ZAP_PAGE_RANGE; -static int (*map_kernel_range_noflush_ptr)(unsigned long start, unsigned long size, pgprot_t prot, struct page **pages) = MAP_KERNEL_RANGE_NOFLUSH; -static void (*unmap_kernel_range_ptr)(unsigned long, unsigned long) = UNMAP_KERNEL_RANGE; -static struct files_struct *(*get_files_struct_ptr)(struct task_struct *) = GET_FILES_STRUCT; -static void (*put_files_struct_ptr)(struct files_struct *) = PUT_FILES_STRUCT; -static struct sighand_struct *(*__lock_task_sighand_ptr)(struct task_struct *, unsigned long *) = __LOCK_TASK_SIGHAND; -static int (*__alloc_fd_ptr)(struct files_struct *files, unsigned start, unsigned end, unsigned flags) = __ALLOC_FD; -static void (*__fd_install_ptr)(struct files_struct *files, unsigned int fd, struct file *file) = __FD_INSTALL; -static int (*__close_fd_ptr)(struct files_struct *files, unsigned int fd) = __CLOSE_FD; -static int (*can_nice_ptr)(const struct task_struct *, const int) = CAN_NICE; -static int (*security_binder_set_context_mgr_ptr)(struct task_struct *mgr) = SECURITY_BINDER_SET_CONTEXT_MGR; -static int (*security_binder_transaction_ptr)(struct task_struct *from, struct task_struct *to) = SECURITY_BINDER_TRANSACTION; -static int (*security_binder_transfer_binder_ptr)(struct task_struct *from, struct task_struct *to) = SECURITY_BINDER_TRANSFER_BINDER; -static int (*security_binder_transfer_file_ptr)(struct task_struct *from, struct task_struct *to, struct file *file) = SECURITY_BINDER_TRANSFER_FILE; +static struct vm_struct *(*get_vm_area_ptr)(unsigned long, unsigned long) = NULL; +static void (*zap_page_range_ptr)(struct vm_area_struct *, unsigned long, unsigned long, struct zap_details *) = NULL; +static int (*map_kernel_range_noflush_ptr)(unsigned long start, unsigned long size, pgprot_t prot, struct page **pages) = NULL; +static void (*unmap_kernel_range_ptr)(unsigned long, unsigned long) = NULL; +static struct files_struct *(*get_files_struct_ptr)(struct task_struct *) = NULL; +static void (*put_files_struct_ptr)(struct files_struct *) = NULL; +static struct sighand_struct *(*__lock_task_sighand_ptr)(struct task_struct *, unsigned long *) = NULL; +static int (*__alloc_fd_ptr)(struct files_struct *files, unsigned start, unsigned end, unsigned flags) = NULL; +static void (*__fd_install_ptr)(struct files_struct *files, unsigned int fd, struct file *file) = NULL; +static int (*__close_fd_ptr)(struct files_struct *files, unsigned int fd) = NULL; +static int (*can_nice_ptr)(const struct task_struct *, const int) = NULL; +static int (*security_binder_set_context_mgr_ptr)(struct task_struct *mgr) = NULL; +static int (*security_binder_transaction_ptr)(struct task_struct *from, struct task_struct *to) = NULL; +static int (*security_binder_transfer_binder_ptr)(struct task_struct *from, struct task_struct *to) = NULL; +static int (*security_binder_transfer_file_ptr)(struct task_struct *from, struct task_struct *to, struct file *file) = NULL; struct vm_struct *get_vm_area(unsigned long size, unsigned long flags) { + if (!get_vm_area_ptr) + get_vm_area_ptr = kallsyms_lookup_name("get_vm_area"); return get_vm_area_ptr(size, flags); } void zap_page_range(struct vm_area_struct *vma, unsigned long address, unsigned long size, struct zap_details *details) { + if (!zap_page_range_ptr) + zap_page_range_ptr = kallsyms_lookup_name("zap_page_range"); zap_page_range_ptr(vma, address, size, details); } int map_kernel_range_noflush(unsigned long start, unsigned long size, pgprot_t prot, struct page **pages) { + if (!map_kernel_range_noflush_ptr) + map_kernel_range_noflush_ptr = kallsyms_lookup_name("map_kernel_range_noflush"); return map_kernel_range_noflush_ptr(start, size, prot, pages); } void unmap_kernel_range(unsigned long addr, unsigned long size) { + if (!unmap_kernel_range_ptr) + unmap_kernel_range_ptr = kallsyms_lookup_name("unmap_kernel_range"); unmap_kernel_range_ptr(addr, size); } struct files_struct *get_files_struct(struct task_struct *task) { + if (!get_files_struct_ptr) + get_files_struct_ptr = kallsyms_lookup_name("get_files_struct"); return get_files_struct_ptr(task); } void put_files_struct(struct files_struct *files) { + if (!put_files_struct_ptr) + put_files_struct_ptr = kallsyms_lookup_name("put_files_struct"); put_files_struct_ptr(files); } struct sighand_struct *__lock_task_sighand(struct task_struct *tsk, unsigned long *flags) { + if (!__lock_task_sighand_ptr) + __lock_task_sighand_ptr = kallsyms_lookup_name("__lock_task_sighand"); return __lock_task_sighand_ptr(tsk, flags); } int __alloc_fd(struct files_struct *files, unsigned start, unsigned end, unsigned flags) { + if (!__alloc_fd_ptr) + __alloc_fd_ptr = kallsyms_lookup_name("__alloc_fd"); return __alloc_fd_ptr(files, start, end, flags); } void __fd_install(struct files_struct *files, unsigned int fd, struct file *file) { + if (!__fd_install_ptr) + __fd_install_ptr = kallsyms_lookup_name("__fd_install"); __fd_install_ptr(files, fd, file); } int __close_fd(struct files_struct *files, unsigned int fd) { + if (!__close_fd_ptr) + __close_fd_ptr = kallsyms_lookup_name("__close_fd_ptr"); return __close_fd_ptr(files, fd); } int can_nice(const struct task_struct *p, const int nice) { + if (!can_nice_ptr) + can_nice_ptr = kallsyms_lookup_name("can_nice"); return can_nice_ptr(p, nice); } int security_binder_set_context_mgr(struct task_struct *mgr) { + if (!security_binder_set_context_mgr_ptr) + security_binder_set_context_mgr_ptr = kallsyms_lookup_name("security_binder_set_context_mgr"); return security_binder_set_context_mgr_ptr(mgr); } int security_binder_transaction(struct task_struct *from, struct task_struct *to) { + if (!security_binder_transaction_ptr) + security_binder_transaction_ptr = kallsyms_lookup_name("security_binder_transaction"); return security_binder_transaction_ptr(from, to); } int security_binder_transfer_binder(struct task_struct *from, struct task_struct *to) { + if (!security_binder_transfer_binder_ptr) + security_binder_transfer_binder_ptr = kallsyms_lookup_name("security_binder_transfer_binder"); return security_binder_transfer_binder_ptr(from, to); } int security_binder_transfer_file(struct task_struct *from, struct task_struct *to, struct file *file) { + if (!security_binder_transfer_file_ptr) + security_binder_transfer_file_ptr = kallsyms_lookup_name("security_binder_transfer_file"); return security_binder_transfer_file_ptr(from, to, file); } diff --git a/kernel/binder/gen_deps.sh b/kernel/binder/gen_deps.sh deleted file mode 100755 index f9ec9a1..0000000 --- a/kernel/binder/gen_deps.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh - -SYMS="get_vm_area zap_page_range map_kernel_range_noflush unmap_kernel_range "\ -"get_files_struct put_files_struct __lock_task_sighand "\ -"__alloc_fd __fd_install __close_fd can_nice "\ -"security_binder_set_context_mgr security_binder_transaction "\ -"security_binder_transfer_binder security_binder_transfer_file" - -for sym in $SYMS; do - addr=`cat /proc/kallsyms | grep -Ee '^[0-9a-f]+ T '$sym'$' | sed -e 's/\s.*$//g'` - if [ a$addr = 'a' ]; then - echo "Error: can't find symbol $sym" - exit 1 - fi - - name=`echo $sym | tr '[:lower:]' '[:upper:]'` - echo "#define $name\t(void *)0x$addr" -done