summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@eecs.berkeley.edu>2014-01-13 16:27:10 -0800
committerAndrew Waterman <waterman@eecs.berkeley.edu>2014-01-13 16:27:10 -0800
commit22354ec7c185d53b651a845b69c13d87b65f98c7 (patch)
tree3d3119a26bd49286a0b185a379a74769ad4d78e6
parent75d8f53ef210c29495410503529db2ae5c73964d (diff)
downloadenv-22354ec7c185d53b651a845b69c13d87b65f98c7.zip
env-22354ec7c185d53b651a845b69c13d87b65f98c7.tar.gz
env-22354ec7c185d53b651a845b69c13d87b65f98c7.tar.bz2
Assume pc-relative addressing
-rw-r--r--v/entry.S2
-rw-r--r--v/vm.c50
2 files changed, 26 insertions, 26 deletions
diff --git a/v/entry.S b/v/entry.S
index 8dbf248..7b9230d 100644
--- a/v/entry.S
+++ b/v/entry.S
@@ -143,7 +143,7 @@ trap_entry:
bnez ra, 1f
# no, so start at the top of the stack
- la x2,stack_top+MAX_TEST_PAGES*PGSIZE-SIZEOF_TRAPFRAME_T
+ la x2,stack_top-SIZEOF_TRAPFRAME_T
jal save_tf
move sp,x2
csrs status,SR_EI
diff --git a/v/vm.c b/v/vm.c
index 2c016ae..415c7e5 100644
--- a/v/vm.c
+++ b/v/vm.c
@@ -62,18 +62,18 @@ void evict(unsigned long addr)
assert(addr >= PGSIZE && addr < RELOC(0L));
addr = addr/PGSIZE*PGSIZE;
- freelist_t* node = RELOC(&user_mapping[addr/PGSIZE]);
+ freelist_t* node = &user_mapping[addr/PGSIZE];
if (node->addr)
{
memcpy((void*)RELOC(addr), (void*)addr, PGSIZE);
- RELOC(&user_mapping[addr/PGSIZE])->addr = 0;
+ user_mapping[addr/PGSIZE].addr = 0;
- if (*RELOC(&freelist_tail) == 0)
- *RELOC(&freelist_head) = *RELOC(&freelist_tail) = node;
+ if (freelist_tail == 0)
+ freelist_head = freelist_tail = node;
else
{
- (*RELOC(&freelist_tail))->next = node;
- *RELOC(&freelist_tail) = node;
+ freelist_tail->next = node;
+ freelist_tail = node;
}
}
}
@@ -83,17 +83,17 @@ void handle_fault(unsigned long addr)
assert(addr >= PGSIZE && addr < RELOC(0L));
addr = addr/PGSIZE*PGSIZE;
- freelist_t* node = *RELOC(&freelist_head);
+ freelist_t* node = freelist_head;
assert(node);
- *RELOC(&freelist_head) = node->next;
- if (*RELOC(&freelist_head) == *RELOC(&freelist_tail))
- *RELOC(&freelist_tail) = 0;
+ freelist_head = node->next;
+ if (freelist_head == freelist_tail)
+ freelist_tail = 0;
- *RELOC(&l3pt[addr/PGSIZE]) = node->addr | PTE_UW | PTE_UR | PTE_UX | PTE_SW | PTE_SR | PTE_SX | PTE_V;
+ l3pt[addr/PGSIZE] = node->addr | PTE_UW | PTE_UR | PTE_UX | PTE_SW | PTE_SR | PTE_SX | PTE_V;
write_csr(fatc, 0);
- assert(RELOC(&user_mapping[addr/PGSIZE])->addr == 0);
- *RELOC(&user_mapping[addr/PGSIZE]) = *node;
+ assert(user_mapping[addr/PGSIZE].addr == 0);
+ user_mapping[addr/PGSIZE] = *node;
memcpy((void*)addr, (void*)RELOC(addr), PGSIZE);
__builtin___clear_cache(0,0);
@@ -233,17 +233,6 @@ void vm_boot(long test_addr, long seed)
assert(SIZEOF_TRAPFRAME_T == sizeof(trapframe_t));
- seed = 1 + (seed % MAX_TEST_PAGES);
- freelist_head = RELOC(&freelist_nodes[0]);
- freelist_tail = RELOC(&freelist_nodes[MAX_TEST_PAGES-1]);
- for (long i = 0; i < MAX_TEST_PAGES; i++)
- {
- freelist_nodes[i].addr = (MAX_TEST_PAGES+i)*PGSIZE;
- freelist_nodes[i].next = RELOC(&freelist_nodes[i+1]);
- seed = LFSR_NEXT(seed);
- }
- freelist_nodes[MAX_TEST_PAGES-1].next = 0;
-
assert(MAX_TEST_PAGES*2 < PTES_PER_PT);
l1pt[0] = (pte_t)l2pt | PTE_V | PTE_T;
l2pt[0] = (pte_t)l3pt | PTE_V | PTE_T;
@@ -263,9 +252,20 @@ void vm_boot(long test_addr, long seed)
: "=&r"(tmp)
: "r"(adjustment));
- memset(RELOC(&l3pt[0]), 0, MAX_TEST_PAGES*sizeof(pte_t));
+ memset(l3pt, 0, MAX_TEST_PAGES*sizeof(pte_t));
write_csr(fatc, 0);
+ seed = 1 + (seed % MAX_TEST_PAGES);
+ freelist_head = &freelist_nodes[0];
+ freelist_tail = &freelist_nodes[MAX_TEST_PAGES-1];
+ for (long i = 0; i < MAX_TEST_PAGES; i++)
+ {
+ freelist_nodes[i].addr = (MAX_TEST_PAGES+i)*PGSIZE;
+ freelist_nodes[i].next = &freelist_nodes[i+1];
+ seed = LFSR_NEXT(seed);
+ }
+ freelist_nodes[MAX_TEST_PAGES-1].next = 0;
+
trapframe_t tf;
memset(&tf, 0, sizeof(tf));
tf.sr = SR_PEI | ((1 << IRQ_COP) << SR_IM_SHIFT) | SR_EF | SR_EA | SR_S | SR_U64 | SR_S64 | SR_VM;