fix/kernel: Make sure to page-align phys in vallocat API
This commit is contained in:
parent
9970bc53e4
commit
74ef29a2ea
2 changed files with 10 additions and 9 deletions
|
@ -71,7 +71,7 @@ void *valloc(vctx_t *ctx, size_t pages, uint64_t flags)
|
||||||
if (page == 0)
|
if (page == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vmap(ctx->pagemap, new->start + i * PAGE_SIZE, page, new->flags);
|
vmap(ctx->pagemap, new->start + (i * PAGE_SIZE), page, new->flags);
|
||||||
}
|
}
|
||||||
return (void *)new->start;
|
return (void *)new->start;
|
||||||
}
|
}
|
||||||
|
@ -96,7 +96,7 @@ void *valloc(vctx_t *ctx, size_t pages, uint64_t flags)
|
||||||
if (page == 0)
|
if (page == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vmap(ctx->pagemap, new->start + i * PAGE_SIZE, page, new->flags);
|
vmap(ctx->pagemap, new->start + (i * PAGE_SIZE), page, new->flags);
|
||||||
}
|
}
|
||||||
return (void *)new->start;
|
return (void *)new->start;
|
||||||
}
|
}
|
||||||
|
@ -110,6 +110,8 @@ void *vallocat(vctx_t *ctx, size_t pages, uint64_t flags, uint64_t phys)
|
||||||
vregion_t *new = NULL;
|
vregion_t *new = NULL;
|
||||||
vregion_t *last = ctx->root;
|
vregion_t *last = ctx->root;
|
||||||
|
|
||||||
|
phys = ALIGN_DOWN(phys, PAGE_SIZE);
|
||||||
|
|
||||||
while (region)
|
while (region)
|
||||||
{
|
{
|
||||||
if (region->next == NULL || region->start + (region->pages * PAGE_SIZE) < region->next->start)
|
if (region->next == NULL || region->start + (region->pages * PAGE_SIZE) < region->next->start)
|
||||||
|
@ -127,11 +129,11 @@ void *vallocat(vctx_t *ctx, size_t pages, uint64_t flags, uint64_t phys)
|
||||||
region->next = new;
|
region->next = new;
|
||||||
for (uint64_t i = 0; i < pages; i++)
|
for (uint64_t i = 0; i < pages; i++)
|
||||||
{
|
{
|
||||||
uint64_t page = phys + i * PAGE_SIZE;
|
uint64_t page = phys + (i * PAGE_SIZE);
|
||||||
if (page == 0)
|
if (page == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vmap(ctx->pagemap, new->start + i * PAGE_SIZE, page, new->flags);
|
vmap(ctx->pagemap, new->start + (i * PAGE_SIZE), page, new->flags);
|
||||||
}
|
}
|
||||||
return (void *)new->start;
|
return (void *)new->start;
|
||||||
}
|
}
|
||||||
|
@ -152,11 +154,11 @@ void *vallocat(vctx_t *ctx, size_t pages, uint64_t flags, uint64_t phys)
|
||||||
|
|
||||||
for (uint64_t i = 0; i < pages; i++)
|
for (uint64_t i = 0; i < pages; i++)
|
||||||
{
|
{
|
||||||
uint64_t page = phys + i * PAGE_SIZE;
|
uint64_t page = phys + (i * PAGE_SIZE);
|
||||||
if (page == 0)
|
if (page == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vmap(ctx->pagemap, new->start + i * PAGE_SIZE, page, new->flags);
|
vmap(ctx->pagemap, new->start + (i * PAGE_SIZE), page, new->flags);
|
||||||
}
|
}
|
||||||
return (void *)new->start;
|
return (void *)new->start;
|
||||||
}
|
}
|
||||||
|
@ -184,7 +186,7 @@ void vfree(vctx_t *ctx, void *ptr)
|
||||||
|
|
||||||
for (uint64_t i = 0; i < region->pages; i++)
|
for (uint64_t i = 0; i < region->pages; i++)
|
||||||
{
|
{
|
||||||
uint64_t virt = region->start + i * PAGE_SIZE;
|
uint64_t virt = region->start + (i * PAGE_SIZE);
|
||||||
uint64_t phys = virt_to_phys(kernel_pagemap, virt);
|
uint64_t phys = virt_to_phys(kernel_pagemap, virt);
|
||||||
|
|
||||||
if (phys != 0)
|
if (phys != 0)
|
||||||
|
|
|
@ -17,9 +17,8 @@ void acpi_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
acpi_rsdp_t *rsdp = (acpi_rsdp_t *)vallocat(kvm_ctx, 1, VALLOC_RW, rsdp_response->address);
|
acpi_rsdp_t *rsdp = (acpi_rsdp_t *)vallocat(kvm_ctx, 1, VALLOC_RW, rsdp_response->address);
|
||||||
log_early("Allocated RSDP at %p", rsdp);
|
|
||||||
|
|
||||||
if (memcmp(rsdp->signature, "RSD PTR", 7))
|
if (memcmp(rsdp->signature, "RSD PTR", 7) == 0)
|
||||||
kpanic(NULL, "Invalid RSDP signature!");
|
kpanic(NULL, "Invalid RSDP signature!");
|
||||||
|
|
||||||
if (rsdp->revision != 0)
|
if (rsdp->revision != 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue