@@ -36,19 +36,15 @@ __asm__(
3636 ".globl _set_vbar_el1\n"
3737 ".globl __enable_interrupts\n"
3838 ".globl __disable_interrupts\n"
39- ".globl _get_mpidr\n"
4039 ".globl _get_migsts\n"
4140 ".globl _set_migsts\n"
42- ".globl _get_mmfr0\n"
4341 ".globl _invalidate_icache\n"
4442 ".globl _enable_mmu_el1\n"
4543 ".globl _disable_mmu_el1\n"
4644 ".globl _get_ticks\n"
4745 ".globl _panic_new_fp\n"
4846 ".globl _copy_safe_internal\n"
4947 ".globl _copy_retn\n"
50- ".globl _pan_on\n"
51- ".globl _pan_off\n"
5248 ".globl _cache_invalidate\n"
5349 ".globl _cache_clean_and_invalidate\n"
5450 ".globl _cache_clean\n"
@@ -78,18 +74,12 @@ __asm__(
7874 " isb\n"
7975 " ret\n"
8076
81- "_get_mpidr:\n"
82- " mrs x0, MPIDR_EL1\n"
83- " ret\n"
8477 "_get_migsts:\n"
8578 " mrs x0, S3_4_c15_c0_4\n"
8679 " ret\n"
8780 "_set_migsts:\n"
8881 " msr S3_4_c15_c0_4, x0\n"
8982 " ret\n"
90- "_get_mmfr0:\n"
91- " mrs x0, id_aa64mmfr0_el1\n"
92- " ret\n"
9383 "_invalidate_icache:\n"
9484 " dsb ish\n"
9585 " ic iallu\n"
@@ -136,12 +126,6 @@ __asm__(
136126 " isb sy\n"
137127 " mrs x0, cntpct_el0\n"
138128 " ret\n"
139- "_pan_on:\n"
140- ".long 0xd500419f\n"
141- " ret\n"
142- "_pan_off:\n"
143- ".long 0xd500409f\n"
144- " ret\n"
145129
146130 "_panic_new_fp:\n"
147131 " mov x29, 0\n"
@@ -231,31 +215,40 @@ __asm__(
231215 " ret\n"
232216);
233217
218+ uint64_t exception_stack [0x4000 /8 ] __attribute__((aligned (0x10 ))) = {};
219+ uint64_t sched_stack [0x4000 /8 ] __attribute__((aligned (0x10 ))) = {};
220+
234221extern void copy_retn (void );
235- extern size_t copy_trap_internal (void * dest , void * src , size_t size );
236- uint64_t exception_stack [0x4000 /8 ] = {};
237- uint64_t sched_stack [0x4000 /8 ] = {};
238- size_t memcpy_trap (void * dest , void * src , size_t size ) {
222+ extern size_t copy_trap_internal (void * dest , void * src , size_t size );
223+ size_t memcpy_trap (void * dest , void * src , size_t size )
224+ {
239225 disable_interrupts ();
240- if (!task_current ()) panic ("memcpy_trap requires task_current() to be populated" );
241- if (task_current ()-> fault_catch ) panic ("memcpy_trap called with fault hook already populated" );
242- task_current ()-> fault_catch = copy_retn ;
243- uint64_t ID_MMFR3_EL1 ;
244- asm volatile ("mrs %0, ID_MMFR3_EL1" : "=r" (ID_MMFR3_EL1 ));
245226
246- if (ID_MMFR3_EL1 & 0xF0000 ) // PAN exists!
227+ struct task * t = task_current ();
228+ if (!t )
229+ {
230+ panic ("memcpy_trap requires task_current() to be populated" );
231+ }
232+ if (t -> fault_catch )
233+ {
234+ panic ("memcpy_trap called with fault hook already populated" );
235+ }
236+ t -> fault_catch = copy_retn ;
237+
238+ size_t retn ;
239+ if ((__builtin_arm_rsr64 ("id_aa64mmfr1_el1" ) & 0xf00000 ) != 0 && __builtin_arm_rsr64 ("s3_0_c4_c2_3" ) != 0 ) // PAN
247240 {
248- extern volatile void pan_off (void );
249- pan_off ();
241+ __asm__ volatile (".4byte 0xd500409f" ); // msr pan, 0
242+ retn = copy_trap_internal (dest , src , size );
243+ __asm__ volatile (".4byte 0xd500419f" ); // msr pan, 1
250244 }
251- size_t retn = copy_trap_internal (dest , src , size );
252- if (ID_MMFR3_EL1 & 0xF0000 ) // PAN exists!
245+ else
253246 {
254- extern volatile void pan_on (void );
255- pan_on ();
247+ retn = copy_trap_internal (dest , src , size );
256248 }
257249
258- task_current ()-> fault_catch = NULL ;
250+ t -> fault_catch = NULL ;
251+
259252 enable_interrupts ();
260253 return retn ;
261254}
0 commit comments