diff --git a/src/arch/x86_64/paging/mod.rs b/src/arch/x86_64/paging/mod.rs
index 43369b9b05e58ab8b95ac6f3dc16897669e93e39..f29fead812ffe3ba29797132a242800bc6a9ef7a 100644
--- a/src/arch/x86_64/paging/mod.rs
+++ b/src/arch/x86_64/paging/mod.rs
@@ -316,14 +316,14 @@ impl ActivePageTable {
             let p4_table = temporary_page.map_table_frame(backup.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE, self);
 
             // overwrite recursive mapping
-            self.p4_mut()[511].set(table.p4_frame.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE);
+            self.p4_mut()[::RECURSIVE_PAGE_PML4].set(table.p4_frame.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE);
             self.flush_all();
 
             // execute f in the new context
             f(self);
 
             // restore recursive mapping to original p4 table
-            p4_table[511].set(backup, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE);
+            p4_table[::RECURSIVE_PAGE_PML4].set(backup, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE);
             self.flush_all();
         }
 
@@ -347,7 +347,7 @@ impl InactivePageTable {
             // now we are able to zero the table
             table.zero();
             // set up recursive mapping for the table
-            table[511].set(frame.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE);
+            table[::RECURSIVE_PAGE_PML4].set(frame.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE);
         }
         temporary_page.unmap(active_table);
 
diff --git a/src/consts.rs b/src/consts.rs
index 52b2415b91cbdae178bce94ad440c1adcc525a29..5129460769acf89e1f999a7fe7c8fb66706b4304 100644
--- a/src/consts.rs
+++ b/src/consts.rs
@@ -5,12 +5,15 @@
 // The second from the top (510) PML4 is reserved for the kernel
     /// The size of a single PML4
     pub const PML4_SIZE: usize = 0x0000_0080_0000_0000;
+    pub const PML4_MASK: usize = 0x0000_ff80_0000_0000;
 
     /// Offset of recursive paging
     pub const RECURSIVE_PAGE_OFFSET: usize = (-(PML4_SIZE as isize)) as usize;
