Reflect changes to ISA
[riscv-tests.git] / env / v / vm.c
index 37ef19e0e102359bcb9dfe5f1d181ab773528ea5..bd9c80edd7ec8548786059c3989ac4d1d484a908 100644 (file)
@@ -22,6 +22,7 @@ static void cputstring(const char* s)
 static void terminate(int code)
 {
   while (mtpcr(PCR_TOHOST, code));
+  while (1);
 }
 
 #define stringify1(x) #x
@@ -30,7 +31,6 @@ static void terminate(int code)
   if (x) break; \
   cputstring("Assertion failed: " stringify(x)); \
   terminate(3); \
-  while(1); \
 } while(0)
 
 #define RELOC(x) ((typeof(x))((char*)(x) + (PGSIZE*MAX_TEST_PAGES)))
@@ -89,8 +89,8 @@ void handle_fault(unsigned long addr)
   if (*RELOC(&freelist_head) == *RELOC(&freelist_tail))
     *RELOC(&freelist_tail) = 0;
 
-  *RELOC(&l3pt[addr/PGSIZE]) = node->addr | 0x3F2;
-  mtpcr(PCR_PTBR, l1pt);
+  *RELOC(&l3pt[addr/PGSIZE]) = node->addr | PTE_UW | PTE_UR | PTE_UX | PTE_SW | PTE_SR | PTE_SX | PTE_V;
+  mtpcr(PCR_FATC, 0);
 
   assert(RELOC(&user_mapping[addr/PGSIZE])->addr == 0);
   *RELOC(&user_mapping[addr/PGSIZE]) = *node;
@@ -176,27 +176,22 @@ void handle_trap(trapframe_t* tf)
   if (tf->cause == CAUSE_SYSCALL)
   {
     int n = tf->gpr[18];
-    if (n == 1234) // TEST_PASS_NOFP
-    {
-      if (mfpcr(PCR_SR) & SR_EF)
-      {
-        tf->epc += 4;
-        goto out;
-      }
-      n = 1;
-    }
 
     for (long i = 1; i < MAX_TEST_PAGES; i++)
       evict(i*PGSIZE);
 
     terminate(n);
-    while(1);
   }
   else if (tf->cause == CAUSE_FAULT_FETCH)
     handle_fault(tf->epc);
   else if (tf->cause == CAUSE_ILLEGAL_INSTRUCTION)
   {
-    if ((tf->insn & 0xF83FFFFF) == 0x37B)
+    int fssr;
+    asm ("la %0, 1f; lw %0, 0(%0); b 2f; 1: fssr x0; 2:" : "=r"(fssr));
+
+    if (tf->insn == fssr)
+      terminate(1); // FP test on non-FP hardware.  "succeed."
+    else if ((tf->insn & 0xF83FFFFF) == 0x37B)
       emulate_vxcptsave(tf);
     else if ((tf->insn & 0xF83FFFFF) == 0x77B)
       emulate_vxcptrestore(tf);
@@ -219,7 +214,7 @@ out:
 
 void vm_boot(long test_addr, long seed)
 {
-  while (mfpcr(PCR_COREID) > 0); // only core 0 proceeds
+  while (mfpcr(PCR_HARTID) > 0); // only core 0 proceeds
 
   assert(SIZEOF_TRAPFRAME_T == sizeof(trapframe_t));
 
@@ -235,24 +230,21 @@ void vm_boot(long test_addr, long seed)
   freelist_nodes[MAX_TEST_PAGES-1].next = 0;
 
   assert(MAX_TEST_PAGES*2 < PTES_PER_PT);
-  l1pt[0] = (pte_t)l2pt | 1;
-  l2pt[0] = (pte_t)l3pt | 1;
+  l1pt[0] = (pte_t)l2pt | PTE_V | PTE_T;
+  l2pt[0] = (pte_t)l3pt | PTE_V | PTE_T;
   for (long i = 0; i < MAX_TEST_PAGES; i++)
-    l3pt[i] = l3pt[i+MAX_TEST_PAGES] = (i*PGSIZE) | 0x382;
+    l3pt[i] = l3pt[i+MAX_TEST_PAGES] = (i*PGSIZE) | PTE_SW | PTE_SR | PTE_SX | PTE_V;
 
   mtpcr(PCR_PTBR, l1pt);
   mtpcr(PCR_SR, mfpcr(PCR_SR) | SR_VM | SR_EF);
 
-  if (mfpcr(PCR_SR) & SR_EF)
-    asm volatile ("mtfsr x0");
-
   // relocate
   long adjustment = RELOC(0L), tmp;
   mtpcr(PCR_EVEC, (char*)&trap_entry + adjustment);
   asm volatile ("add sp, sp, %1; rdpc %0; addi %0, %0, 16; add %0, %0, %1; jr %0" : "=&r"(tmp) : "r"(adjustment));
 
   memset(RELOC(&l3pt[0]), 0, MAX_TEST_PAGES*sizeof(pte_t));
-  mtpcr(PCR_PTBR, l1pt);
+  mtpcr(PCR_FATC, 0);
 
   trapframe_t tf;
   memset(&tf, 0, sizeof(tf));