void swaddr_write(swaddr_t addr, size_t len, uint32_t data, uint8_t sreg) { #ifdef DEBUG assert(len == 1 || len == 2 || len == 4); #endif #ifdef SEGMENTATION if (cpu.cr0.protect_enable) addr = seg_translate(addr, sreg); #endif lnaddr_write(addr, len, data); }
uint32_t swaddr_read(swaddr_t addr, size_t len, uint8_t sreg) { #ifdef DEBUG assert(len == 1 || len == 2 || len == 4); #endif #ifdef SEGMENTATION if (cpu.cr0.protect_enable) addr = seg_translate(addr, sreg); #endif return lnaddr_read(addr, len); }
static int load_segment(struct addrspace *as, struct vnode *v, off_t offset, vaddr_t vaddr, size_t memsize, size_t filesize, int is_executable) { KASSERT(vaddr < 0x80000000); DEBUG(DB_VM, "Running load segment %p, size %d\n", (void*)vaddr, memsize); struct iovec iov; struct uio u; int result; if (filesize > memsize) { DEBUG(DB_VM,"ELF: warning: segment filesize > segment memsize\n"); filesize = memsize; } DEBUG(DB_EXEC, "ELF: Loading %lu bytes to 0x%lx\n", (unsigned long) filesize, (unsigned long) vaddr); struct segment *seg; paddr_t kpaddr; result = as_which_seg(as, vaddr, &seg); if (result) return result; result = seg_translate(seg, vaddr, &kpaddr); if (result) return result; (void) is_executable; iov.iov_ubase = (userptr_t)PADDR_TO_KVADDR(kpaddr); iov.iov_len = memsize; // length of the memory space u.uio_iov = &iov; u.uio_iovcnt = 1; u.uio_resid = filesize; // amount to read from the file u.uio_offset = offset; u.uio_segflg = UIO_SYSSPACE;// is_executable ? UIO_USERISPACE : UIO_USERSPACE; u.uio_rw = UIO_READ; u.uio_space = NULL; DEBUG(DB_VM,"ELF loading segment into %p(%p) as %p\n", (void*)PADDR_TO_KVADDR(kpaddr), (void*) kpaddr,(void*)vaddr); result = VOP_READ(v, &u); if (result) { return result; } DEBUG(DB_VM, "\tDone loading\n"); return result; }
static int cmd_page(char *args){ if(args == NULL){ printf("Please input a number!\n"); return 0; } char expre[32]; sscanf(args, "%s", expre); swaddr_t addr = 0; bool success = true; addr = expr(expre, &success); if(success == false) return 0; lnaddr_t lnaddr = seg_translate(addr, R_SS); printf("lnaddr = 0x%x\n", lnaddr); page_debug(lnaddr); return 0; }