diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2013-07-26 20:25:50 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2013-07-26 20:25:50 -0700 |
commit | 3168b8a9049d062192ea20e4b33fed6286e84220 (patch) | |
tree | 157217cb2107615c3c74fc8b0af6988f6f6f571c | |
parent | 80a4afcb47c0b82b36bd818b4c47e5dfd506ae77 (diff) | |
download | riscv-pk-3168b8a9049d062192ea20e4b33fed6286e84220.zip riscv-pk-3168b8a9049d062192ea20e4b33fed6286e84220.tar.gz riscv-pk-3168b8a9049d062192ea20e4b33fed6286e84220.tar.bz2 |
New supervisor mode
-rw-r--r-- | pk/fp.c | 12 | ||||
-rw-r--r-- | pk/handlers.c | 2 | ||||
-rw-r--r-- | pk/init.c | 2 | ||||
-rw-r--r-- | pk/pcr.h | 57 | ||||
-rw-r--r-- | pk/pk.S | 9 | ||||
-rw-r--r-- | pk/riscv-opc.h | 294 | ||||
-rw-r--r-- | pk/vm.c | 34 |
7 files changed, 76 insertions, 334 deletions
@@ -91,13 +91,13 @@ int emulate_fp(trapframe_t* tf) validate_address(tf, effective_address_store, 8, 1); *(uint64_t*)effective_address_store = frs2d; } - else if(IS_INSN(MFTX_S)) + else if(IS_INSN(FMV_X_S)) XRDR = frs1s; - else if(IS_INSN(MFTX_D)) + else if(IS_INSN(FMV_X_D)) XRDR = frs1d; - else if(IS_INSN(MXTF_S)) + else if(IS_INSN(FMV_S_X)) DO_WRITEBACK(0, XRS1); - else if(IS_INSN(MXTF_D)) + else if(IS_INSN(FMV_D_X)) DO_WRITEBACK(1, XRS1); else if(IS_INSN(FSGNJ_S)) DO_WRITEBACK(0, (frs1s &~ (uint32_t)INT32_MIN) | (frs2s & (uint32_t)INT32_MIN)); @@ -210,8 +210,8 @@ int emulate_fp(trapframe_t* tf) #define STR(x) XSTR(x) #define XSTR(x) #x -#define PUT_FP_REG(which, type, val) asm("mxtf." STR(type) " f" STR(which) ",%0" : : "r"(val)) -#define GET_FP_REG(which, type, val) asm("mftx." STR(type) " %0,f" STR(which) : "=r"(val)) +#define PUT_FP_REG(which, type, val) asm("fmv." STR(type) ".x f" STR(which) ",%0" : : "r"(val)) +#define GET_FP_REG(which, type, val) asm("fmv.x." STR(type) " %0,f" STR(which) : "=r"(val)) #define LOAD_FP_REG(which, type, val) asm("fl" STR(type) " f" STR(which) ",%0" : : "m"(val)) #define STORE_FP_REG(which, type, val) asm("fs" STR(type) " f" STR(which) ",%0" : "=m"(val) : : "memory") diff --git a/pk/handlers.c b/pk/handlers.c index 7493ac9..d0ca7f5 100644 --- a/pk/handlers.c +++ b/pk/handlers.c @@ -126,7 +126,7 @@ static void handle_syscall(trapframe_t* tf) void handle_trap(trapframe_t* tf) { - setpcr(PCR_SR, SR_ET); + setpcr(PCR_SR, SR_EI); typedef void (*trap_handler)(trapframe_t*); @@ -16,7 +16,7 @@ void init_tf(trapframe_t* tf, long pc, long sp, int user64) memset(tf,0,sizeof(*tf)); if(sizeof(void*) != 8) kassert(!user64); - tf->sr = (mfpcr(PCR_SR) & (SR_IM | SR_S64 | SR_VM)) | SR_S | SR_EC; + tf->sr = (mfpcr(PCR_SR) & (SR_IM | SR_S64 | SR_VM)) | SR_S | SR_PEI; if(user64) tf->sr |= SR_U64; tf->gpr[14] = sp; @@ -3,33 +3,37 @@ #ifndef _RISCV_PCR_H #define _RISCV_PCR_H -#define SR_ET 0x00000001 -#define SR_EF 0x00000002 -#define SR_EV 0x00000004 -#define SR_EC 0x00000008 -#define SR_PS 0x00000010 -#define SR_S 0x00000020 -#define SR_U64 0x00000040 -#define SR_S64 0x00000080 -#define SR_VM 0x00000100 +#define SR_S 0x00000001 +#define SR_PS 0x00000002 +#define SR_EI 0x00000004 +#define SR_PEI 0x00000008 +#define SR_EF 0x00000010 +#define SR_U64 0x00000020 +#define SR_S64 0x00000040 +#define SR_VM 0x00000080 +#define SR_EV 0x00000100 #define SR_IM 0x00FF0000 -#define SR_ZERO ~(SR_ET|SR_EF|SR_EV|SR_EC|SR_PS|SR_S|SR_U64|SR_S64|SR_VM|SR_IM) +#define SR_IP 0xFF000000 +#define SR_ZERO ~(SR_S|SR_PS|SR_EI|SR_PEI|SR_EF|SR_U64|SR_S64|SR_VM|SR_EV|SR_IM|SR_IP) #define SR_IM_SHIFT 16 +#define SR_IP_SHIFT 24 #define PCR_SR 0 #define PCR_EPC 1 #define PCR_BADVADDR 2 #define PCR_EVEC 3 -#define PCR_COUNT 4 -#define PCR_COMPARE 5 -#define PCR_CAUSE 6 -#define PCR_PTBR 7 -#define PCR_SEND_IPI 8 -#define PCR_CLR_IPI 9 -#define PCR_COREID 10 -#define PCR_IMPL 11 -#define PCR_K0 12 -#define PCR_K1 13 +#define PCR_CAUSE 4 +#define PCR_PTBR 5 +#define PCR_ASID 6 +#define PCR_FATC 7 +#define PCR_COUNT 8 +#define PCR_COMPARE 9 +#define PCR_SEND_IPI 10 +#define PCR_CLR_IPI 11 +#define PCR_HARTID 12 +#define PCR_IMPL 13 +#define PCR_K0 14 +#define PCR_K1 15 #define PCR_VECBANK 18 #define PCR_VECCFG 19 #define PCR_RESET 29 @@ -37,6 +41,7 @@ #define PCR_FROMHOST 31 #define IRQ_IPI 5 +#define IRQ_HOST 6 #define IRQ_TIMER 7 #define CAUSE_MISALIGNED_FETCH 0 @@ -62,6 +67,18 @@ #define CAUSE_VECTOR_FAULT_LOAD 30 #define CAUSE_VECTOR_FAULT_STORE 31 +// page table entry (PTE) fields +#define PTE_V 0x001 // Entry is a page Table descriptor +#define PTE_T 0x002 // Entry is a page Table, not a terminal node +#define PTE_G 0x004 // Global +#define PTE_UR 0x008 // User Write permission +#define PTE_UW 0x010 // User Read permission +#define PTE_UX 0x020 // User eXecute permission +#define PTE_SR 0x040 // Supervisor Read permission +#define PTE_SW 0x080 // Supervisor Write permission +#define PTE_SX 0x100 // Supervisor eXecute permission +#define PTE_PERM (PTE_SR | PTE_SW | PTE_SX | PTE_UR | PTE_UW | PTE_UX) + #ifdef __riscv #ifdef __riscv64 @@ -14,11 +14,7 @@ _start: add a0, a0, %lo(trap_entry) mtpcr a0, ASM_CR(PCR_EVEC) -#ifdef __riscv64 - li a0, SR_S | SR_PS | SR_ET | SR_EC | SR_S64 -#else - li a0, SR_S | SR_PS | SR_ET | SR_EC -#endif + li a0, SR_S | SR_PS | SR_EI | SR_S64 or a1, a0, SR_EF | SR_EV mtpcr a1, ASM_CR(PCR_SR) mfpcr a1, ASM_CR(PCR_SR) @@ -33,5 +29,4 @@ _start: sw a2, %lo(have_vector)(a0) lui a0, %hi(boot) - jalr.j a0, %lo(boot) - #j boot + jalr a0, %lo(boot) diff --git a/pk/riscv-opc.h b/pk/riscv-opc.h index 19e20b9..90fb229 100644 --- a/pk/riscv-opc.h +++ b/pk/riscv-opc.h @@ -1,40 +1,20 @@ /* Automatically generated by parse-opcodes */ -#define MATCH_MOVN 0x6f7 -#define MASK_MOVN 0x1ffff -#define MATCH_VFSSTW 0x150f -#define MASK_VFSSTW 0x1ffff +#define MATCH_FMV_S_X 0x1e053 +#define MASK_FMV_S_X 0x3fffff #define MATCH_REMUW 0x7bb #define MASK_REMUW 0x1ffff #define MATCH_FMIN_D 0x180d3 #define MASK_FMIN_D 0x1ffff #define MATCH_LR_W 0x1012b #define MASK_LR_W 0x3fffff -#define MATCH_VLSTHU 0x128b -#define MASK_VLSTHU 0x1ffff -#define MATCH_C_SWSP 0x8 -#define MASK_C_SWSP 0x1f #define MATCH_BLTU 0x363 #define MASK_BLTU 0x3ff -#define MATCH_VLSEGSTWU 0xb0b -#define MASK_VLSEGSTWU 0xfff -#define MATCH_VVCFG 0x473 -#define MASK_VVCFG 0xf801ffff -#define MATCH_MOVZ 0x2f7 -#define MASK_MOVZ 0x1ffff -#define MATCH_C_LD 0x9 -#define MASK_C_LD 0x1f -#define MATCH_C_SRLI32 0xc19 -#define MASK_C_SRLI32 0x1c1f #define MATCH_FMIN_S 0x18053 #define MASK_FMIN_S 0x1ffff -#define MATCH_C_LW0 0x12 -#define MASK_C_LW0 0x801f #define MATCH_SLLIW 0x9b #define MASK_SLLIW 0x3f83ff #define MATCH_LB 0x3 #define MASK_LB 0x3ff -#define MATCH_VLWU 0x30b -#define MASK_VLWU 0x3fffff #define MATCH_FCVT_S_WU 0xf053 #define MASK_FCVT_S_WU 0x3ff1ff #define MATCH_FCVT_D_L 0xc0d3 @@ -49,10 +29,8 @@ #define MASK_ADD 0x1ffff #define MATCH_FCVT_D_S 0x100d3 #define MASK_FCVT_D_S 0x3ff1ff -#define MATCH_MFPCR 0x17b +#define MATCH_MFPCR 0xf3 #define MASK_MFPCR 0x3fffff -#define MATCH_C_FSD 0x18 -#define MASK_C_FSD 0x1f #define MATCH_FMAX_D 0x190d3 #define MASK_FMAX_D 0x1ffff #define MATCH_BNE 0xe3 @@ -61,118 +39,54 @@ #define MASK_RDCYCLE 0x7ffffff #define MATCH_FCVT_S_D 0x11053 #define MASK_FCVT_S_D 0x3ff1ff -#define MATCH_VLH 0x8b -#define MASK_VLH 0x3fffff #define MATCH_BGEU 0x3e3 #define MASK_BGEU 0x3ff -#define MATCH_VFLSTD 0x158b -#define MASK_VFLSTD 0x1ffff -#define MATCH_C_LI 0x0 -#define MASK_C_LI 0x1f #define MATCH_FADD_D 0xd3 #define MASK_FADD_D 0x1f1ff #define MATCH_SLTIU 0x193 #define MASK_SLTIU 0x3ff -#define MATCH_MTPCR 0x1fb +#define MATCH_MTPCR 0x73 #define MASK_MTPCR 0x1ffff -#define MATCH_VLB 0xb -#define MASK_VLB 0x3fffff -#define MATCH_STOP 0x177 -#define MASK_STOP 0xffffffff -#define MATCH_VLD 0x18b -#define MASK_VLD 0x3fffff -#define MATCH_C_SLLI 0x19 -#define MASK_C_SLLI 0x1c1f #define MATCH_BREAK 0xf7 #define MASK_BREAK 0xffffffff -#define MATCH_CFLUSH 0x2fb -#define MASK_CFLUSH 0xffffffff #define MATCH_FCVT_S_W 0xe053 #define MASK_FCVT_S_W 0x3ff1ff -#define MATCH_VFLSTW 0x150b -#define MASK_VFLSTW 0x1ffff #define MATCH_MUL 0x433 #define MASK_MUL 0x1ffff -#define MATCH_C_LW 0xa -#define MASK_C_LW 0x1f -#define MATCH_VXCPTEVAC 0x237b -#define MASK_VXCPTEVAC 0xf83fffff -#define MATCH_VLW 0x10b -#define MASK_VLW 0x3fffff -#define MATCH_VSSEGSTW 0x90f -#define MASK_VSSEGSTW 0xfff #define MATCH_AMOMINU_D 0x19ab #define MASK_AMOMINU_D 0x1ffff -#define MATCH_C_SDSP 0x6 -#define MASK_C_SDSP 0x1f -#define MATCH_UTIDX 0x1f7 -#define MASK_UTIDX 0x7ffffff #define MATCH_SRLI 0x293 #define MASK_SRLI 0x3f03ff -#define MATCH_C_SRLI 0x819 -#define MASK_C_SRLI 0x1c1f -#define MATCH_C_LDSP 0x4 -#define MASK_C_LDSP 0x1f -#define MATCH_C_FLW 0x14 -#define MASK_C_FLW 0x1f -#define MATCH_C_SRAI32 0x1419 -#define MASK_C_SRAI32 0x1c1f #define MATCH_AMOMINU_W 0x192b #define MASK_AMOMINU_W 0x1ffff #define MATCH_DIVUW 0x6bb #define MASK_DIVUW 0x1ffff #define MATCH_MULW 0x43b #define MASK_MULW 0x1ffff -#define MATCH_VSSEGSTD 0x98f -#define MASK_VSSEGSTD 0xfff #define MATCH_SRLW 0x2bb #define MASK_SRLW 0x1ffff -#define MATCH_VSSEGSTB 0x80f -#define MASK_VSSEGSTB 0xfff -#define MATCH_MFTX_D 0x1c0d3 -#define MASK_MFTX_D 0x3fffff #define MATCH_DIV 0x633 #define MASK_DIV 0x1ffff -#define MATCH_VTCFG 0xc73 -#define MASK_VTCFG 0xf801ffff -#define MATCH_MFTX_S 0x1c053 -#define MASK_MFTX_S 0x3fffff -#define MATCH_VSSEGSTH 0x88f -#define MASK_VSSEGSTH 0xfff -#define MATCH_VVCFGIVL 0xf3 -#define MASK_VVCFGIVL 0x3ff #define MATCH_J 0x67 #define MASK_J 0x7f #define MATCH_FENCE 0x12f #define MASK_FENCE 0x3ff -#define MATCH_VSW 0x10f -#define MASK_VSW 0x3fffff #define MATCH_FNMSUB_S 0x4b #define MASK_FNMSUB_S 0x1ff -#define MATCH_VFSSEGSTD 0xd8f -#define MASK_VFSSEGSTD 0xfff #define MATCH_FCVT_L_S 0x8053 #define MASK_FCVT_L_S 0x3ff1ff #define MATCH_FLE_S 0x17053 #define MASK_FLE_S 0x1ffff #define MATCH_FENCE_V_L 0x22f #define MASK_FENCE_V_L 0x3ff -#define MATCH_VSB 0xf -#define MASK_VSB 0x3fffff #define MATCH_MFFSR 0x1d053 #define MASK_MFFSR 0x7ffffff #define MATCH_FDIV_S 0x3053 #define MASK_FDIV_S 0x1f1ff -#define MATCH_VLSTBU 0x120b -#define MASK_VLSTBU 0x1ffff -#define MATCH_VSETVL 0x2f3 -#define MASK_VSETVL 0x3fffff #define MATCH_FLE_D 0x170d3 #define MASK_FLE_D 0x1ffff #define MATCH_FENCE_I 0xaf #define MASK_FENCE_I 0x3ff -#define MATCH_VLSEGBU 0x220b -#define MASK_VLSEGBU 0x1ffff #define MATCH_FNMSUB_D 0xcb #define MASK_FNMSUB_D 0x1ff #define MATCH_ADDW 0x3b @@ -183,16 +97,12 @@ #define MASK_XOR 0x1ffff #define MATCH_SUB 0x10033 #define MASK_SUB 0x1ffff -#define MATCH_ERET 0x27b +#define MATCH_ERET 0x273 #define MASK_ERET 0xffffffff #define MATCH_BLT 0x263 #define MASK_BLT 0x3ff -#define MATCH_VSSTW 0x110f -#define MASK_VSSTW 0x1ffff #define MATCH_MTFSR 0x1f053 #define MASK_MTFSR 0x3fffff -#define MATCH_VSSTH 0x108f -#define MASK_VSSTH 0x1ffff #define MATCH_SC_W 0x1052b #define MASK_SC_W 0x1ffff #define MATCH_REM 0x733 @@ -201,22 +111,14 @@ #define MASK_SRLIW 0x3f83ff #define MATCH_LUI 0x37 #define MASK_LUI 0x7f -#define MATCH_VSSTB 0x100f -#define MASK_VSSTB 0x1ffff #define MATCH_FCVT_S_LU 0xd053 #define MASK_FCVT_S_LU 0x3ff1ff -#define MATCH_VSSTD 0x118f -#define MASK_VSSTD 0x1ffff #define MATCH_ADDI 0x13 #define MASK_ADDI 0x3ff -#define MATCH_VFMST 0x1173 -#define MASK_VFMST 0x1ffff #define MATCH_MULH 0x4b3 #define MASK_MULH 0x1ffff #define MATCH_FMUL_S 0x2053 #define MASK_FMUL_S 0x1f1ff -#define MATCH_VLSEGSTHU 0xa8b -#define MASK_VLSEGSTHU 0xfff #define MATCH_SRAI 0x10293 #define MASK_SRAI 0x3f03ff #define MATCH_AMOAND_D 0x9ab @@ -243,38 +145,20 @@ #define MASK_FSGNJX_D 0x1ffff #define MATCH_SRA 0x102b3 #define MASK_SRA 0x1ffff -#define MATCH_C_LWSP 0x5 -#define MASK_C_LWSP 0x1f #define MATCH_BGE 0x2e3 #define MASK_BGE 0x3ff -#define MATCH_C_ADD3 0x1c -#define MASK_C_ADD3 0x31f #define MATCH_SRAIW 0x1029b #define MASK_SRAIW 0x3f83ff -#define MATCH_VSSEGD 0x218f -#define MASK_VSSEGD 0x1ffff #define MATCH_SRL 0x2b3 #define MASK_SRL 0x1ffff -#define MATCH_VENQCMD 0x2b7b -#define MASK_VENQCMD 0xf801ffff #define MATCH_FSUB_D 0x10d3 #define MASK_FSUB_D 0x1f1ff -#define MATCH_VFMTS 0x1973 -#define MASK_VFMTS 0x1ffff -#define MATCH_VENQIMM1 0x2f7b -#define MASK_VENQIMM1 0xf801ffff #define MATCH_FSGNJX_S 0x7053 #define MASK_FSGNJX_S 0x1ffff -#define MATCH_VFMSV 0x973 -#define MASK_VFMSV 0x3fffff -#define MATCH_VENQIMM2 0x337b -#define MASK_VENQIMM2 0xf801ffff +#define MATCH_FEQ_D 0x150d3 +#define MASK_FEQ_D 0x1ffff #define MATCH_FCVT_D_WU 0xf0d3 #define MASK_FCVT_D_WU 0x3ff1ff -#define MATCH_VXCPTRESTORE 0x77b -#define MASK_VXCPTRESTORE 0xf83fffff -#define MATCH_VMTS 0x1873 -#define MASK_VMTS 0x1ffff #define MATCH_OR 0x333 #define MASK_OR 0x1ffff #define MATCH_RDINSTRET 0xa77 @@ -283,44 +167,26 @@ #define MASK_FCVT_WU_D 0x3ff1ff #define MATCH_SUBW 0x1003b #define MASK_SUBW 0x1ffff -#define MATCH_JALR_C 0x6b -#define MASK_JALR_C 0x3ff #define MATCH_FMAX_S 0x19053 #define MASK_FMAX_S 0x1ffff #define MATCH_AMOMAXU_D 0x1dab #define MASK_AMOMAXU_D 0x1ffff -#define MATCH_C_SLLIW 0x1819 -#define MASK_C_SLLIW 0x1c1f -#define MATCH_JALR_J 0x16b -#define MASK_JALR_J 0x3ff -#define MATCH_C_FLD 0x15 -#define MASK_C_FLD 0x1f -#define MATCH_VLSTW 0x110b -#define MASK_VLSTW 0x1ffff -#define MATCH_VLSTH 0x108b -#define MASK_VLSTH 0x1ffff #define MATCH_XORI 0x213 #define MASK_XORI 0x3ff -#define MATCH_JALR_R 0xeb -#define MASK_JALR_R 0x3ff +#define MATCH_FDIV_D 0x30d3 +#define MASK_FDIV_D 0x1f1ff #define MATCH_AMOMAXU_W 0x1d2b #define MASK_AMOMAXU_W 0x1ffff #define MATCH_FCVT_WU_S 0xb053 #define MASK_FCVT_WU_S 0x3ff1ff -#define MATCH_VLSTB 0x100b -#define MASK_VLSTB 0x1ffff -#define MATCH_VLSTD 0x118b -#define MASK_VLSTD 0x1ffff -#define MATCH_C_LD0 0x8012 -#define MASK_C_LD0 0x801f #define MATCH_RDTIME 0x677 #define MASK_RDTIME 0x7ffffff #define MATCH_ANDI 0x393 #define MASK_ANDI 0x3ff -#define MATCH_CLEARPCR 0x7b +#define MATCH_CLEARPCR 0x1f3 #define MASK_CLEARPCR 0x3ff -#define MATCH_VENQCNT 0x377b -#define MASK_VENQCNT 0xf801ffff +#define MATCH_FMV_X_S 0x1c053 +#define MASK_FMV_X_S 0x3fffff #define MATCH_FSGNJN_D 0x60d3 #define MASK_FSGNJN_D 0x1ffff #define MATCH_FNMADD_S 0x4f @@ -329,36 +195,18 @@ #define MASK_JAL 0x7f #define MATCH_LWU 0x303 #define MASK_LWU 0x3ff -#define MATCH_VLSEGSTBU 0xa0b -#define MASK_VLSEGSTBU 0xfff -#define MATCH_C_BEQ 0x10 -#define MASK_C_BEQ 0x1f -#define MATCH_VLHU 0x28b -#define MASK_VLHU 0x3fffff -#define MATCH_VFSSTD 0x158f -#define MASK_VFSSTD 0x1ffff -#define MATCH_C_BNE 0x11 -#define MASK_C_BNE 0x1f +#define MATCH_FMV_X_D 0x1c0d3 +#define MASK_FMV_X_D 0x3fffff #define MATCH_FNMADD_D 0xcf #define MASK_FNMADD_D 0x1ff #define MATCH_AMOADD_D 0x1ab #define MASK_AMOADD_D 0x1ffff -#define MATCH_C_SW 0xd -#define MASK_C_SW 0x1f #define MATCH_LR_D 0x101ab #define MASK_LR_D 0x3fffff -#define MATCH_C_MOVE 0x2 -#define MASK_C_MOVE 0x801f -#define MATCH_FMOVN 0xef7 -#define MASK_FMOVN 0x1ffff -#define MATCH_C_FSW 0x16 -#define MASK_C_FSW 0x1f -#define MATCH_C_J 0x8002 -#define MASK_C_J 0x801f +#define MATCH_FCVT_W_S 0xa053 +#define MASK_FCVT_W_S 0x3ff1ff #define MATCH_MULHSU 0x533 #define MASK_MULHSU 0x1ffff -#define MATCH_C_SD 0xc -#define MASK_C_SD 0x1f #define MATCH_AMOADD_W 0x12b #define MASK_AMOADD_W 0x1ffff #define MATCH_FCVT_D_LU 0xd0d3 @@ -369,20 +217,8 @@ #define MASK_FSD 0x3ff #define MATCH_FCVT_W_D 0xa0d3 #define MASK_FCVT_W_D 0x3ff1ff -#define MATCH_FMOVZ 0xaf7 -#define MASK_FMOVZ 0x1ffff -#define MATCH_FEQ_D 0x150d3 -#define MASK_FEQ_D 0x1ffff -#define MATCH_C_OR3 0x21c -#define MASK_C_OR3 0x31f -#define MATCH_VMVV 0x73 -#define MASK_VMVV 0x3fffff -#define MATCH_VFSSEGSTW 0xd0f -#define MASK_VFSSEGSTW 0xfff #define MATCH_SLT 0x133 #define MASK_SLT 0x1ffff -#define MATCH_MXTF_D 0x1e0d3 -#define MASK_MXTF_D 0x3fffff #define MATCH_SLLW 0xbb #define MASK_SLLW 0x1ffff #define MATCH_AMOOR_D 0xdab @@ -399,124 +235,56 @@ #define MASK_SLTU 0x1ffff #define MATCH_SLLI 0x93 #define MASK_SLLI 0x3f03ff -#define MATCH_C_AND3 0x31c -#define MASK_C_AND3 0x31f -#define MATCH_VSSEGW 0x210f -#define MASK_VSSEGW 0x1ffff #define MATCH_AMOOR_W 0xd2b #define MASK_AMOOR_W 0x1ffff -#define MATCH_VSD 0x18f -#define MASK_VSD 0x3fffff #define MATCH_BEQ 0x63 #define MASK_BEQ 0x3ff #define MATCH_FLD 0x187 #define MASK_FLD 0x3ff -#define MATCH_MXTF_S 0x1e053 -#define MASK_MXTF_S 0x3fffff #define MATCH_FSUB_S 0x1053 #define MASK_FSUB_S 0x1f1ff #define MATCH_AND 0x3b3 #define MASK_AND 0x1ffff -#define MATCH_VTCFGIVL 0x1f3 -#define MASK_VTCFGIVL 0x3ff +#define MATCH_FMV_D_X 0x1e0d3 +#define MASK_FMV_D_X 0x3fffff #define MATCH_LBU 0x203 #define MASK_LBU 0x3ff -#define MATCH_VF 0x3f3 -#define MASK_VF 0xf80003ff -#define MATCH_VLSEGSTW 0x90b -#define MASK_VLSEGSTW 0xfff #define MATCH_SYSCALL 0x77 #define MASK_SYSCALL 0xffffffff #define MATCH_FSGNJ_S 0x5053 #define MASK_FSGNJ_S 0x1ffff -#define MATCH_C_ADDI 0x1 -#define MASK_C_ADDI 0x1f -#define MATCH_VFMVV 0x173 -#define MASK_VFMVV 0x3fffff -#define MATCH_VLSTWU 0x130b -#define MASK_VLSTWU 0x1ffff -#define MATCH_C_SUB3 0x11c -#define MASK_C_SUB3 0x31f -#define MATCH_VSH 0x8f -#define MASK_VSH 0x3fffff -#define MATCH_VLSEGSTB 0x80b -#define MASK_VLSEGSTB 0xfff -#define MATCH_VXCPTSAVE 0x37b -#define MASK_VXCPTSAVE 0xf83fffff -#define MATCH_VLSEGSTD 0x98b -#define MASK_VLSEGSTD 0xfff -#define MATCH_VFLSEGD 0x258b -#define MASK_VFLSEGD 0x1ffff -#define MATCH_VFLSEGW 0x250b -#define MASK_VFLSEGW 0x1ffff -#define MATCH_VLSEGSTH 0x88b -#define MASK_VLSEGSTH 0xfff #define MATCH_AMOMAX_W 0x152b #define MASK_AMOMAX_W 0x1ffff #define MATCH_FSGNJ_D 0x50d3 #define MASK_FSGNJ_D 0x1ffff -#define MATCH_VFLSEGSTW 0xd0b -#define MASK_VFLSEGSTW 0xfff -#define MATCH_C_SUB 0x801a -#define MASK_C_SUB 0x801f #define MATCH_MULHU 0x5b3 #define MASK_MULHU 0x1ffff #define MATCH_FENCE_V_G 0x2af #define MASK_FENCE_V_G 0x3ff -#define MATCH_VMSV 0x873 -#define MASK_VMSV 0x3fffff -#define MATCH_VMST 0x1073 -#define MASK_VMST 0x1ffff -#define MATCH_SETPCR 0xfb +#define MATCH_SETPCR 0x173 #define MASK_SETPCR 0x3ff #define MATCH_FCVT_LU_S 0x9053 #define MASK_FCVT_LU_S 0x3ff1ff -#define MATCH_VXCPTHOLD 0x277b -#define MASK_VXCPTHOLD 0xffffffff #define MATCH_FCVT_S_L 0xc053 #define MASK_FCVT_S_L 0x3ff1ff -#define MATCH_VFLSEGSTD 0xd8b -#define MASK_VFLSEGSTD 0xfff #define MATCH_AUIPC 0x17 #define MASK_AUIPC 0x7f -#define MATCH_C_ADD 0x1a -#define MASK_C_ADD 0x801f #define MATCH_FCVT_LU_D 0x90d3 #define MASK_FCVT_LU_D 0x3ff1ff -#define MATCH_VFLD 0x58b -#define MASK_VFLD 0x3fffff #define MATCH_SC_D 0x105ab #define MASK_SC_D 0x1ffff #define MATCH_FMADD_S 0x43 #define MASK_FMADD_S 0x1ff -#define MATCH_FCVT_W_S 0xa053 -#define MASK_FCVT_W_S 0x3ff1ff -#define MATCH_VSSEGH 0x208f -#define MASK_VSSEGH 0x1ffff #define MATCH_FSQRT_S 0x4053 #define MASK_FSQRT_S 0x3ff1ff -#define MATCH_VXCPTKILL 0xb7b -#define MASK_VXCPTKILL 0xffffffff -#define MATCH_C_SRAI 0x1019 -#define MASK_C_SRAI 0x1c1f #define MATCH_AMOMIN_W 0x112b #define MASK_AMOMIN_W 0x1ffff #define MATCH_FSGNJN_S 0x6053 #define MASK_FSGNJN_S 0x1ffff -#define MATCH_C_SLLI32 0x419 -#define MASK_C_SLLI32 0x1c1f -#define MATCH_VLSEGWU 0x230b -#define MASK_VLSEGWU 0x1ffff -#define MATCH_VFSW 0x50f -#define MASK_VFSW 0x3fffff #define MATCH_AMOSWAP_D 0x5ab #define MASK_AMOSWAP_D 0x1ffff #define MATCH_FSQRT_D 0x40d3 #define MASK_FSQRT_D 0x3ff1ff -#define MATCH_VFLW 0x50b -#define MASK_VFLW 0x3fffff -#define MATCH_FDIV_D 0x30d3 -#define MASK_FDIV_D 0x1f1ff #define MATCH_FMADD_D 0xc3 #define MASK_FMADD_D 0x1ff #define MATCH_DIVW 0x63b @@ -527,45 +295,25 @@ #define MASK_DIVU 0x1ffff #define MATCH_AMOSWAP_W 0x52b #define MASK_AMOSWAP_W 0x1ffff -#define MATCH_VFSD 0x58f -#define MASK_VFSD 0x3fffff +#define MATCH_JALR 0x6b +#define MASK_JALR 0x3ff #define MATCH_FADD_S 0x53 #define MASK_FADD_S 0x1f1ff -#define MATCH_VLSEGB 0x200b -#define MASK_VLSEGB 0x1ffff #define MATCH_FCVT_L_D 0x80d3 #define MASK_FCVT_L_D 0x3ff1ff -#define MATCH_VLSEGD 0x218b -#define MASK_VLSEGD 0x1ffff -#define MATCH_VLSEGH 0x208b -#define MASK_VLSEGH 0x1ffff #define MATCH_SW 0x123 #define MASK_SW 0x3ff #define MATCH_FMSUB_S 0x47 #define MASK_FMSUB_S 0x1ff -#define MATCH_VFSSEGW 0x250f -#define MASK_VFSSEGW 0x1ffff -#define MATCH_C_ADDIW 0x1d -#define MASK_C_ADDIW 0x1f #define MATCH_LHU 0x283 #define MASK_LHU 0x3ff #define MATCH_SH 0xa3 #define MASK_SH 0x3ff -#define MATCH_VLSEGW 0x210b -#define MASK_VLSEGW 0x1ffff #define MATCH_FSW 0x127 #define MASK_FSW 0x3ff -#define MATCH_VLBU 0x20b -#define MASK_VLBU 0x3fffff #define MATCH_SB 0x23 #define MASK_SB 0x3ff #define MATCH_FMSUB_D 0xc7 #define MASK_FMSUB_D 0x1ff -#define MATCH_VLSEGHU 0x228b -#define MASK_VLSEGHU 0x1ffff -#define MATCH_VSSEGB 0x200f -#define MASK_VSSEGB 0x1ffff -#define MATCH_VFSSEGD 0x258f -#define MASK_VFSSEGD 0x1ffff #define MATCH_SD 0x1a3 #define MASK_SD 0x3ff @@ -63,24 +63,14 @@ static void __vmr_decref(vmr_t* v, size_t dec) } } -static int pte_valid(pte_t pte) -{ - return pte & 2; -} - static size_t pte_ppn(pte_t pte) { return pte >> RISCV_PGSHIFT; } -static int ptd_valid(pte_t pte) -{ - return pte & 1; -} - static pte_t ptd_create(uintptr_t ppn) { - return ppn << RISCV_PGSHIFT | 1; + return ppn << RISCV_PGSHIFT | PTE_T | PTE_V; } static uintptr_t ppn(uintptr_t addr) @@ -94,20 +84,11 @@ static size_t pt_idx(uintptr_t addr, int level) return idx & ((1 << RISCV_PGLEVEL_BITS) - 1); } -static int prot2perm[] = { - [0] = 0, - [PROT_READ] = 4, - [PROT_WRITE] = 2, - [PROT_WRITE|PROT_READ] = 6, - [PROT_EXEC] = 1, - [PROT_EXEC|PROT_READ] = 5, - [PROT_EXEC|PROT_WRITE] = 3, - [PROT_EXEC|PROT_WRITE|PROT_READ] = 7 -}; - static pte_t super_pte_create(uintptr_t ppn, int kprot, int uprot, int level) { - int perm = prot2perm[kprot&7] << 7 | prot2perm[uprot&7] << 4 | 2; + kprot &= (PROT_READ | PROT_WRITE | PROT_EXEC); + uprot &= (PROT_READ | PROT_WRITE | PROT_EXEC); + int perm = (kprot * PTE_SR) | (uprot * PTE_UR) | PTE_V; return (ppn << (RISCV_PGLEVEL_BITS*level + RISCV_PGSHIFT)) | perm; } @@ -124,8 +105,7 @@ static __attribute__((always_inline)) pte_t* __walk_internal(uintptr_t addr, int for (unsigned i = RISCV_PGLEVELS-1; i > 0; i--) { size_t idx = pt_idx(addr, i); - kassert(!pte_valid(t[idx])); - if (!ptd_valid(t[idx])) + if (!(t[idx] & PTE_V)) { if (!create) return 0; @@ -134,6 +114,8 @@ static __attribute__((always_inline)) pte_t* __walk_internal(uintptr_t addr, int return 0; t[idx] = ptd_create(ppn(page)); } + else + kassert(t[idx] & PTE_T); t = (pte_t*)(pte_ppn(t[idx]) << RISCV_PGSHIFT); } return &t[pt_idx(addr, 0)]; @@ -186,7 +168,7 @@ static int __handle_page_fault(uintptr_t vaddr, int prot) if (pte == 0 || *pte == 0) return -1; - else if (!pte_valid(*pte)) + else if (!(*pte & PTE_V)) { kassert(vaddr < current.stack_top && vaddr >= current.user_min); uintptr_t ppn = vpn; |