예제 #1
0
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);
}
예제 #2
0
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);
}
예제 #3
0
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;
}
예제 #4
0
파일: ui.c 프로젝트: zcgeng/ics2015
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;
}