diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index 107476001..bb6932f28 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h @@ -42,13 +42,16 @@ /// Page offset bits #define PAGE_BITS 12 +#define PAGE_2M_BITS 21 /// The size of a single page in bytes #define PAGE_SIZE ( 1L << PAGE_BITS) /// Mask the page address without page map flags and XD flag #if 0 #define PAGE_MASK ((~0L) << PAGE_BITS) +#define PAGE_2M_MASK (~0L) << PAGE_2M_BITS) #else #define PAGE_MASK (((~0L) << PAGE_BITS) & ~PG_XD) +#define PAGE_2M_MASK (((~0L) << PAGE_2M_BITS) & ~PG_XD) #endif #if 0 diff --git a/arch/x86/mm/page.c b/arch/x86/mm/page.c index ed5446ae9..62bfb9016 100644 --- a/arch/x86/mm/page.c +++ b/arch/x86/mm/page.c @@ -49,7 +49,7 @@ /* Note that linker symbols are not variables, they have no memory * allocated for maintaining a value, rather their address is their value. */ extern const void kernel_start; -//extern const void kernel_end; +extern const void kernel_end; /// This page is reserved for copying #define PAGE_TMP (PAGE_FLOOR((size_t) &kernel_start) - PAGE_SIZE) @@ -94,12 +94,24 @@ static uint8_t expect_zeroed_pages = 0; size_t virt_to_phys(size_t addr) { - size_t vpn = addr >> PAGE_BITS; // virtual page number - size_t entry = self[0][vpn]; // page table entry - size_t off = addr & ~PAGE_MASK; // offset within page - size_t phy = entry & PAGE_MASK; // physical page frame number + if ((addr > (size_t) &kernel_start) && + (addr <= PAGE_2M_FLOOR((size_t) &kernel_end))) + { + size_t vpn = addr >> (PAGE_2M_BITS); // virtual page number + size_t entry = self[1][vpn]; // page table entry + size_t off = addr & ~PAGE_2M_MASK; // offset within page + size_t phy = entry & PAGE_2M_MASK; // physical page frame number - return phy | off; + return phy | off; + + } else { + size_t vpn = addr >> PAGE_BITS; // virtual page number + size_t entry = self[0][vpn]; // page table entry + size_t off = addr & ~PAGE_MASK; // offset within page + size_t phy = entry & PAGE_MASK; // physical page frame number + + return phy | off; + } } /*