risc-v bugfix potpourri
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Tue, 15 May 2012 12:10:47 +0000 (05:10 -0700)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Tue, 15 May 2012 12:10:47 +0000 (05:10 -0700)
kern/arch/riscv/console.c
kern/arch/riscv/entry.S
tools/compilers/gcc-glibc/binutils-2.21.1-riscv.patch
tools/compilers/gcc-glibc/gcc-4.6.1-riscv.patch
user/parlib/include/riscv/arch.h
user/parlib/include/riscv/vcore.h
user/parlib/riscv/vcore.S

index 00431cb..6ad117a 100644 (file)
@@ -75,7 +75,7 @@ static void cons_poll(struct alarm_waiter* awaiter)
        static char buf[64] __attribute__((aligned(64)));
        fesvr_syscall(FESVR_SYS_read, 0, PADDR(buf), sizeof(buf), 0, cons_polled, 0);
 
-       set_awaiter_rel(&keyboard_waiter, 10);
+       set_awaiter_rel(&keyboard_waiter, 100);
        set_alarm(&per_cpu_info[core_id()].tchain, &keyboard_waiter);
 }
 
index 6ffdabc..5a824bd 100644 (file)
@@ -34,7 +34,7 @@ save_kernel_tf_asm:
 
   # set EPC to this function's return address
   STORE  ra,33*REGBYTES(a0)
-
+  ret
   .end  save_kernel_tf_asm
 
   .text
@@ -136,6 +136,7 @@ trap_entry:
   sll   x1, x1, LOG_REGBYTES
   add   x2, x2, x1
   LOAD  x2, 0(x2)
+  add   x2, x2, -SIZEOF_TRAPFRAME_T
 
 1:# save gprs
   STORE  x3,3*REGBYTES(x2)
index 7919a2c..91dcc51 100644 (file)
@@ -14493,7 +14493,7 @@ index 1aa9bb4..435df2b 100644
  @am__fastdepCC_TRUE@  $(am__mv) $(DEPDIR)/tc-rx.Tpo $(DEPDIR)/tc-rx.Po
 diff --git a/binutils-2.21.1/gas/config/tc-riscv.c b/binutils-2.21.1/gas/config/tc-riscv.c
 new file mode 100644
-index 0000000..fc223b6
+index 0000000..ac4e21b
 --- /dev/null
 +++ binutils-2.21.1/gas/config/tc-riscv.c
 @@ -0,0 +1,4920 @@
@@ -16255,7 +16255,6 @@ index 0000000..fc223b6
 +        continue;
 +
 +      case 't':
-+      case 'E':
 +        INSERT_OPERAND (RT, insn, va_arg (args, int));
 +        continue;
 +
@@ -16298,6 +16297,7 @@ index 0000000..fc223b6
 +
 +      case 'b':
 +      case 's':
++      case 'E':
 +        INSERT_OPERAND (RS, insn, va_arg (args, int));
 +        continue;
 +
@@ -16661,7 +16661,7 @@ index 0000000..fc223b6
 +      case '>':       USE_BITS (OP_MASK_SHAMT,        OP_SH_SHAMT);   break;
 +      case 'A': break;
 +      case 'D':       USE_BITS (OP_MASK_FD,           OP_SH_FD);      break;
-+      case 'E':       USE_BITS (OP_MASK_RT,           OP_SH_RT);      break;
++      case 'E':       USE_BITS (OP_MASK_RS,           OP_SH_RS);      break;
 +      case 'I': break;
 +      case 'R':       USE_BITS (OP_MASK_FR,           OP_SH_FR);      break;
 +      case 'S':       USE_BITS (OP_MASK_FS,           OP_SH_FS);      break;
@@ -16942,7 +16942,7 @@ index 0000000..fc223b6
 +
 +          case 'E':           /* Control register.  */
 +            ok = reg_lookup (&s, RTYPE_NUM | RTYPE_CP0, &regno);
