verbose printing and sanity checking functions.
This commit is contained in:
parent
a02d9aae0a
commit
5cf59f9225
|
@ -414,7 +414,7 @@ PUBLIC int pt_writemap(pt_t *pt, vir_bytes v, phys_bytes physaddr,
|
||||||
{
|
{
|
||||||
/* Write mapping into page table. Allocate a new page table if necessary. */
|
/* Write mapping into page table. Allocate a new page table if necessary. */
|
||||||
/* Page directory and table entries for this virtual address. */
|
/* Page directory and table entries for this virtual address. */
|
||||||
int p, pages, pde;
|
int p, pages, pdecheck;
|
||||||
int finalpde;
|
int finalpde;
|
||||||
int verify = 0;
|
int verify = 0;
|
||||||
|
|
||||||
|
@ -446,21 +446,21 @@ PUBLIC int pt_writemap(pt_t *pt, vir_bytes v, phys_bytes physaddr,
|
||||||
* to undo our work properly. Walk the range in page-directory-entry
|
* to undo our work properly. Walk the range in page-directory-entry
|
||||||
* sized leaps.
|
* sized leaps.
|
||||||
*/
|
*/
|
||||||
for(pde = I386_VM_PDE(v); pde <= finalpde; pde++) {
|
for(pdecheck = I386_VM_PDE(v); pdecheck <= finalpde; pdecheck++) {
|
||||||
vm_assert(pde >= 0 && pde < I386_VM_DIR_ENTRIES);
|
vm_assert(pdecheck >= 0 && pdecheck < I386_VM_DIR_ENTRIES);
|
||||||
if(pt->pt_dir[pde] & I386_VM_BIGPAGE) {
|
if(pt->pt_dir[pdecheck] & I386_VM_BIGPAGE) {
|
||||||
printf("pt_writemap: trying to write 0x%lx into 0x%lx\n",
|
printf("pt_writemap: trying to write 0x%lx into 0x%lx\n",
|
||||||
physaddr, v);
|
physaddr, v);
|
||||||
vm_panic("pt_writemap: BIGPAGE found", NO_NUM);
|
vm_panic("pt_writemap: BIGPAGE found", NO_NUM);
|
||||||
}
|
}
|
||||||
if(!(pt->pt_dir[pde] & I386_VM_PRESENT)) {
|
if(!(pt->pt_dir[pdecheck] & I386_VM_PRESENT)) {
|
||||||
int r;
|
int r;
|
||||||
if(verify) {
|
if(verify) {
|
||||||
printf("pt_writemap verify: no pde %d\n", pde);
|
printf("pt_writemap verify: no pde %d\n", pdecheck);
|
||||||
return EFAULT;
|
return EFAULT;
|
||||||
}
|
}
|
||||||
vm_assert(!pt->pt_dir[pde]);
|
vm_assert(!pt->pt_dir[pdecheck]);
|
||||||
if((r=pt_ptalloc(pt, pde, flags)) != OK) {
|
if((r=pt_ptalloc(pt, pdecheck, flags)) != OK) {
|
||||||
/* Couldn't do (complete) mapping.
|
/* Couldn't do (complete) mapping.
|
||||||
* Don't bother freeing any previously
|
* Don't bother freeing any previously
|
||||||
* allocated page tables, they're
|
* allocated page tables, they're
|
||||||
|
@ -468,11 +468,11 @@ PUBLIC int pt_writemap(pt_t *pt, vir_bytes v, phys_bytes physaddr,
|
||||||
* and pt_ptalloc leaves the directory
|
* and pt_ptalloc leaves the directory
|
||||||
* and other data in a consistent state.
|
* and other data in a consistent state.
|
||||||
*/
|
*/
|
||||||
printf("pt_writemap: pt_ptalloc failed\n", pde);
|
printf("pt_writemap: pt_ptalloc failed\n", pdecheck);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vm_assert(pt->pt_dir[pde] & I386_VM_PRESENT);
|
vm_assert(pt->pt_dir[pdecheck] & I386_VM_PRESENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now write in them. */
|
/* Now write in them. */
|
||||||
|
@ -531,6 +531,50 @@ PUBLIC int pt_writemap(pt_t *pt, vir_bytes v, phys_bytes physaddr,
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* pt_checkrange *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC int pt_checkrange(pt_t *pt, vir_bytes v, size_t bytes,
|
||||||
|
int write)
|
||||||
|
{
|
||||||
|
int p, pages, pde;
|
||||||
|
|
||||||
|
vm_assert(!(bytes % I386_PAGE_SIZE));
|
||||||
|
|
||||||
|
pages = bytes / I386_PAGE_SIZE;
|
||||||
|
|
||||||
|
for(p = 0; p < pages; p++) {
|
||||||
|
u32_t entry;
|
||||||
|
int pde = I386_VM_PDE(v);
|
||||||
|
int pte = I386_VM_PTE(v);
|
||||||
|
|
||||||
|
vm_assert(!(v % I386_PAGE_SIZE));
|
||||||
|
vm_assert(pte >= 0 && pte < I386_VM_PT_ENTRIES);
|
||||||
|
vm_assert(pde >= 0 && pde < I386_VM_DIR_ENTRIES);
|
||||||
|
|
||||||
|
/* Page table has to be there. */
|
||||||
|
if(!(pt->pt_dir[pde] & I386_VM_PRESENT))
|
||||||
|
return EFAULT;
|
||||||
|
|
||||||
|
/* Make sure page directory entry for this page table
|
||||||
|
* is marked present and page table entry is available.
|
||||||
|
*/
|
||||||
|
vm_assert((pt->pt_dir[pde] & I386_VM_PRESENT) && pt->pt_pt[pde]);
|
||||||
|
|
||||||
|
if(!(pt->pt_pt[pde][pte] & I386_VM_PRESENT)) {
|
||||||
|
return EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(write && !(pt->pt_pt[pde][pte] & I386_VM_WRITE)) {
|
||||||
|
return EFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
|
v += I386_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* pt_new *
|
* pt_new *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
|
|
|
@ -40,6 +40,46 @@ PUBLIC vir_bytes arch_map2vir(struct vmproc *vmp, vir_bytes addr)
|
||||||
return addr - datastart;
|
return addr - datastart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* arch_map2str *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC char *arch_map2str(struct vmproc *vmp, vir_bytes addr)
|
||||||
|
{
|
||||||
|
static char bufstr[100];
|
||||||
|
vir_bytes textstart = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys);
|
||||||
|
vir_bytes textend = textstart + CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_len);
|
||||||
|
vir_bytes datastart = CLICK2ABS(vmp->vm_arch.vm_seg[D].mem_phys);
|
||||||
|
|
||||||
|
if(addr < textstart) {
|
||||||
|
sprintf(bufstr, "<lin:0x%lx>", addr);
|
||||||
|
} else if(addr < datastart) {
|
||||||
|
sprintf(bufstr, "0x%lx (codeseg)", addr - textstart);
|
||||||
|
} else {
|
||||||
|
sprintf(bufstr, "0x%lx (dataseg)", addr - datastart);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bufstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================*
|
||||||
|
* arch_addrok *
|
||||||
|
*===========================================================================*/
|
||||||
|
PUBLIC vir_bytes arch_addrok(struct vmproc *vmp, vir_bytes addr)
|
||||||
|
{
|
||||||
|
vir_bytes textstart = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys);
|
||||||
|
vir_bytes textend = CLICK2ABS(vmp->vm_arch.vm_seg[T].mem_phys +
|
||||||
|
vmp->vm_arch.vm_seg[T].mem_phys);
|
||||||
|
vir_bytes datastart = CLICK2ABS(vmp->vm_arch.vm_seg[D].mem_phys);
|
||||||
|
|
||||||
|
if(addr >= textstart && addr < textstart+textend)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if(addr >= datastart && addr < VM_DATATOP)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*===========================================================================*
|
/*===========================================================================*
|
||||||
* arch_vir2map *
|
* arch_vir2map *
|
||||||
*===========================================================================*/
|
*===========================================================================*/
|
||||||
|
|
Loading…
Reference in a new issue