Parse ACPI MADT table

This commit is contained in:
2025-12-14 01:18:57 +01:00
parent 56f997ba38
commit 9424083576
10 changed files with 461 additions and 8 deletions

View File

@@ -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));

View File

@@ -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);