diff options
author | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2011-04-09 17:37:42 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@s144.Millennium.Berkeley.EDU> | 2011-04-09 17:37:42 -0700 |
commit | 6e7fe98ea95c6da8c573fdc032b5269f08bbacc1 (patch) | |
tree | e0f0f3c73ad8785a95a6e8d22c96b5430370bb56 /pk | |
parent | 666ae0c9e5355e578c2487b81f48b4b74cc16dda (diff) | |
download | pk-6e7fe98ea95c6da8c573fdc032b5269f08bbacc1.zip pk-6e7fe98ea95c6da8c573fdc032b5269f08bbacc1.tar.gz pk-6e7fe98ea95c6da8c573fdc032b5269f08bbacc1.tar.bz2 |
[xcc,pk,sim,opcodes] added first RVC instruction
Diffstat (limited to 'pk')
-rw-r--r-- | pk/entry.S | 10 | ||||
-rw-r--r-- | pk/pcr.h | 8 | ||||
-rw-r--r-- | pk/pk.ac | 13 | ||||
-rw-r--r-- | pk/pk.c | 7 | ||||
-rw-r--r-- | pk/riscv-opc.h | 8 | ||||
-rw-r--r-- | pk/riscv-pk.c | 7 |
6 files changed, 22 insertions, 31 deletions
@@ -1,6 +1,6 @@ #include "pcr.h" -#ifdef PK_ENABLE_KERNEL_64BIT +#ifdef __riscv64 # define STORE sd # define LOAD ld # define REGBYTES 8 @@ -61,9 +61,11 @@ save_tf: # write the trap frame onto the stack STORE $x3,35*REGBYTES($x2) # get insn - and $x4,$x4,~3 - lw $x3,0($x4) - STORE $x3, 36*REGBYTES($x2) + and $x4,$x4,~1 + lh $x3,0($x4) + lh $x4,2($x4) + sh $x3, 36*REGBYTES($x2) + sh $x4,2+36*REGBYTES($x2) ret .end save_tf @@ -4,11 +4,13 @@ #include "config.h" #define SR_ET 0x0000000000000001 +#define SR_EF 0x0000000000000002 #define SR_PS 0x0000000000000004 #define SR_S 0x0000000000000008 -#define SR_EF 0x0000000000000010 -#define SR_UX 0x0000000000000020 -#define SR_SX 0x0000000000000040 +#define SR_UX 0x0000000000000010 +#define SR_SX 0x0000000000000020 +#define SR_UC 0x0000000000000040 +#define SR_SC 0x0000000000000080 #define SR_IM 0x000000000000FF00 #define PCR_SR 0 @@ -3,19 +3,6 @@ AS_IF([test "x$enable_vm" != "xno"], [ AC_DEFINE([PK_ENABLE_VM],,[Define if virtual memory support is enabled]) ]) -AC_ARG_ENABLE([kernel-64bit], AS_HELP_STRING([--disable-kernel-64bit], [Disable 64-bit kernel operation])) -AS_IF([test "x$enable_kernel_64bit" != "xno"], [ - AC_DEFINE([PK_ENABLE_KERNEL_64BIT],,[Define if the kernel runs in 64-bit mode]) -],[ - AC_SUBST([CFLAGS],["$CFLAGS -mabi=32"]) - AC_SUBST([LDFLAGS],["$LDFLAGS -mabi=32"]) -]) - -AC_ARG_ENABLE([user-64bit], AS_HELP_STRING([--disable-user-64bit], [Disable 64-bit user operation])) -AS_IF([test "x$enable_user_64bit" != "xno"], [ - AC_DEFINE([PK_ENABLE_USER_64BIT],,[Define if the user runs in 64-bit mode]) -]) - AC_ARG_ENABLE([fp-emulation], AS_HELP_STRING([--disable-fp-emulation], [Disable floating-point emulation])) AS_IF([test "x$enable_fp_emulation" != "xno"], [ AC_DEFINE([PK_ENABLE_FP_EMULATION],,[Define if floating-point emulation is enabled]) @@ -125,10 +125,11 @@ void dump_tf(trapframe_t* tf) void init_tf(trapframe_t* tf, long pc, long sp, int user64) { memset(tf,0,sizeof(*tf)); - #ifndef PK_ENABLE_KERNEL_64BIT + if(sizeof(void*) != 8) kassert(!user64); - #endif - tf->sr = mfpcr(PCR_SR) & ~(SR_PS | SR_ET) | (user64 ? SR_UX : 0); + tf->sr = (mfpcr(PCR_SR) & (SR_IM | SR_SX)) | SR_S | SR_UC | SR_UC; + if(user64) + tf->sr |= SR_UX; tf->gpr[30] = sp; tf->epc = pc; } diff --git a/pk/riscv-opc.h b/pk/riscv-opc.h index 68fcd63..d5040b0 100644 --- a/pk/riscv-opc.h +++ b/pk/riscv-opc.h @@ -43,8 +43,6 @@ #define MASK_FENCE_G_V 0x3ff #define MATCH_MFPCR 0x17b #define MASK_MFPCR 0x7c1ffff -#define MATCH_LHUSEG_V 0x228b -#define MASK_LHUSEG_V 0x1ffff #define MATCH_FMAX_D 0x190d3 #define MASK_FMAX_D 0x1ffff #define MATCH_SBSEG_V 0x280b @@ -357,6 +355,8 @@ #define MASK_SYSCALL 0xffffffff #define MATCH_FSGNJ_S 0x5053 #define MASK_FSGNJ_S 0x1ffff +#define MATCH_C_ADDI 0x0 +#define MASK_C_ADDI 0x1f #define MATCH_SHSEGST_V 0x88f #define MASK_SHSEGST_V 0xfff #define MATCH_FLWSEGST_V 0x50f @@ -387,8 +387,8 @@ #define MASK_FMOV_US 0x1ffff #define MATCH_FCVT_LU_D 0x90d3 #define MASK_FCVT_LU_D 0x3ff1ff -#define MATCH_UNIMP 0x0 -#define MASK_UNIMP 0xffffffff +#define MATCH_LHUSEG_V 0x228b +#define MASK_LHUSEG_V 0x1ffff #define MATCH_FSUB_D 0x10d3 #define MASK_FSUB_D 0x1f1ff #define MATCH_FMADD_S 0x43 diff --git a/pk/riscv-pk.c b/pk/riscv-pk.c index df6e94b..5392100 100644 --- a/pk/riscv-pk.c +++ b/pk/riscv-pk.c @@ -4,7 +4,7 @@ void __attribute__((section(".boottext"))) __start() { extern char stack_top; - asm("move $sp,%0" : : "r"(&stack_top-64)); + asm volatile("move $sp,%0" : : "r"(&stack_top-64) : "memory"); extern char trap_entry; register void* te = &trap_entry; @@ -13,10 +13,9 @@ void __attribute__((section(".boottext"))) __start() mtpcr(0,PCR_COUNT); mtpcr(0,PCR_COMPARE); - register long sr0 = SR_S | SR_PS | SR_ET | SR_IM; - #ifdef PK_ENABLE_KERNEL_64BIT + register long sr0 = SR_S | SR_PS | SR_ET | SR_IM | SR_SC; + if(sizeof(void*) == 8) sr0 |= SR_SX; - #endif mtpcr(sr0 | SR_EF, PCR_SR); have_fp = mfpcr(PCR_SR) & SR_EF; |