Index: arch/amd64/include/asm.h
===================================================================
--- arch/amd64/include/asm.h	(revision e3b9572bf65a7338c20a539433408504a314d0dd)
+++ arch/amd64/include/asm.h	(revision de25b6f1041f235871f2c6ea0830caa7be2d4449)
@@ -37,8 +37,11 @@
 void asm_fake_loop(__u32 t);
 
-/* TODO: implement the real stuff */
 static inline __address get_stack_base(void)
 {
-	return NULL;
+	__address v;
+	
+	__asm__ volatile ("andq %%rsp, %0\n" : "=r" (v) : "0" (~((__u64)STACK_SIZE-1)));
+	
+	return v;
 }
 
@@ -52,7 +55,7 @@
 
 	asm (
-		"mov %0, %%dx;"
+		"mov %1, %%dx;"
 		"inb %%dx,%%al;"
-		"mov %%al, %1;"
+		"mov %%al, %0;"
 		:"=m"(out)
 		:"m"(port)
Index: arch/amd64/include/mm/page.h
===================================================================
--- arch/amd64/include/mm/page.h	(revision e3b9572bf65a7338c20a539433408504a314d0dd)
+++ arch/amd64/include/mm/page.h	(revision de25b6f1041f235871f2c6ea0830caa7be2d4449)
@@ -39,43 +39,93 @@
 
 #ifndef __ASM__
-# define KA2PA(x)	(((__address) (x)) + 0x80000000)
-# define PA2KA(x)	(((__address) (x)) - 0x80000000)
+# define KA2PA(x)      (((__address) (x)) + 0x80000000)
+# define PA2KA(x)      (((__address) (x)) - 0x80000000)
 #else
-# define KA2PA(x)	((x) + 0x80000000)
-# define PA2KA(x)	((x)) - 0x80000000)
+# define KA2PA(x)      ((x) + 0x80000000)
+//# define PA2KA(x)      ((x)) - 0x80000000)
 #endif
 
-#define PTL0_INDEX_ARCH(vaddr)		0
-#define PTL1_INDEX_ARCH(vaddr)		0
-#define PTL2_INDEX_ARCH(vaddr)		0
-#define PTL3_INDEX_ARCH(vaddr)		0
+#define PTL0_INDEX_ARCH(vaddr)	(((vaddr)>>39)&0x1ff)
+#define PTL1_INDEX_ARCH(vaddr)	(((vaddr)>>30)&0x1ff)
+#define PTL2_INDEX_ARCH(vaddr)	(((vaddr)>>21)&0x1ff)
+#define PTL3_INDEX_ARCH(vaddr)	(((vaddr)>>12)&0x1ff)
 
-#define GET_PTL0_ADDRESS_ARCH()		0
-#define SET_PTL0_ADDRESS_ARCH(ptl0)
+#define GET_PTL0_ADDRESS_ARCH()			((pte_t *) read_cr3())
+#define GET_PTL1_ADDRESS_ARCH(ptl0, i)		((pte_t *) ((((__u64) ((pte_t *)(ptl0))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl0))[(i)].addr_32_51)<<32 )))
+#define GET_PTL2_ADDRESS_ARCH(ptl1, i)		((pte_t *) ((((__u64) ((pte_t *)(ptl1))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl1))[(i)].addr_32_51)<<32 )))
+#define GET_PTL3_ADDRESS_ARCH(ptl2, i)		((pte_t *) ((((__u64) ((pte_t *)(ptl2))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl2))[(i)].addr_32_51)<<32 )))
+#define GET_FRAME_ADDRESS_ARCH(ptl3, i)		((__address *) ((((__u64) ((pte_t *)(ptl3))[(i)].addr_12_31)<<12) | (((__u64) ((pte_t *)(ptl3))[(i)].addr_32_51)<<32 )))
 
-#define GET_PTL1_ADDRESS_ARCH(ptl0, i)		((pte_t *) 0)
-#define GET_PTL2_ADDRESS_ARCH(ptl1, i)		((pte_t *) 0)
-#define GET_PTL3_ADDRESS_ARCH(ptl2, i)		((pte_t *) 0)
-#define GET_FRAME_ADDRESS_ARCH(ptl3, i)		((pte_t *) 0)
+#define SET_PTL0_ADDRESS_ARCH(ptl0)		(write_cr3((__address) (ptl0)))
+#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)	set_pt_addr((pte_t *)(ptl0), (index_t)(i), a)
+#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)       set_pt_addr((pte_t *)(ptl1), (index_t)(i), a)
+#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)       set_pt_addr((pte_t *)(ptl2), (index_t)(i), a)
+#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)	set_pt_addr((pte_t *)(ptl3), (index_t)(i), a)
 
-#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a)
-#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
-#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
-#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a)
+#define GET_PTL1_FLAGS_ARCH(ptl0, i)		get_pt_flags((pte_t *)(ptl0), (index_t)(i))
+#define GET_PTL2_FLAGS_ARCH(ptl1, i)		get_pt_flags((pte_t *)(ptl1), (index_t)(i))
+#define GET_PTL3_FLAGS_ARCH(ptl2, i)		get_pt_flags((pte_t *)(ptl2), (index_t)(i))
+#define GET_FRAME_FLAGS_ARCH(ptl3, i)		get_pt_flags((pte_t *)(ptl3), (index_t)(i))
 
-#define GET_PTL1_FLAGS_ARCH(ptl0, i)		0
-#define GET_PTL2_FLAGS_ARCH(ptl1, i)		0
-#define GET_PTL3_FLAGS_ARCH(ptl2, i)		0
-#define GET_FRAME_FLAGS_ARCH(ptl3, i)		0
-
-#define SET_PTL1_FLAGS_ARCH(ptl0, i, x)
-#define SET_PTL2_FLAGS_ARCH(ptl1, i, x)
-#define SET_PTL3_FLAGS_ARCH(ptl2, i, x)
-#define SET_FRAME_FLAGS_ARCH(ptl3, i, x)
+#define SET_PTL1_FLAGS_ARCH(ptl0, i, x)		set_pt_flags((pte_t *)(ptl0), (index_t)(i), (x))
+#define SET_PTL2_FLAGS_ARCH(ptl1, i, x)         set_pt_flags((pte_t *)(ptl1), (index_t)(i), (x))
+#define SET_PTL3_FLAGS_ARCH(ptl2, i, x)         set_pt_flags((pte_t *)(ptl2), (index_t)(i), (x))
+#define SET_FRAME_FLAGS_ARCH(ptl3, i, x)	set_pt_flags((pte_t *)(ptl3), (index_t)(i), (x))
 
 #ifndef __ASM__
+
+typedef struct page_specifier pte_t;
+
+struct page_specifier {
+	unsigned present : 1;
+	unsigned writeable : 1;
+	unsigned uaccessible : 1;
+	unsigned page_write_through : 1;
+	unsigned page_cache_disable : 1;
+	unsigned accessed : 1;
+	unsigned dirty : 1;
+	unsigned unused: 1;
+	unsigned global : 1;
+	unsigned avl : 3;
+	unsigned addr_12_31 : 30;
+	unsigned addr_32_51 : 21;
+	unsigned no_execute : 1;
+} __attribute__ ((packed));
+
+static inline int get_pt_flags(pte_t *pt, index_t i)
+{
+	pte_t *p = &pt[i];
+	
+	return (
+		(!p->page_cache_disable)<<PAGE_CACHEABLE_SHIFT |
+		(!p->present)<<PAGE_PRESENT_SHIFT |
+		p->uaccessible<<PAGE_USER_SHIFT |
+		1<<PAGE_READ_SHIFT |
+		p->writeable<<PAGE_WRITE_SHIFT |
+		(!p->no_execute)<<PAGE_EXEC_SHIFT
+	);
+}
+
+static inline void set_pt_addr(pte_t *pt, index_t i, __address a)
+{
+	pte_t *p = &pt[i];
+
+	p->addr_12_31 = (a >> 12) & 0xfffff;
+	p->addr_32_51 = a >> 32;
+}
+
+static inline void set_pt_flags(pte_t *pt, index_t i, int flags)
+{
+	pte_t *p = &pt[i];
+	
+	p->page_cache_disable = !(flags & PAGE_CACHEABLE);
+	p->present = !(flags & PAGE_NOT_PRESENT);
+	p->uaccessible = (flags & PAGE_USER) != 0;
+	p->writeable = (flags & PAGE_WRITE) != 0;
+	p->no_execute = (flags & PAGE_EXEC) == 0;
+}
+
 extern void page_arch_init(void);
 
-typedef __u64 pte_t;
 #endif
 
