27
27
28
28
#define pr_fmt (fmt ) "MPY: ffi: " fmt
29
29
30
+ #include <linux/version.h>
30
31
#include <linux/kallsyms.h>
31
32
#include <linux/module.h>
32
33
#include <linux/kprobes.h>
@@ -779,6 +780,17 @@ STATIC const mp_obj_type_t callback_type = {
779
780
.locals_dict = (void * )& callback_locals_dict ,
780
781
};
781
782
783
+ STATIC void * __vmalloc_exec (size_t size ) {
784
+ // in 88dca4ca5a the pgprot parameter was removed, so we'll call the lower function.
785
+ #if LINUX_VERSION_CODE < KERNEL_VERSION (5 , 7 , 0 )
786
+ return __vmalloc (size , GFP_KERNEL , PAGE_KERNEL_EXEC );
787
+ #else
788
+ return __vmalloc_node_range (size , 1 , VMALLOC_START , VMALLOC_END ,
789
+ GFP_KERNEL , PAGE_KERNEL_EXEC , 0 , NUMA_NO_NODE ,
790
+ __builtin_return_address (0 ));
791
+ #endif
792
+ }
793
+
782
794
STATIC mp_obj_t kernel_ffi_callback (mp_obj_t func ) {
783
795
size_t nargs = check_func_for_cb (func , false);
784
796
@@ -799,7 +811,7 @@ STATIC mp_obj_t kernel_ffi_callback(mp_obj_t func) {
799
811
u8 push_rax [1 ];
800
812
u8 movabs_rax_parameter [10 ];
801
813
u8 ret [1 ];
802
- } __attribute__((packed )) * trampoline = __vmalloc (PAGE_SIZE , GFP_KERNEL , PAGE_KERNEL_EXEC );
814
+ } __attribute__((packed )) * trampoline = __vmalloc_exec (PAGE_SIZE );
803
815
if (NULL == trampoline ) {
804
816
mp_raise_OSError (0 );
805
817
}
@@ -834,7 +846,7 @@ STATIC mp_obj_t kernel_ffi_callback(mp_obj_t func) {
834
846
0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
835
847
};
836
848
837
- u8 * trampoline = __vmalloc (PAGE_SIZE , GFP_KERNEL , PAGE_KERNEL_EXEC );
849
+ u8 * trampoline = __vmalloc_exec (PAGE_SIZE );
838
850
if (NULL == trampoline ) {
839
851
mp_raise_OSError (0 );
840
852
}
0 commit comments