-+            INSERT_OPERAND (RT, *ip, regno);
++            INSERT_OPERAND (RS, *ip, regno);
 +            if (ok) 
 +              {
 +                lastregno = regno;
@@ -16990,6 +16990,7 @@ index 0000000..fc223b6
 +                  {
 +                  case 's':
 +                  case 'b':
++                  case 'E':
 +                    INSERT_OPERAND (RS, *ip, regno);
 +                    break;
 +                  case 'd':
@@ -17003,7 +17004,6 @@ index 0000000..fc223b6
 +                    INSERT_OPERAND (RT, *ip, regno);
 +                    break;
 +                  case 't':
-+                  case 'E':
 +                    INSERT_OPERAND (RT, *ip, regno);
 +                    break;
 +                  case 'x':
@@ -20131,10 +20131,10 @@ index 0000000..3ab671f
 +#endif /* _ELF_RISCV_H */
 diff --git a/binutils-2.21.1/include/opcode/riscv-opc.h b/binutils-2.21.1/include/opcode/riscv-opc.h
 new file mode 100644
-index 0000000..e417397
+index 0000000..7bad495
 --- /dev/null
 +++ binutils-2.21.1/include/opcode/riscv-opc.h
-@@ -0,0 +1,545 @@
+@@ -0,0 +1,563 @@
 +/* Automatically generated by parse-opcodes */
 +#define MATCH_MOVN 0x6f7
 +#define  MASK_MOVN 0x1ffff
@@ -20152,12 +20152,16 @@ index 0000000..e417397
 +#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_FCVT_LU_S 0x9053
 +#define  MASK_FCVT_LU_S 0x3ff1ff
-+#define MATCH_FENCE_L_CV 0x32f
-+#define  MASK_FENCE_L_CV 0x3ff
++#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
@@ -20168,6 +20172,8 @@ index 0000000..e417397
 +#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
 +#define  MASK_FCVT_D_L 0x3ff1ff
 +#define MATCH_LH 0x83
@@ -20180,10 +20186,8 @@ index 0000000..e417397
 +#define  MASK_ADD 0x1ffff
 +#define MATCH_FCVT_D_S 0x100d3
 +#define  MASK_FCVT_D_S 0x3ff1ff
-+#define MATCH_FENCE_G_V 0x2af
-+#define  MASK_FENCE_G_V 0x3ff
 +#define MATCH_MFPCR 0x17b
-+#define  MASK_MFPCR 0x7c1ffff
++#define  MASK_MFPCR 0x3fffff
 +#define MATCH_C_FSD 0x18
 +#define  MASK_C_FSD 0x1f
 +#define MATCH_FMAX_D 0x190d3
@@ -20202,12 +20206,12 @@ index 0000000..e417397
 +#define  MASK_VFLSTD 0x1ffff
 +#define MATCH_C_LI 0x0
 +#define  MASK_C_LI 0x1f
-+#define MATCH_DI 0xfb
-+#define  MASK_DI 0x7ffffff
++#define MATCH_FADD_D 0xd3
++#define  MASK_FADD_D 0x1f1ff
 +#define MATCH_SLTIU 0x193
 +#define  MASK_SLTIU 0x3ff
 +#define MATCH_MTPCR 0x1fb
-+#define  MASK_MTPCR 0xf801ffff
++#define  MASK_MTPCR 0x1ffff
 +#define MATCH_VLB 0xb
 +#define  MASK_VLB 0x3fffff
 +#define MATCH_STOP 0x177
@@ -20228,6 +20232,8 @@ index 0000000..e417397
 +#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
@@ -20264,8 +20270,8 @@ index 0000000..e417397
 +#define  MASK_MFTX_D 0x3fffff
 +#define MATCH_DIV 0x633
 +#define  MASK_DIV 0x1ffff
-+#define MATCH_C_LD 0x9
-+#define  MASK_C_LD 0x1f
++#define MATCH_VTCFG 0xc73
++#define  MASK_VTCFG 0xf801ffff
 +#define MATCH_MFTX_S 0x1c053
 +#define  MASK_MFTX_S 0x3fffff
 +#define MATCH_VSSEGSTH 0x88f
@@ -20274,8 +20280,6 @@ index 0000000..e417397
 +#define  MASK_VVCFGIVL 0x3ff
 +#define MATCH_J 0x67
 +#define  MASK_J 0x7f
-+#define MATCH_EI 0x7b
-+#define  MASK_EI 0x7ffffff
 +#define MATCH_FENCE 0x12f
 +#define  MASK_FENCE 0x3ff
 +#define MATCH_VSW 0x10f
@@ -20288,6 +20292,8 @@ index 0000000..e417397
 +#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
@@ -20384,16 +20390,22 @@ index 0000000..e417397
 +#define  MASK_VSSEGD 0x1ffff
 +#define MATCH_SRL 0x2b3
 +#define  MASK_SRL 0x1ffff
++#define MATCH_VENQCMD 0x2b7b
++#define  MASK_VENQCMD 0xf801ffff
 +#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_FEQ_D 0x150d3
-+#define  MASK_FEQ_D 0x1ffff
++#define MATCH_VENQIMM2 0x337b
++#define  MASK_VENQIMM2 0xf801ffff
 +#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
@@ -20438,8 +20450,10 @@ index 0000000..e417397
 +#define  MASK_RDTIME 0x7ffffff
 +#define MATCH_ANDI 0x393
 +#define  MASK_ANDI 0x3ff
-+#define MATCH_C_SRLI32 0xc19
-+#define  MASK_C_SRLI32 0x1c1f
++#define MATCH_CLEARPCR 0x7b
++#define  MASK_CLEARPCR 0x3ff
++#define MATCH_VENQCNT 0x377b
++#define  MASK_VENQCNT 0xf801ffff
 +#define MATCH_FSGNJN_D 0x60d3
 +#define  MASK_FSGNJN_D 0x1ffff
 +#define MATCH_FNMADD_S 0x4f
@@ -20460,8 +20474,6 @@ index 0000000..e417397
 +#define  MASK_C_BNE 0x1f
 +#define MATCH_FNMADD_D 0xcf
 +#define  MASK_FNMADD_D 0x1ff
-+#define MATCH_FENCE_G_CV 0x3af
-+#define  MASK_FENCE_G_CV 0x3ff
 +#define MATCH_AMOADD_D 0x1ab
 +#define  MASK_AMOADD_D 0x1ffff
 +#define MATCH_C_SW 0xd
@@ -20486,10 +20498,14 @@ index 0000000..e417397
 +#define  MASK_FCVT_D_LU 0x3ff1ff
 +#define MATCH_AMOMAX_D 0x15ab
 +#define  MASK_AMOMAX_D 0x1ffff
++#define MATCH_FSD 0x1a7
++#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
@@ -20558,6 +20574,8 @@ index 0000000..e417397
 +#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
@@ -20574,18 +20592,18 @@ index 0000000..e417397
 +#define  MASK_C_SUB 0x801f
 +#define MATCH_MULHU 0x5b3
 +#define  MASK_MULHU 0x1ffff
-+#define MATCH_FCVT_L_D 0x80d3
-+#define  MASK_FCVT_L_D 0x3ff1ff
++#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_FADD_D 0xd3
-+#define  MASK_FADD_D 0x1f1ff
-+#define MATCH_FCVT_S_WU 0xf053
-+#define  MASK_FCVT_S_WU 0x3ff1ff
++#define MATCH_SETPCR 0xfb
++#define  MASK_SETPCR 0x3ff
 +#define MATCH_RDNPC 0x26b
 +#define  MASK_RDNPC 0x7ffffff
++#define MATCH_VXCPTHOLD 0x277b
++#define  MASK_VXCPTHOLD 0xffffffff
 +#define MATCH_FCVT_S_L 0xc053
 +#define  MASK_FCVT_S_L 0x3ff1ff
 +#define MATCH_VFLSEGSTD 0xd8b
@@ -20606,6 +20624,8 @@ index 0000000..e417397
 +#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
@@ -20620,8 +20640,6 @@ index 0000000..e417397
 +#define  MASK_VFSW 0x3fffff
 +#define MATCH_AMOSWAP_D 0x5ab
 +#define  MASK_AMOSWAP_D 0x1ffff
-+#define MATCH_FENCE_L_V 0x22f
-+#define  MASK_FENCE_L_V 0x3ff
 +#define MATCH_FSQRT_D 0x40d3
 +#define  MASK_FSQRT_D 0x3ff1ff
 +#define MATCH_VFLW 0x50b
@@ -20644,8 +20662,8 @@ index 0000000..e417397
 +#define  MASK_FADD_S 0x1f1ff
 +#define MATCH_VLSEGB 0x200b
 +#define  MASK_VLSEGB 0x1ffff
-+#define MATCH_FSD 0x1a7
-+#define  MASK_FSD 0x3ff
++#define MATCH_FCVT_L_D 0x80d3
++#define  MASK_FCVT_L_D 0x3ff1ff
 +#define MATCH_VLSEGD 0x218b
 +#define  MASK_VLSEGD 0x1ffff
 +#define MATCH_VLSEGH 0x208b
@@ -21492,7 +21510,7 @@ index 0fb35ac..cef365e 100644
        if (bfd_get_mach (abfd) == bfd_mach_ppc_620)
 diff --git a/binutils-2.21.1/opcodes/riscv-dis.c b/binutils-2.21.1/opcodes/riscv-dis.c
 new file mode 100644
-index 0000000..a0245a3
+index 0000000..8c200df
 --- /dev/null
 +++ binutils-2.21.1/opcodes/riscv-dis.c
 @@ -0,0 +1,904 @@
@@ -22053,7 +22071,7 @@ index 0000000..a0245a3
 +           cp2 register names, we can simply print the register
 +           numbers.  */
 +        (*info->fprintf_func) (info->stream, "cr%ld",
-+                               (l >> OP_SH_RT) & OP_MASK_RT);
++                               (l >> OP_SH_RS) & OP_MASK_RS);
 +        break;
 +
 +      case 'G':
@@ -22402,10 +22420,10 @@ index 0000000..a0245a3
 +}
 diff --git a/binutils-2.21.1/opcodes/riscv-opc.c b/binutils-2.21.1/opcodes/riscv-opc.c
 new file mode 100644
