Skip to content

Commit 8d9ad65

Browse files
committed
Attempt a fix for memcpy_trap
1 parent 4c989fe commit 8d9ad65

File tree

3 files changed

+34
-40
lines changed

3 files changed

+34
-40
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ ifdef DEV_BUILD
112112
endif
113113

114114
# Pongo options
115-
PONGO_LD_FLAGS ?= -static -L$(LIB)/fixup -lc -Wl,-preload -Wl,-no_uuid -Wl,-e,start -Wl,-order_file,$(SRC)/sym_order.txt -Wl,-image_base,0x100000000 -Wl,-sectalign,__DATA,__common,0x8 -Wl,-segalign,0x4000 $(PONGO_LDFLAGS)
115+
PONGO_LD_FLAGS ?= -static -L$(LIB)/fixup -lc -Wl,-preload -Wl,-no_uuid -Wl,-e,start -Wl,-order_file,$(SRC)/sym_order.txt -Wl,-image_base,0x100000000 -Wl,-sectalign,__DATA,__common,0x10 -Wl,-segalign,0x4000 $(PONGO_LDFLAGS)
116116
PONGO_CC_FLAGS ?= -Os -moutline -DPONGO_VERSION='"$(PONGO_VERSION)"' -DPONGO_BUILD='"$(PONGO_BUILD)"' -DPONGO_PRIVATE=1 -I$(SRC)/lib -I$(INC) -Iapple-include -I$(SRC)/kernel -I$(SRC)/drivers $(PONGO_LD_FLAGS) $(PONGO_CFLAGS)
117117

118118
# KPF options

src/kernel/lowlevel.c

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
234221
extern 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
}

src/kernel/pongo.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,9 +454,7 @@ extern uint32_t exception_vector[];
454454
extern void set_vbar_el1(uint64_t vec);
455455
extern void rebase_pc(uint64_t vec);
456456
extern void rebase_sp(uint64_t vec);
457-
extern uint64_t get_mmfr0(void);
458457
extern uint64_t get_migsts(void);
459-
extern uint64_t get_mpidr(void);
460458
extern void set_migsts(uint64_t val);
461459
extern void enable_mmu_el1(uint64_t ttbr0, uint64_t tcr, uint64_t mair, uint64_t ttbr1);
462460
extern void disable_mmu_el1(void);
@@ -467,13 +465,16 @@ extern uint64_t linear_kvm_alloc(uint32_t size);
467465
extern void _command_register_internal(const char* name, const char* desc, void (*cb)(const char* cmd, char* args), bool hidden);
468466
static inline _Bool is_16k(void)
469467
{
470-
return ((get_mmfr0() >> 20) & 0xf) == 0x1;
468+
return ((__builtin_arm_rsr64("id_aa64mmfr0_el1") >> 20) & 0xf) == 0x1;
471469
}
472470
static inline void flush_tlb(void)
473471
{
474-
__asm__ volatile("isb");
475-
__asm__ volatile("tlbi vmalle1\n");
476-
__asm__ volatile("dsb sy");
472+
__asm__ volatile
473+
(
474+
"isb\n"
475+
"tlbi vmalle1\n"
476+
"dsb sy\n"
477+
);
477478
}
478479
extern void task_real_unlink(struct task* task);
479480
#include "hal/hal.h"

0 commit comments

Comments
 (0)