--- zzzz-none-000/linux-4.1.38/arch/arm/kernel/module.c 2017-01-18 18:48:06.000000000 +0000 +++ bcm63-7582-715/linux-4.1.38/arch/arm/kernel/module.c 2020-11-25 10:06:48.000000000 +0000 @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -38,12 +39,56 @@ #endif #ifdef CONFIG_MMU + +#if !defined(CONFIG_AVM_ENHANCED) void *module_alloc(unsigned long size) { return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, GFP_KERNEL, PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE, __builtin_return_address(0)); } +#else /*--- if !defined(CONFIG_AVM_ENHANCED) ---*/ +/*------------------------------------------------------------------------------------------*\ +\*------------------------------------------------------------------------------------------*/ +void *module_alloc(unsigned long size, char *name, enum _module_alloc_type_ type __attribute__ ((unused))) { + void *ptr; + ptr = (void *)module_alloc_size_list_alloc(size, name, type); + if(ptr) { + return ptr; + } + switch(type) { + case module_alloc_type_init: + ptr = __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, GFP_KERNEL, PAGE_KERNEL_EXEC, 0, + NUMA_NO_NODE, (void *)__builtin_return_address(0)); + break; + case module_alloc_type_core: + /*--- ptr = (void *)module_alloc_size_list_alloc(size, name, type); ---*/ + /*--- if(ptr == NULL) { ---*/ + ptr = __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, GFP_KERNEL, PAGE_KERNEL_EXEC, 0, + NUMA_NO_NODE, (void *)__builtin_return_address(0)); + /*--- } ---*/ + break; + default: + case module_alloc_type_page: + ptr = __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, GFP_KERNEL, PAGE_KERNEL_EXEC, 0, + NUMA_NO_NODE, (void *)__builtin_return_address(0)); + break; + } + /*--- do_memory_check(); ---*/ + return ptr; +} + +/*--------------------------------------------------------------------------------*\ + Free memory returned from module_alloc +\*--------------------------------------------------------------------------------*/ +void module_memfree(void *module_region) { + if(module_alloc_size_list_free((unsigned long)module_region) == 0) { + return; + } + vfree(module_region); + return; +} +#endif/*--- #else ---*//*--- if !defined(CONFIG_AVM_ENHANCED) ---*/ #endif int @@ -318,6 +363,10 @@ maps[ARM_SEC_UNLIKELY].unw_sec = s; else if (strcmp(".ARM.exidx.text.hot", secname) == 0) maps[ARM_SEC_HOT].unw_sec = s; + else if (strcmp(".ARM.exidx.text.fastpath", secname) == 0) + maps[ARM_SEC_FASTPATH].unw_sec = s; + else if (strcmp(".ARM.exidx.text.fastpath_host", secname) == 0) + maps[ARM_SEC_FASTPATH_HOST].unw_sec = s; else if (strcmp(".init.text", secname) == 0) maps[ARM_SEC_INIT].txt_sec = s; else if (strcmp(".text", secname) == 0) @@ -328,6 +377,10 @@ maps[ARM_SEC_UNLIKELY].txt_sec = s; else if (strcmp(".text.hot", secname) == 0) maps[ARM_SEC_HOT].txt_sec = s; + else if (strcmp(".text.fastpath", secname) == 0) + maps[ARM_SEC_FASTPATH].txt_sec = s; + else if (strcmp(".text.fastpath_host", secname) == 0) + maps[ARM_SEC_FASTPATH_HOST].txt_sec = s; } for (i = 0; i < ARM_SEC_MAX; i++)