aboutsummaryrefslogtreecommitdiff
path: root/pk
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2013-07-26 20:25:50 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2013-07-26 20:25:50 -0700
commit3168b8a9049d062192ea20e4b33fed6286e84220 (patch)
tree157217cb2107615c3c74fc8b0af6988f6f6f571c /pk
parent80a4afcb47c0b82b36bd818b4c47e5dfd506ae77 (diff)
downloadpk-3168b8a9049d062192ea20e4b33fed6286e84220.zip
pk-3168b8a9049d062192ea20e4b33fed6286e84220.tar.gz
pk-3168b8a9049d062192ea20e4b33fed6286e84220.tar.bz2
New supervisor mode
Diffstat (limited to 'pk')
-rw-r--r--pk/fp.c12
-rw-r--r--pk/handlers.c2
-rw-r--r--pk/init.c2
-rw-r--r--pk/pcr.h57
-rw-r--r--pk/pk.S9
-rw-r--r--pk/riscv-opc.h294
-rw-r--r--pk/vm.c34
7 files changed, 76 insertions, 334 deletions
diff --git a/pk/fp.c b/pk/fp.c
index aaa8f0f..900b446 100644
--- a/pk/fp.c
+++ b/pk/fp.c
@@ -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*);
diff --git a/pk/init.c b/pk/init.c
index 48667c3..0e4f2fb 100644
--- a/pk/init.c
+++ b/pk/init.c
@@ -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;
diff --git a/pk/pcr.h b/pk/pcr.h
index 9fea232..77cee01 100644
--- a/pk/pcr.h
+++ b/pk/pcr.h
@@ -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
diff --git a/pk/pk.S b/pk/pk.S
index e6c972f..08b00ac 100644
--- a/pk/pk.S
+++ b/pk/pk.S
@@ -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
diff --git a/pk/vm.c b/pk/vm.c
index bb95d09..939c8af 100644
--- a/pk/vm.c
+++ b/pk/vm.c
@@ -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;