static void terminate(int code)
{
while (mtpcr(PCR_TOHOST, code));
+ while (1);
}
#define stringify1(x) #x
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)))
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;
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);
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));
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));