-index 0000000..bba84bc
+index 0000000..a973ed6
 --- /dev/null
 +++ binutils-2.21.1/opcodes/riscv-opc.c
-@@ -0,0 +1,449 @@
+@@ -0,0 +1,462 @@
 +/* mips-opc.c -- MIPS opcode list.
 +   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
 +   2003, 2004, 2005, 2007, 2008, 2009  Free Software Foundation, Inc.
@@ -22582,8 +22600,8 @@ index 0000000..bba84bc
 +{"add",    "d,s,t",   MATCH_ADD, MASK_ADD,  WR_xd|RD_xs1|RD_xs2 },
 +{"add",   "d,s,j",    MATCH_ADDI, MASK_ADDI,  WR_xd|RD_xs1 },
 +{"addi",   "d,s,j",   MATCH_ADDI, MASK_ADDI,  WR_xd|RD_xs1 },
-+{"di",      "",               MATCH_DI, MASK_DI | MASK_RD,     0 },
-+{"di",      "d",      MATCH_DI, MASK_DI,       WR_xd },
++{"clearpcr", "E,j",   MATCH_CLEARPCR, MASK_CLEARPCR | MASK_RD, 0 },
++{"clearpcr", "d,E,j", MATCH_CLEARPCR, MASK_CLEARPCR | MASK_RD, WR_xd },
 +{"div",    "d,s,t",   MATCH_DIV, MASK_DIV,  WR_xd|RD_xs1|RD_xs2 },
 +{"divw",    "d,s,t",  MATCH_DIVW, MASK_DIVW,  WR_xd|RD_xs1|RD_xs2 },
 +{"divu",    "d,s,t",  MATCH_DIVU, MASK_DIVU,  WR_xd|RD_xs1|RD_xs2 },
@@ -22593,7 +22611,8 @@ index 0000000..bba84bc
 +{"mtfsr",   "s",      MATCH_MTFSR, MASK_MTFSR | MASK_RD,  RD_xs1 },
 +{"mtfsr",   "d,s",    MATCH_MTFSR, MASK_MTFSR,  WR_xd|RD_xs1 },
 +{"mfpcr",   "d,E",    MATCH_MFPCR, MASK_MFPCR,  WR_xd },
-+{"mtpcr",   "s,E",    MATCH_MTPCR, MASK_MTPCR,  RD_xs1 },
++{"mtpcr",   "d,t,E",  MATCH_MTPCR, MASK_MTPCR,  WR_xd|RD_xs1 },
++{"mtpcr",   "t,E",    MATCH_MTPCR, MASK_MTPCR | MASK_RD,  RD_xs1 },
 +{"mftx.s",   "d,S",   MATCH_MFTX_S, MASK_MFTX_S,  WR_xd|RD_fs1 },
 +{"mftx.s",   "d,s",   MATCH_MFTX_S, MASK_MFTX_S,  WR_xd|RD_fs1 },
 +{"mxtf.s",   "D,s",   MATCH_MXTF_S, MASK_MXTF_S,  WR_fd|RD_xs1 },
@@ -22618,8 +22637,8 @@ index 0000000..bba84bc
 +{"sra",    "d,s,>",    MATCH_SRAI, MASK_SRAI,  WR_xd|RD_xs1 },
 +{"srai",    "d,s,>",   MATCH_SRAI, MASK_SRAI,  WR_xd|RD_xs1 },
 +{"sub",    "d,s,t",   MATCH_SUB, MASK_SUB,     WR_xd|RD_xs1|RD_xs2 },
-+{"ei",      "",               MATCH_EI, MASK_EI | MASK_RD,     0 },
-+{"ei",      "d",      MATCH_EI, MASK_EI,       WR_xd },
++{"setpcr", "E,j",     MATCH_SETPCR, MASK_SETPCR | MASK_RD, 0 },
++{"setpcr", "d,E,j",   MATCH_SETPCR, MASK_SETPCR, WR_xd },
 +{"eret",    "",     MATCH_ERET, MASK_ERET,  0 },
 +{"cflush",  "",       MATCH_CFLUSH, MASK_CFLUSH,       0 },
 +{"ret",      "",      MATCH_JALR_R | (LINK_REG << OP_SH_RS), MASK_JALR_R | MASK_RD | MASK_RS | MASK_IMM,       WR_xd|RD_xs1 },
@@ -22703,10 +22722,8 @@ index 0000000..bba84bc
 +{"fsd",    "T,q(b)",  MATCH_FSD, MASK_FSD,  RD_xs1|RD_fs2 },
 +{"fence",    "",      MATCH_FENCE, MASK_FENCE | MASK_RD | MASK_RS | MASK_IMM,  0 },
 +{"fence.i",   "",     MATCH_FENCE_I, MASK_FENCE_I | MASK_RD | MASK_RS | MASK_IMM,      0 },
-+{"fence.l.v",   "",   MATCH_FENCE_L_V, MASK_FENCE_L_V | MASK_RD | MASK_RS | MASK_IMM,  0 },
-+{"fence.g.v",   "",   MATCH_FENCE_G_V, MASK_FENCE_G_V | MASK_RD | MASK_RS | MASK_IMM,  0 },
-+{"fence.l.cv",   "",  MATCH_FENCE_L_CV, MASK_FENCE_L_CV | MASK_RD | MASK_RS | MASK_IMM,        0 },
-+{"fence.g.cv",   "",  MATCH_FENCE_G_CV, MASK_FENCE_G_CV | MASK_RD | MASK_RS | MASK_IMM,        0 },
++{"fence.v.l",   "",   MATCH_FENCE_V_L, MASK_FENCE_V_L | MASK_RD | MASK_RS | MASK_IMM,  0 },
++{"fence.v.g",   "",   MATCH_FENCE_V_G, MASK_FENCE_V_G | MASK_RD | MASK_RS | MASK_IMM,  0 },
 +{"rdcycle",   "d",    MATCH_RDCYCLE, MASK_RDCYCLE,  WR_xd },
 +{"rdinstret",   "d",  MATCH_RDINSTRET, MASK_RDINSTRET,  WR_xd },
 +{"rdtime",   "d",     MATCH_RDTIME, MASK_RDTIME,  WR_xd },
@@ -22840,9 +22857,23 @@ index 0000000..bba84bc
 +{"vfmst",     "#D,S,T",         MATCH_VFMST, MASK_VFMST,  0 },
 +{"vfmts",     "D,#S,T",         MATCH_VFMTS, MASK_VFMTS,  0 },
 +
++{"vvcfg",     "s,t",            MATCH_VVCFG, MASK_VVCFG, RD_xs1|RD_xs2 },
++{"vtcfg",     "s,t",            MATCH_VTCFG, MASK_VTCFG, RD_xs1|RD_xs2 },
++
 +{"vvcfgivl",  "d,s,#g,#f",      MATCH_VVCFGIVL, MASK_VVCFGIVL,  0 },
 +{"vtcfgivl",  "d,s,#g,#f",      MATCH_VTCFGIVL, MASK_VTCFGIVL,  0 },
 +{"vf",        "j(b)",           MATCH_VF, MASK_VF,  0 },
++
++{"venqcmd",   "s,t",  MATCH_VENQCMD, MASK_VENQCMD, RD_xs1|RD_xs2 },
++{"venqimm1",  "s,t",  MATCH_VENQIMM1, MASK_VENQIMM1, RD_xs1|RD_xs2 },
++{"venqimm2",  "s,t",  MATCH_VENQIMM2, MASK_VENQIMM2, RD_xs1|RD_xs2 },
++{"venqcnt",   "s,t",  MATCH_VENQCNT, MASK_VENQCNT, RD_xs1|RD_xs2 },
++
++{"vxcptsave",   "s",   MATCH_VXCPTSAVE, MASK_VXCPTSAVE, RD_xs1 },
++{"vxcptrestore","s",   MATCH_VXCPTRESTORE, MASK_VXCPTRESTORE, RD_xs1 },
++{"vxcptevac",   "s",   MATCH_VXCPTEVAC, MASK_VXCPTEVAC, RD_xs1 },
++{"vxcptkill",   "",   MATCH_VXCPTKILL, MASK_VXCPTKILL, 0 },
++{"vxcpthold",   "",   MATCH_VXCPTHOLD, MASK_VXCPTHOLD, 0 },
 +};
 +
 +#define RISCV_NUM_OPCODES \
index be78aa2..c30b5dd 100644 (file)
@@ -2247,10 +2247,10 @@ index 0000000..9b2aa4c
 +#endif /* ! GCC_MIPS_PROTOS_H */
 diff --git a/gcc-4.6.1/gcc/config/riscv/riscv.c b/gcc-4.6.1/gcc/config/riscv/riscv.c
 new file mode 100644
