Parse ACPI MADT table
This commit is contained in:
@@ -40,6 +40,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#define PD_INDEX(va) (((va) >> 22) & 0x3FF)
|
||||
#define PT_INDEX(va) (((va) >> 12) & 0x3FF)
|
||||
#define PD_SHIFT 22
|
||||
#define PT_SHIFT 12
|
||||
|
||||
extern char __init_pd;
|
||||
|
||||
@@ -137,7 +139,7 @@ done:
|
||||
sl_unlock(&pd->sl);
|
||||
}
|
||||
|
||||
uptr_t mm_translate(struct page_dir *pd, uptr_t vaddr, uint32_t flags) {
|
||||
uptr_t mm_translate_v2p(struct page_dir *pd, uptr_t vaddr, uint32_t flags) {
|
||||
if (flags & PF_LOCK)
|
||||
sl_lock(&pd->sl);
|
||||
|
||||
@@ -162,6 +164,42 @@ done:
|
||||
return paddr;
|
||||
}
|
||||
|
||||
uptr_t mm_translate_p2v(struct page_dir *pd, uptr_t paddr, uint32_t flags) {
|
||||
uptr_t vaddr;
|
||||
bool_t found = 0;
|
||||
|
||||
if (flags & PF_LOCK)
|
||||
sl_lock(&pd->sl);
|
||||
|
||||
for (uint32_t pd_idx = 0; pd_idx < 1024; pd_idx++) {
|
||||
if (!(pd->pd[pd_idx] & PF_PRESENT))
|
||||
continue;
|
||||
|
||||
uptr_t pt_phys = pd->pd[pd_idx] & ~(PAGE_SIZE - 1);
|
||||
volatile uint32_t *pt = (volatile uint32_t *)(pt_phys + VIRT_BASE);
|
||||
|
||||
for (uint32_t pt_idx = 0; pt_idx < 1024; pt_idx++) {
|
||||
if (!(pt[pt_idx] & PF_PRESENT))
|
||||
continue;
|
||||
|
||||
uptr_t pt_addr = pt[pt_idx] & ~(PAGE_SIZE - 1);
|
||||
if (pt_addr == (paddr & ~(PAGE_SIZE - 1))) {
|
||||
vaddr = (pd_idx << PD_SHIFT) | (pt_idx << PT_SHIFT) | (paddr & (PAGE_SIZE - 1));
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found)
|
||||
break;
|
||||
}
|
||||
|
||||
if (flags & PF_LOCK)
|
||||
sl_unlock(&pd->sl);
|
||||
|
||||
return found ? vaddr : 0;
|
||||
}
|
||||
|
||||
void mm_load_pd(struct page_dir *pd) {
|
||||
uptr_t phys = (uptr_t)pd->pd - VIRT_BASE;
|
||||
__asm__ volatile ("movl %0, %%cr3" :: "r"(phys));
|
||||
|
||||
@@ -60,7 +60,8 @@ void mm_init(void);
|
||||
|
||||
void mm_map_page(struct page_dir *pd, uptr_t vaddr, uptr_t paddr, uint32_t flags);
|
||||
void mm_unmap_page(struct page_dir *pd, uptr_t vaddr, uint32_t flags);
|
||||
uptr_t mm_translate(struct page_dir *pd, uptr_t vaddr, uint32_t flags);
|
||||
uptr_t mm_translate_v2p(struct page_dir *pd, uptr_t vaddr, uint32_t flags);
|
||||
uptr_t mm_translate_p2v(struct page_dir *pd, uptr_t paddr, uint32_t flags);
|
||||
void mm_load_pd(struct page_dir *pd);
|
||||
struct page_dir *mm_get_kernel_pd(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user