Browse Source

Merge branch 'mylai-mtk-zicfilp-upstream'

pull/328/head
Andrew Waterman 2 years ago
parent
commit
54e2005dc8
  1. 37
      machine/mentry.S
  2. 3
      machine/minit.c
  3. 16
      pk/handlers.c
  4. 9
      pk/pk.c

37
machine/mentry.S

@ -8,27 +8,30 @@
.align 6 .align 6
trap_table: trap_table:
#define BAD_TRAP_VECTOR 0 #define BAD_TRAP_VECTOR 0
.dc.a bad_trap /* 00 */ .dc.a bad_trap
.dc.a pmp_trap /* 01 */ .dc.a pmp_trap
.dc.a illegal_insn_trap /* 02 */ .dc.a illegal_insn_trap
.dc.a bad_trap /* 03 */ .dc.a bad_trap
.dc.a misaligned_load_trap /* 04 */ .dc.a misaligned_load_trap
.dc.a pmp_trap /* 05 */ .dc.a pmp_trap
.dc.a misaligned_store_trap /* 06 */ .dc.a misaligned_store_trap
.dc.a pmp_trap /* 07 */ .dc.a pmp_trap
.dc.a bad_trap /* 08 */ .dc.a bad_trap
.dc.a mcall_trap /* 09 */ .dc.a mcall_trap
.dc.a bad_trap /* 10 */ .dc.a bad_trap
#ifdef BBL_BOOT_MACHINE #ifdef BBL_BOOT_MACHINE
.dc.a mcall_trap /* 11 */ .dc.a mcall_trap
#else #else
.dc.a bad_trap /* 11 */ .dc.a bad_trap
#endif /* BBL_BOOT_MACHINE */ #endif /* BBL_BOOT_MACHINE */
.dc.a bad_trap /* 12 */ .dc.a bad_trap
#define TRAP_FROM_MACHINE_MODE_VECTOR 13 #define TRAP_FROM_MACHINE_MODE_VECTOR 13
.dc.a __trap_from_machine_mode /* 13 */ .dc.a __trap_from_machine_mode
.dc.a bad_trap /* 14 */ .dc.a bad_trap
.dc.a bad_trap /* 15 */ .dc.a bad_trap
/* 16 */ .dc.a bad_trap
/* 17 */ .dc.a bad_trap
/* 18 */ .dc.a bad_trap
.option norvc .option norvc
.section .text.init,"ax",@progbits .section .text.init,"ax",@progbits

3
machine/minit.c

@ -79,7 +79,8 @@ static void delegate_traps()
(1U << CAUSE_BREAKPOINT) | (1U << CAUSE_BREAKPOINT) |
(1U << CAUSE_LOAD_PAGE_FAULT) | (1U << CAUSE_LOAD_PAGE_FAULT) |
(1U << CAUSE_STORE_PAGE_FAULT) | (1U << CAUSE_STORE_PAGE_FAULT) |
(1U << CAUSE_USER_ECALL); (1U << CAUSE_USER_ECALL) |
(1U << CAUSE_SOFTWARE_CHECK_FAULT);
write_csr(mideleg, interrupts); write_csr(mideleg, interrupts);
write_csr(medeleg, exceptions); write_csr(medeleg, exceptions);

16
pk/handlers.c

@ -90,6 +90,21 @@ static void handle_interrupt(trapframe_t* tf)
clear_csr(sip, SIP_SSIP); clear_csr(sip, SIP_SSIP);
} }
static void handle_software_check_fault(trapframe_t* tf)
{
dump_tf(tf);
const uint64_t stval = read_csr(stval);
switch (stval) {
case LANDING_PAD_FAULT:
panic("Invalid landing pad!");
break;
default:
panic("Software check fault: unhandled stval: %d", stval);
break;
}
}
void handle_trap(trapframe_t* tf) void handle_trap(trapframe_t* tf)
{ {
if ((intptr_t)tf->cause < 0) if ((intptr_t)tf->cause < 0)
@ -110,6 +125,7 @@ void handle_trap(trapframe_t* tf)
[CAUSE_MISALIGNED_STORE] = handle_misaligned_store, [CAUSE_MISALIGNED_STORE] = handle_misaligned_store,
[CAUSE_LOAD_PAGE_FAULT] = handle_fault_load, [CAUSE_LOAD_PAGE_FAULT] = handle_fault_load,
[CAUSE_STORE_PAGE_FAULT] = handle_fault_store, [CAUSE_STORE_PAGE_FAULT] = handle_fault_store,
[CAUSE_SOFTWARE_CHECK_FAULT] = handle_software_check_fault,
}; };
kassert(tf->cause < ARRAY_SIZE(trap_handlers) && trap_handlers[tf->cause]); kassert(tf->cause < ARRAY_SIZE(trap_handlers) && trap_handlers[tf->cause]);

9
pk/pk.c

@ -13,6 +13,7 @@
elf_info current; elf_info current;
long disabled_hart_mask; long disabled_hart_mask;
bool zicfilp_enabled;
static void help() static void help()
{ {
@ -22,6 +23,7 @@ static void help()
printk(" -h, --help Print this help message\n"); printk(" -h, --help Print this help message\n");
printk(" -p Disable on-demand program paging\n"); printk(" -p Disable on-demand program paging\n");
printk(" -s Print cycles upon termination\n"); printk(" -s Print cycles upon termination\n");
printk(" --zicfilp Enable Zicfilp CFI mechanism for user program\n");
shutdown(0); shutdown(0);
} }
@ -54,6 +56,11 @@ static void handle_option(const char* arg)
return; return;
} }
if (strcmp(arg, "--zicfilp") == 0) {
zicfilp_enabled = true;
return;
}
panic("unrecognized option: `%s'", arg); panic("unrecognized option: `%s'", arg);
suggest_help(); suggest_help();
} }
@ -177,6 +184,8 @@ static void run_loaded_program(size_t argc, char** argv, uintptr_t kstack_top)
init_tf(&tf, current.entry, stack_top); init_tf(&tf, current.entry, stack_top);
__riscv_flush_icache(); __riscv_flush_icache();
write_csr(sscratch, kstack_top); write_csr(sscratch, kstack_top);
if (zicfilp_enabled)
set_csr(senvcfg, SENVCFG_LPE);
start_user(&tf); start_user(&tf);
} }

Loading…
Cancel
Save