1 #include <console/console.h>
2 #include <smp/start_stop.h>
3 #include <cpu/p6/pgtbl.h>
5 static void paging_off(void)
9 "movl %%cr0, %%eax\n\t"
10 "andl $0x7FFFFFFF, %%eax\n\t"
11 "movl %%eax, %%cr0\n\t"
13 "movl %%cr4, %%eax\n\t"
14 "andl $0xFFFFFFDF, %%eax\n\t"
21 static void paging_on(void *pdp)
24 /* Load the page table address */
27 "movl %%cr4, %%eax\n\t"
28 "orl $0x00000020, %%eax\n\t"
29 "movl %%eax, %%cr4\n\t"
31 "movl %%cr0, %%eax\n\t"
32 "orl $0x80000000, %%eax\n\t"
33 "movl %%eax, %%cr0\n\t"
40 void *map_2M_page(int cpu_index, unsigned long page)
45 } __attribute__ ((packed));
49 } __attribute__ ((packed));
50 static struct pg_table pgtbl[CONFIG_MAX_CPUS] __attribute__ ((aligned(4096)));
51 static unsigned long mapped_window[CONFIG_MAX_CPUS];
55 if ((cpu_index < 0) || (cpu_index >= CONFIG_MAX_CPUS)) {
59 if (window != mapped_window[cpu_index]) {
63 /* Point the page directory pointers at the page directories */
64 memset(&pgtbl[cpu_index].pdp, 0, sizeof(pgtbl[cpu_index].pdp));
65 pd = pgtbl[cpu_index].pd;
66 pdp = pgtbl[cpu_index].pdp;
67 pdp[0].addr_lo = ((uint32_t)&pd[512*0])|1;
68 pdp[1].addr_lo = ((uint32_t)&pd[512*1])|1;
69 pdp[2].addr_lo = ((uint32_t)&pd[512*2])|1;
70 pdp[3].addr_lo = ((uint32_t)&pd[512*3])|1;
71 /* The first half of the page table is identity mapped */
72 for(i = 0; i < 1024; i++) {
73 pd[i].addr_lo = ((i & 0x3ff) << 21)| 0xE3;
76 /* The second half of the page table holds the mapped page */
77 for(i = 1024; i < 2048; i++) {
78 pd[i].addr_lo = ((window & 1) << 31) | ((i & 0x3ff) << 21) | 0xE3;
79 pd[i].addr_hi = (window >> 1);
83 mapped_window[cpu_index] = window;
86 result = (void *)(page << 21);
88 result = (void *)(0x80000000 | ((page & 0x3ff) << 21));