{
pte_t pte = 0;
- if(!vm_enabled)
+ // the address must be a canonical sign-extended VA_BITS-bit number
+ int shift = 8*sizeof(reg_t) - VA_BITS;
+ if (((sreg_t)addr << shift >> shift) != addr)
+ ;
+ else if(!vm_enabled)
{
if(addr < memsz)
pte = PTE_E | PTE_PERM | ((addr >> PGSHIFT) << PTE_PPN_SHIFT);
const reg_t PGSHIFT = 13;
const reg_t PGSIZE = 1 << PGSHIFT;
const reg_t PTIDXBITS = PGSHIFT - (sizeof(pte_t) == 8 ? 3 : 2);
+const reg_t VPN_BITS = PTIDXBITS * LEVELS;
const reg_t PPN_BITS = 8*sizeof(reg_t) - PGSHIFT;
+const reg_t VA_BITS = VPN_BITS + PGSHIFT;
// page table entry (PTE) fields
#define PTE_T 0x001 // Entry is a page Table descriptor