X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/d26ffc64f583ab2d29df48f13518685602bc8832..d9a64523371fa019c4575bb400cbbc3a50ac9903:/osfmk/arm64/pcb.c diff --git a/osfmk/arm64/pcb.c b/osfmk/arm64/pcb.c index a6fa9154b..d8809b38f 100644 --- a/osfmk/arm64/pcb.c +++ b/osfmk/arm64/pcb.c @@ -61,6 +61,7 @@ #include <sys/kdebug.h> + #define USER_SS_ZONE_ALLOC_SIZE (0x4000) extern int debug_task; @@ -160,7 +161,7 @@ machine_thread_create( thread->machine.upcb = &thread->machine.contextData->ss; thread->machine.uNeon = &thread->machine.contextData->ns; - if (task_has_64BitAddr(task)) { + if (task_has_64Bit_data(task)) { thread->machine.upcb->ash.flavor = ARM_SAVED_STATE64; thread->machine.upcb->ash.count = ARM_SAVED_STATE64_COUNT; thread->machine.uNeon->nsh.flavor = ARM_NEON_SAVED_STATE64; @@ -309,7 +310,7 @@ machine_stack_attach( savestate->lr = (uintptr_t)thread_continue; savestate->sp = thread->machine.kstackptr; savestate->cpsr = PSR64_KERNEL_DEFAULT; - machine_stack_attach_kprintf("thread = %x pc = %x, sp = %x\n", thread, savestate->lr, savestate->sp); + machine_stack_attach_kprintf("thread = %p pc = %llx, sp = %llx\n", thread, savestate->lr, savestate->sp); } @@ -357,51 +358,15 @@ machine_stack_handoff( */ void call_continuation( - thread_continue_t continuation, - void *parameter, - wait_result_t wresult) + thread_continue_t continuation, + void *parameter, + wait_result_t wresult, + boolean_t enable_interrupts) { #define call_continuation_kprintf(x...) /* kprintf("call_continuation_kprintf:" x) */ call_continuation_kprintf("thread = %p continuation = %p, stack = %p\n", current_thread(), continuation, current_thread()->machine.kstackptr); - Call_continuation(continuation, parameter, wresult, current_thread()->machine.kstackptr); -} - -/* Setting breakpoints in EL1 is effectively a KTRR bypass. The ability to do so is - * controlled by MDSCR.KDE. The MSR to set MDSCR must be present to allow - * self-hosted user mode debug. Any checks before the MRS can be skipped with ROP, - * so we need to put the checks after the MRS where they can't be skipped. That - * still leaves a small window if a breakpoint is set on the instruction - * immediately after the MRS. To handle that, we also do a check and then set of - * the breakpoint control registers. This allows us to guarantee that a given - * core will never have both KDE set and a breakpoint targeting EL1. - * - * If KDE gets set, unset it and then panic */ -static void -update_mdscr(uint64_t clear, uint64_t set) -{ - uint64_t result = 0; - uint64_t tmp1, tmp2; - __asm__ volatile( - "mrs %[reg], MDSCR_EL1\n" - "bic %[reg], %[reg], %[clear]\n" - "orr %[reg], %[reg], %[set]\n" - "1:\n" - "bic %[reg], %[reg], #0x2000\n" - "msr MDSCR_EL1, %[reg]\n" -#if defined(CONFIG_KERNEL_INTEGRITY) - /* verify KDE didn't get set (including via ROP) - * If set, clear it and then panic */ - "ands %[tmp], %[reg], #0x2000\n" - "orr %[res], %[res], %[tmp]\n" - "bne 1b\n" -#endif - : [res] "+r" (result), [tmp] "=r" (tmp1), [reg] "=r" (tmp2) - : [clear] "r" (clear), [set] "r" (set) : "x0"); -#if defined(CONFIG_KERNEL_INTEGRITY) - if (result) - panic("MDSCR.KDE was set: %llx %llx %llx", tmp1, tmp2, result); -#endif + Call_continuation(continuation, parameter, wresult, enable_interrupts); } #define SET_DBGBCRn(n, value, accum) \ @@ -794,7 +759,7 @@ void arm_debug_set(arm_debug_state_t *debug_state) break; } } else { - if (thread_is_64bit(current_thread())) + if (thread_is_64bit_data(current_thread())) arm_debug_set64(debug_state); else arm_debug_set32(debug_state); @@ -898,7 +863,7 @@ machine_thread_set_tsd_base( return KERN_INVALID_ARGUMENT; } - if (thread_is_64bit(thread)) { + if (thread_is_64bit_addr(thread)) { if (tsd_base > vm_map_max(thread->map)) tsd_base = 0ULL; } else {