+    pub const RECURSIVE_PAGE_PML4: usize = (RECURSIVE_PAGE_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset of kernel
     pub const KERNEL_OFFSET: usize = RECURSIVE_PAGE_OFFSET - PML4_SIZE;
+    pub const KERNEL_PML4: usize = (KERNEL_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to kernel heap
     pub const KERNEL_HEAP_OFFSET: usize = KERNEL_OFFSET + PML4_SIZE/2;
@@ -25,6 +28,7 @@
 
     /// Offset to user image
     pub const USER_OFFSET: usize = 0;
+    pub const USER_PML4: usize = (USER_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user TCB
     pub const USER_TCB_OFFSET: usize = 0xB000_0000;
@@ -34,40 +38,52 @@
 
     /// Offset to user heap
     pub const USER_HEAP_OFFSET: usize = USER_OFFSET + PML4_SIZE;
+    pub const USER_HEAP_PML4: usize = (USER_HEAP_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user grants
     pub const USER_GRANT_OFFSET: usize = USER_HEAP_OFFSET + PML4_SIZE;
+    pub const USER_GRANT_PML4: usize = (USER_GRANT_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user stack
     pub const USER_STACK_OFFSET: usize = USER_GRANT_OFFSET + PML4_SIZE;
+    pub const USER_STACK_PML4: usize = (USER_STACK_OFFSET & PML4_MASK)/PML4_SIZE;
     /// Size of user stack
     pub const USER_STACK_SIZE: usize = 1024 * 1024; // 1 MB
 
     /// Offset to user sigstack
     pub const USER_SIGSTACK_OFFSET: usize = USER_STACK_OFFSET + PML4_SIZE;
+    pub const USER_SIGSTACK_PML4: usize = (USER_SIGSTACK_OFFSET & PML4_MASK)/PML4_SIZE;
     /// Size of user sigstack
     pub const USER_SIGSTACK_SIZE: usize = 256 * 1024; // 256 KB
 
     /// Offset to user TLS
     pub const USER_TLS_OFFSET: usize = USER_SIGSTACK_OFFSET + PML4_SIZE;
+    pub const USER_TLS_PML4: usize = (USER_TLS_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user temporary image (used when cloning)
     pub const USER_TMP_OFFSET: usize = USER_TLS_OFFSET + PML4_SIZE;
+    pub const USER_TMP_PML4: usize = (USER_TMP_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user temporary heap (used when cloning)
     pub const USER_TMP_HEAP_OFFSET: usize = USER_TMP_OFFSET + PML4_SIZE;
+    pub const USER_TMP_HEAP_PML4: usize = (USER_TMP_HEAP_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user temporary page for grants
     pub const USER_TMP_GRANT_OFFSET: usize = USER_TMP_HEAP_OFFSET + PML4_SIZE;
+    pub const USER_TMP_GRANT_PML4: usize = (USER_TMP_GRANT_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user temporary stack (used when cloning)
     pub const USER_TMP_STACK_OFFSET: usize = USER_TMP_GRANT_OFFSET + PML4_SIZE;
+    pub const USER_TMP_STACK_PML4: usize = (USER_TMP_STACK_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user temporary sigstack (used when cloning)
     pub const USER_TMP_SIGSTACK_OFFSET: usize = USER_TMP_STACK_OFFSET + PML4_SIZE;
+    pub const USER_TMP_SIGSTACK_PML4: usize = (USER_TMP_SIGSTACK_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset to user temporary tls (used when cloning)
     pub const USER_TMP_TLS_OFFSET: usize = USER_TMP_SIGSTACK_OFFSET + PML4_SIZE;
+    pub const USER_TMP_TLS_PML4: usize = (USER_TMP_TLS_OFFSET & PML4_MASK)/PML4_SIZE;
 
     /// Offset for usage in other temporary pages
     pub const USER_TMP_MISC_OFFSET: usize = USER_TMP_TLS_OFFSET + PML4_SIZE;
+    pub const USER_TMP_MISC_PML4: usize = (USER_TMP_MISC_OFFSET & PML4_MASK)/PML4_SIZE;
diff --git a/src/syscall/process.rs b/src/syscall/process.rs
index b64f3645b25fd54b8f67cff700ce3930a46a9c60..d3f72abfb33d037957b827b15b82a1f603d3333a 100644
--- a/src/syscall/process.rs
+++ b/src/syscall/process.rs
@@ -357,10 +357,10 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> {
 
             // Copy kernel mapping
             {
-                let frame = active_table.p4()[510].pointed_frame().expect("kernel table not mapped");
-                let flags = active_table.p4()[510].flags();
+                let frame = active_table.p4()[::KERNEL_PML4].pointed_frame().expect("kernel table not mapped");
+                let flags = active_table.p4()[::KERNEL_PML4].flags();
                 active_table.with(&mut new_table, &mut temporary_page, |mapper| {
-                    mapper.p4_mut()[510].set(frame, flags);
+                    mapper.p4_mut()[::KERNEL_PML4].set(frame, flags);
                 });
             }
 
@@ -381,30 +381,30 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> {
             if flags & CLONE_VM == CLONE_VM {
                 // Copy user image mapping, if found
                 if ! image.is_empty() {
-                    let frame = active_table.p4()[0].pointed_frame().expect("user image not mapped");
-                    let flags = active_table.p4()[0].flags();
+                    let frame = active_table.p4()[::USER_PML4].pointed_frame().expect("user image not mapped");
+                    let flags = active_table.p4()[::USER_PML4].flags();
                     active_table.with(&mut new_table, &mut temporary_page, |mapper| {
-                        mapper.p4_mut()[0].set(frame, flags);
+                        mapper.p4_mut()[::USER_PML4].set(frame, flags);
                     });
                 }
                 context.image = image;
 
                 // Copy user heap mapping, if found
                 if let Some(heap_shared) = heap_option {
-                    let frame = active_table.p4()[1].pointed_frame().expect("user heap not mapped");
-                    let flags = active_table.p4()[1].flags();
+                    let frame = active_table.p4()[::USER_HEAP_PML4].pointed_frame().expect("user heap not mapped");
+                    let flags = active_table.p4()[::USER_HEAP_PML4].flags();
                     active_table.with(&mut new_table, &mut temporary_page, |mapper| {
-                        mapper.p4_mut()[1].set(frame, flags);
+                        mapper.p4_mut()[::USER_HEAP_PML4].set(frame, flags);
                     });
                     context.heap = Some(heap_shared);
                 }
 
                 // Copy grant mapping
                 if ! grants.lock().is_empty() {
-                    let frame = active_table.p4()[2].pointed_frame().expect("user grants not mapped");
-                    let flags = active_table.p4()[2].flags();
+                    let frame = active_table.p4()[::USER_GRANT_PML4].pointed_frame().expect("user grants not mapped");
+                    let flags = active_table.p4()[::USER_GRANT_PML4].flags();
                     active_table.with(&mut new_table, &mut temporary_page, |mapper| {
-                        mapper.p4_mut()[2].set(frame, flags);
+                        mapper.p4_mut()[::USER_GRANT_PML4].set(frame, flags);
                     });
                 }
                 context.grants = grants;