-index 0000000..4de93b0
+index 0000000..c325df9
 --- /dev/null
 +++ gcc-4.6.1/gcc/config/riscv/riscv.c
-@@ -0,0 +1,6481 @@
+@@ -0,0 +1,6479 @@
 +/* Subroutines used for MIPS code generation.
 +   Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
 +   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
@@ -8511,11 +8511,9 @@ index 0000000..4de93b0
 +
 +  trampoline[i++] = OP (RISCV_ITYPE (RDNPC, gp, 0, 0));
 +  trampoline[i++] = OP (RISCV_ITYPE (LREG, PIC_FUNCTION_ADDR_REGNUM,
-+                                 target_function_offset - 4,
-+                                 gp));
++                                 gp, target_function_offset - 4));
 +  trampoline[i++] = OP (RISCV_ITYPE (LREG, STATIC_CHAIN_REGNUM,
-+                                 static_chain_offset - 4,
-+                                 gp));
++                                 gp, static_chain_offset - 4));
 +  trampoline[i++] = OP (RISCV_ITYPE (JALR_J, 0, PIC_FUNCTION_ADDR_REGNUM, 0));
 +
 +  gcc_assert (i * 4 == TRAMPOLINE_CODE_SIZE);
index 7f9f88c..aef6bb1 100644 (file)
@@ -30,8 +30,8 @@ read_tsc(void)
 static __inline void
 cpu_relax(void)
 {
-       long ctr = 8;
-       asm volatile("1: addi %0, %0, -1; bnez %0, 1b" : "=&r"(ctr) : : "memory");
+       long ctr;
+       asm volatile("li %0, 8; 1: addi %0, %0, -1; bnez %0, 1b" : "=r"(ctr) : : "memory");
 }
 
 #endif /* PARLIB_ARCH_H */
