/kernel/trunk/generic/include/mm/page.h |
---|
55,14 → 55,57 |
#define PAGE_WRITE (1<<PAGE_WRITE_SHIFT) |
#define PAGE_EXEC (1<<PAGE_EXEC_SHIFT) |
struct page_operations { |
void (* mapping_insert)(__address page, __address frame, int flags, __address root); |
pte_t *(* mapping_find)(__address page, __address root); |
}; |
typedef struct page_operations page_operations_t; |
/* |
* This is the generic 4-level page table interface. |
* Architectures are supposed to implement *_ARCH macros. |
*/ |
extern page_operations_t *page_operations; |
/* |
* These macros process vaddr and extract those portions |
* of it that function as indices to respective page tables. |
*/ |
#define PTL0_INDEX(vaddr) PTL0_INDEX_ARCH(vaddr) |
#define PTL1_INDEX(vaddr) PTL1_INDEX_ARCH(vaddr) |
#define PTL2_INDEX(vaddr) PTL2_INDEX_ARCH(vaddr) |
#define PTL3_INDEX(vaddr) PTL3_INDEX_ARCH(vaddr) |
#define GET_PTL0_ADDRESS() GET_PTL0_ADDRESS_ARCH() |
#define SET_PTL0_ADDRESS(ptl0) SET_PTL0_ADDRESS_ARCH(ptl0) |
/* |
* These macros traverse the 4-level tree of page tables, |
* each descending by one level. |
*/ |
#define GET_PTL1_ADDRESS(ptl0, i) GET_PTL1_ADDRESS_ARCH(ptl0, i) |
#define GET_PTL2_ADDRESS(ptl1, i) GET_PTL2_ADDRESS_ARCH(ptl1, i) |
#define GET_PTL3_ADDRESS(ptl2, i) GET_PTL3_ADDRESS_ARCH(ptl2, i) |
#define GET_FRAME_ADDRESS(ptl3, i) GET_FRAME_ADDRESS_ARCH(ptl3, i) |
/* |
* These macros are provided to change shape of the 4-level |
* tree of page tables on respective level. |
*/ |
#define SET_PTL1_ADDRESS(ptl0, i, a) SET_PTL1_ADDRESS_ARCH(ptl0, i, a) |
#define SET_PTL2_ADDRESS(ptl1, i, a) SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS(ptl2, i, a) SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS(ptl3, i, a) SET_FRAME_ADDRESS_ARCH(ptl3, i, a) |
/* |
* These macros are provided to query various flags within the page tables. |
*/ |
#define GET_PTL1_FLAGS(ptl0, i) GET_PTL1_FLAGS_ARCH(ptl0, i) |
#define GET_PTL2_FLAGS(ptl1, i) GET_PTL2_FLAGS_ARCH(ptl1, i) |
#define GET_PTL3_FLAGS(ptl2, i) GET_PTL3_FLAGS_ARCH(ptl2, i) |
#define GET_FRAME_FLAGS(ptl3, i) GET_FRAME_FLAGS_ARCH(ptl3, i) |
/* |
* These macros are provided to set/clear various flags within the page tables. |
*/ |
#define SET_PTL1_FLAGS(ptl0, i, x) SET_PTL1_FLAGS_ARCH(ptl0, i, x) |
#define SET_PTL2_FLAGS(ptl1, i, x) SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS(ptl2, i, x) SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS(ptl3, i, x) SET_FRAME_FLAGS_ARCH(ptl3, i, x) |
extern void page_init(void); |
extern void page_mapping_insert(__address page, __address frame, int flags, __address root); |
extern pte_t *page_mapping_find(__address page, __address root); |
/kernel/trunk/generic/src/mm/page.c |
---|
33,11 → 33,7 |
#include <typedefs.h> |
#include <arch/asm.h> |
#include <memstr.h> |
#include <debug.h> |
/** Virtual operations for page subsystem. */ |
page_operations_t *page_operations = NULL; |
void page_init(void) |
{ |
page_arch_init(); |
77,10 → 73,40 |
*/ |
void page_mapping_insert(__address page, __address frame, int flags, __address root) |
{ |
ASSERT(page_operations); |
ASSERT(page_operations->mapping_insert); |
page_operations->mapping_insert(page, frame, flags, root); |
pte_t *ptl0, *ptl1, *ptl2, *ptl3; |
__address newpt; |
ptl0 = (pte_t *) PA2KA(root ? root : (__address) GET_PTL0_ADDRESS()); |
if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { |
newpt = frame_alloc(FRAME_KA, ONE_FRAME); |
memsetb(newpt, PAGE_SIZE, 0); |
SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); |
SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
} |
ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { |
newpt = frame_alloc(FRAME_KA, ONE_FRAME); |
memsetb(newpt, PAGE_SIZE, 0); |
SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); |
SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
} |
ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { |
newpt = frame_alloc(FRAME_KA, ONE_FRAME); |
memsetb(newpt, PAGE_SIZE, 0); |
SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); |
SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
} |
ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); |
SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags); |
} |
/** Find mapping for virtual page |
94,8 → 120,24 |
*/ |
pte_t *page_mapping_find(__address page, __address root) |
{ |
ASSERT(page_operations); |
ASSERT(page_operations->mapping_find); |
pte_t *ptl0, *ptl1, *ptl2, *ptl3; |
return page_operations->mapping_find(page, root); |
ptl0 = (pte_t *) PA2KA(root ? root : (__address) GET_PTL0_ADDRESS()); |
if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) |
return NULL; |
ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) |
return NULL; |
ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) |
return NULL; |
ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
return &ptl3[PTL3_INDEX(page)]; |
} |
/kernel/trunk/generic/src/mm/vm.c |
---|
32,7 → 32,6 |
#include <mm/tlb.h> |
#include <mm/heap.h> |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/asid.h> |
#include <arch/mm/vm.h> |
#include <arch/types.h> |
/kernel/trunk/generic/src/main/main.c |
---|
46,7 → 46,6 |
#include <mm/heap.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <mm/tlb.h> |
#include <mm/vm.h> |
#include <synch/waitq.h> |
/kernel/trunk/arch/ia32/src/mm/page.c |
---|
27,7 → 27,6 |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
49,8 → 48,6 |
__address cur; |
if (config.cpu_active == 1) { |
page_operations = &page_pt_operations; |
dba = frame_alloc(FRAME_KA | FRAME_PANIC, ONE_FRAME); |
memsetb(dba, PAGE_SIZE, 0); |
/kernel/trunk/arch/ia32/Makefile.inc |
---|
77,11 → 77,6 |
CONFIG_ACPI = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
## Accepted configuration directives |
# |
/kernel/trunk/arch/amd64/src/mm/page.c |
---|
27,7 → 27,6 |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
45,8 → 44,6 |
__address cur; |
if (config.cpu_active == 1) { |
page_operations = &page_pt_operations; |
dba = frame_alloc(FRAME_KA | FRAME_PANIC, ONE_FRAME); |
memsetb(dba, PAGE_SIZE, 0); |
/kernel/trunk/arch/amd64/Makefile.inc |
---|
58,11 → 58,6 |
CONFIG_ACPI = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
## Accepted configuration directives |
# |
/kernel/trunk/arch/ia64/include/mm/page.h |
---|
37,6 → 37,8 |
#define KA2PA(x) ((__address) (x)) |
#define PA2KA(x) ((__address) (x)) |
#define page_arch_init() ; |
/* |
* Implementation of generic 4-level page table interface. |
* TODO: this is a fake implementation provided to satisfy the compiler |
68,6 → 70,4 |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) |
extern void page_arch_init(void); |
#endif |
/kernel/trunk/arch/ia64/Makefile.inc |
---|
42,11 → 42,6 |
LFLAGS += -EL |
AFLAGS += -mconstant-gp |
## Compile with page hash table support. |
# |
CONFIG_PAGE_HT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/start.S \ |
arch/$(ARCH)/src/asm.S \ |
59,5 → 54,4 |
arch/$(ARCH)/src/ivt.S \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/drivers/it.c |
/kernel/trunk/arch/ia64/src/mm/page.c |
---|
File deleted |
/kernel/trunk/arch/ppc32/Makefile.inc |
---|
45,11 → 45,6 |
CONFIG_OFW = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/console.c \ |
arch/$(ARCH)/src/context.S \ |
/kernel/trunk/arch/ppc32/src/mm/page.c |
---|
26,14 → 26,12 |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <arch/types.h> |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <arch/types.h> |
void page_arch_init(void) |
{ |
page_operations = &page_pt_operations; |
} |
/kernel/trunk/arch/mips32/Makefile.inc |
---|
46,12 → 46,6 |
CFLAGS += -mno-abicalls -G 0 -fno-zero-initialized-in-bss |
DEFS += -DMACHINE=${MIPS_MACHINE} -DKERNEL_LOAD_ADDRESS=${KERNEL_LOAD_ADDRESS} -DINIT_ADDRESS=${INIT_ADDRESS} -DINIT_SIZE=${INIT_SIZE} |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
## Accepted MACHINEs |
# |
/kernel/trunk/arch/mips32/src/mm/page.c |
---|
26,12 → 26,11 |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <arch/types.h> |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <arch/types.h> |
#include <memstr.h> |
pte_t *PTL0 = NULL; |
39,8 → 38,6 |
void page_arch_init(void) |
{ |
__address ptl0; |
page_operations = &page_pt_operations; |
ptl0 = frame_alloc(FRAME_KA | FRAME_PANIC, ONE_FRAME); |
memsetb(ptl0, FRAME_SIZE, 0); |
/kernel/trunk/arch/sparc64/src/mm/page.c |
---|
27,9 → 27,7 |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_ht.h> |
void page_arch_init(void) |
{ |
page_operations = &page_ht_operations; |
} |
/kernel/trunk/arch/sparc64/Makefile.inc |
---|
46,11 → 46,6 |
CONFIG_OFW = y |
## Compile with page hash table support. |
# |
CONFIG_PAGE_HT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/asm.S \ |
/kernel/trunk/genarch/include/mm/page_pt.h |
---|
File deleted |
/kernel/trunk/genarch/include/mm/page_ht.h |
---|
File deleted |
/kernel/trunk/genarch/src/mm/page_ht.c |
---|
File deleted |
/kernel/trunk/genarch/src/mm/page_pt.c |
---|
File deleted |
/kernel/trunk/genarch/Makefile.inc |
---|
37,11 → 37,3 |
genarch/src/acpi/acpi.c \ |
genarch/src/acpi/matd.c |
endif |
ifeq ($(CONFIG_PAGE_PT),y) |
GENARCH_SOURCES += \ |
genarch/src/mm/page_pt.c |
endif |
ifeq ($(CONFIG_PAGE_HT),y) |
GENARCH_SOURCES += \ |
genarch/src/mm/page_ht.c |
endif |