mirror of
https://github.com/hermitcore/libhermit.git
synced 2025-03-09 00:00:03 +01:00
revise virt_to_phys to supporzt huge pages
- the kernel is mapped with 2M pages - all other parts use 4K pages - now, virt_to_phys checks, which type of pages is used
This commit is contained in:
parent
c6803ecb19
commit
dae96b1520
2 changed files with 21 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Reference in a new issue