index 71ad7e8..4e2d3a2 100644 (file)
@@ -68,13 +68,6 @@ static inline void __pop_ros_tf(struct user_trapframe *tf, uint32_t vcoreid,
        tf = _tf;
        vcoreid = _vcoreid;
        struct preempt_data* vcpd = &__procdata.vcore_preempt_data[vcoreid];
-
-       // if this is a trap frame we just init'ed, we need to set up TLS
-       if(tf->gpr[31] == 0)
-               tf->gpr[31] = (long)get_tls_desc(vcoreid);
-       else
-               assert(tf->gpr[31] == (long)get_tls_desc(vcoreid));
-
        __pop_ros_tf_regs(tf, vcpd, vcoreid, helper);
 }
 
index 846f149..7d58718 100644 (file)
@@ -17,7 +17,6 @@ __pop_ros_tf_regs:
   REG_L s8,28*SZREG(a0)
   REG_L s9,29*SZREG(a0)
   REG_L sp,30*SZREG(a0)
-  REG_L tp,31*SZREG(a0)
 
   REG_L ra,33*SZREG(a0)
 
@@ -39,7 +38,6 @@ __save_ros_tf_regs:
   REG_S s8,28*SZREG(a0)
   REG_S s9,29*SZREG(a0)
   REG_S sp,30*SZREG(a0)
-  REG_S tp,31*SZREG(a0)
 
   REG_S ra,33*SZREG(a0)