u32_t reg_flags;
};
-typedef struct pagedir pg_dir_t;
-
struct pagedir {
void *pd_base;
u32_t pd_flags;
void* pg_frame_alloc_end(void);
void pg_frame_free(void*);
-int pg_dir_create(pg_dir_t**);
-int pg_dir_map(pg_dir_t*, const void*, const void*, const u32_t, const u32_t);
-int pg_dir_unmap(pg_dir_t*, const void*, const u32_t);
-
-void* pg_dir_get_kstack(pg_dir_t*);
-void* pg_dir_get_ustack(pg_dir_t*);
-
#endif /* __PAGING_H */
int task_prepare(struct task*, u32_t cr3, u32_t eip, u32_t esp0, u32_t esp, u32_t priv);
int task_switch(struct task*);
+/*
+ * Definitions, types, and prototypes related to paging
+ */
+
+#define ALIGNED(_v, _a) (!((_v) & (((_a) - 1))))
+#define ALIGN(_v, _a) (ALIGNED((_v), (_a)) ? (_v) : (((_v) & ~((_a) - 1)) + (_a)))
+
+#define PDPT_ALIGN 32
+#define PAGE_ALIGN 0x1000
+#define ARCH_ALIGN sizeof(void*)
+
+#define PAGE_SIZE 0x1000
+#define PAGE_SIZE_BIG 0x200000
+#define PAGE_SIZE_LARGE 0x400000
+#define PAGE_SIZE_HUGE 0x40000000
+
+#define PAGE_ATTR_PRESENT (1 << 0)
+#define PAGE_ATTR_WRITABLE (1 << 1)
+#define PAGE_ATTR_USER (1 << 2)
+#define PAGE_ATTR_WRITE_THRU (1 << 3)
+#define PAGE_ATTR_CACHE_DISABLE (1 << 4)
+#define PAGE_ATTR_ACCESSED (1 << 5)
+#define PAGE_ATTR_DIRTY (1 << 6)
+#define PAGE_ATTR_SIZE (1 << 7)
+#define PAGE_ATTR_GLOBAL (1 << 8)
+#define PAGE_ATTR_NO_EXEC 0 /* (1 << 63) */
+
+typedef struct pagedir pg_dir_t;
+
+int pg_dir_create(pg_dir_t**);
+int pg_dir_map(pg_dir_t*, const void*, const void*, const u32_t, const u32_t);
+int pg_dir_unmap(pg_dir_t*, const void*, const u32_t);
+void* pg_dir_get_pdbr(pg_dir_t*);
+
+void* pg_dir_get_kstack(pg_dir_t*);
+void* pg_dir_get_ustack(pg_dir_t*);
+
#endif /* __ARCH_H */