Index: lamix/kernel/exec_elf32.c =================================================================== diff -c -r1.2 -r1.4 *** lamix/kernel/exec_elf32.c 2002/10/25 20:24:33 1.2 --- lamix/kernel/exec_elf32.c 2002/12/04 18:58:03 1.4 *************** *** 213,236 **** diff = uaddr - *addr; } - if (!(ph->p_flags & Elf_pf_w)) /* set rdonly bit if not writeable */ - *prot |= MAP_RDONLY; - - uaddr = *addr & ~(PAGE_SIZE - 1); *size = ph->p_filesz + diff; msize = ph->p_memsz + diff; psize = (msize + PAGE_SIZE - 1) & ~(PAGE_SIZE -1); #ifdef TRACE ! kprint3("Load", uaddr, *prot, psize); #endif /* adjust text and data segment boundaries */ if (!(ph->p_flags & Elf_pf_w) && ((char*)uaddr < p->text_low)) { #ifdef TRACE ! kprint1("New Text Low ", uaddr); #endif p->text_low = (char*)uaddr; } --- 213,232 ---- diff = uaddr - *addr; } uaddr = *addr & ~(PAGE_SIZE - 1); *size = ph->p_filesz + diff; msize = ph->p_memsz + diff; psize = (msize + PAGE_SIZE - 1) & ~(PAGE_SIZE -1); #ifdef TRACE ! kprint3("Load", uaddr, *prot, psize); #endif /* adjust text and data segment boundaries */ if (!(ph->p_flags & Elf_pf_w) && ((char*)uaddr < p->text_low)) { #ifdef TRACE ! kprint1("New Text Low ", uaddr); #endif p->text_low = (char*)uaddr; } *************** *** 238,244 **** if (!(ph->p_flags & Elf_pf_w) && ((char*)(uaddr + psize) > p->text_high)) { #ifdef TRACE ! kprint1("New Text High", uaddr + psize); #endif p->text_high = (char*)(uaddr + psize); } --- 234,240 ---- if (!(ph->p_flags & Elf_pf_w) && ((char*)(uaddr + psize) > p->text_high)) { #ifdef TRACE ! kprint1("New Text High", uaddr + psize); #endif p->text_high = (char*)(uaddr + psize); } *************** *** 246,252 **** if ((ph->p_flags & Elf_pf_w) && ((char*)uaddr < p->data_low)) { #ifdef TRACE ! kprint1("New Data Low ", uaddr); #endif p->data_low = (char*)uaddr; } --- 242,248 ---- if ((ph->p_flags & Elf_pf_w) && ((char*)uaddr < p->data_low)) { #ifdef TRACE ! kprint1("New Data Low ", uaddr); #endif p->data_low = (char*)uaddr; } *************** *** 254,260 **** if ((ph->p_flags & Elf_pf_w) && ((char*)(uaddr + psize) > p->data_high)) { #ifdef TRACE ! kprint1("New Data High", uaddr + psize); #endif p->data_high = (char*)(uaddr + psize); } --- 250,256 ---- if ((ph->p_flags & Elf_pf_w) && ((char*)(uaddr + psize) > p->data_high)) { #ifdef TRACE ! kprint1("New Data High", uaddr + psize); #endif p->data_high = (char*)(uaddr + psize); } *************** *** 265,271 **** kprint2("ELF Segment overlaps stack", uaddr + psize, p->stack_high); return(ENOMEM); } ! for (vaddr = (char*)uaddr; /* map section */ vaddr < (char*)(uaddr + psize); vaddr += PAGE_SIZE) --- 261,267 ---- kprint2("ELF Segment overlaps stack", uaddr + psize, p->stack_high); return(ENOMEM); } ! for (vaddr = (char*)uaddr; /* map section */ vaddr < (char*)(uaddr + psize); vaddr += PAGE_SIZE) *************** *** 320,327 **** error = vn_rdwr(UIO_READ, vp, (char*)&eh, sizeof(eh), 0, UIO_SYSSPACE, 0, &p->cred, &resid, p); #ifdef TRACE ! kprint1("Read Elf Header", sizeof(eh)); ! kprint1(" ->", error); #endif if (error) --- 316,323 ---- error = vn_rdwr(UIO_READ, vp, (char*)&eh, sizeof(eh), 0, UIO_SYSSPACE, 0, &p->cred, &resid, p); #ifdef TRACE ! kprint1("Read Elf Header", sizeof(eh)); ! kprint1(" ->", error); #endif if (error) *************** *** 342,349 **** return ETXTBSY; #ifdef TRACE ! kprint2("P Headers", eh.e_phnum, eh.e_phoff); ! kprint2("S Headers", eh.e_shnum, eh.e_shoff); #endif --- 338,345 ---- return ETXTBSY; #ifdef TRACE ! kprint2("P Headers", eh.e_phnum, eh.e_phoff); ! kprint2("S Headers", eh.e_shnum, eh.e_shoff); #endif *************** *** 356,362 **** int prot = MAP_VALID; #ifdef TRACE ! kprint1("Read P Header", i); #endif if ((error = elf32_read_from(p, vp, eh.e_phoff + i * sizeof(Elf_Phdr), (caddr_t)&ph, sizeof(Elf_Phdr))) != 0) --- 352,358 ---- int prot = MAP_VALID; #ifdef TRACE ! kprint1("Read P Header", i); #endif if ((error = elf32_read_from(p, vp, eh.e_phoff + i * sizeof(Elf_Phdr), (caddr_t)&ph, sizeof(Elf_Phdr))) != 0) *************** *** 445,461 **** return error; #ifdef TRACE ! kprint1("Read S Header", i); ! kprint3("Section", sh.sh_type, sh.sh_addr, sh.sh_size); #endif if (sh.sh_addr != NULL) { if (sh.sh_type == Elf_sht_nobits) { #ifdef TRACE ! kprint0("Clearing memory"); #endif memset(sh.sh_addr, 0, sh.sh_size); } --- 441,461 ---- return error; #ifdef TRACE ! kprint1("Read S Header", i); ! kprint3("Section", sh.sh_type, sh.sh_addr, sh.sh_size); #endif if (sh.sh_addr != NULL) { + vaddr_t vaddr; + size_t len; + unsigned pte; + if (sh.sh_type == Elf_sht_nobits) { #ifdef TRACE ! kprint2("Clearing memory", sh.sh_addr, sh.sh_size); #endif memset(sh.sh_addr, 0, sh.sh_size); } *************** *** 463,476 **** if (sh.sh_type == Elf_sht_progbits) { #ifdef TRACE ! kprint0("Read section"); #endif error = vn_rdwr(UIO_READ, vp, (char*)sh.sh_addr, sh.sh_size, sh.sh_offset, UIO_USERSPACE, 0, &p->cred, &resid, p); if (error) return error; } } } --- 463,493 ---- if (sh.sh_type == Elf_sht_progbits) { #ifdef TRACE ! kprint2("Read section", sh.sh_addr, sh.sh_size); #endif + error = vn_rdwr(UIO_READ, vp, (char*)sh.sh_addr, sh.sh_size, sh.sh_offset, UIO_USERSPACE, 0, &p->cred, &resid, p); if (error) return error; + + flush_cache((char*)sh.sh_addr, sh.sh_size); } + + if ((sh.sh_flags & SHF_WRITE) != 0) + continue; + + vaddr = trunc_page(sh.sh_addr); + len = sh.sh_size + (sh.sh_addr - vaddr); + while (len >= PAGE_SIZE) + { + pte = read_pagetable(p->context_r, (char*)vaddr); + write_pagetable(p->context_r, (char*)vaddr, pte | MAP_RDONLY); + tlb_purge((char*)vaddr); + len -= PAGE_SIZE; + vaddr += PAGE_SIZE; + } } } *************** *** 478,484 **** *entry = eh.e_entry; #ifdef TRACE ! kprint1("Entry:", eh.e_entry); #endif vp->v_flag |= VTEXT; --- 495,501 ---- *entry = eh.e_entry; #ifdef TRACE ! kprint1("Entry:", eh.e_entry); #endif vp->v_flag |= VTEXT; Index: lamix/mm/vm.h =================================================================== diff -c -r1.2 -r1.3 *** lamix/mm/vm.h 2002/10/25 20:24:50 1.2 --- lamix/mm/vm.h 2002/12/04 07:03:58 1.3 *************** *** 46,52 **** * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ ! #ifndef _MM_HM_H_ #define _MM_VM_H_ #ifndef _ASM --- 46,52 ---- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ ! #ifndef _MM_VM_H_ #define _MM_VM_H_ #ifndef _ASM Index: lamix/syscall/simtraps.c =================================================================== diff -c -r1.3 -r1.4 *** lamix/syscall/simtraps.c 2002/10/25 20:24:57 1.3 --- lamix/syscall/simtraps.c 2002/12/04 18:43:12 1.4 *************** *** 142,149 **** incr = min(length, PAGE_SIZE - ((unsigned)vbuf & (PAGE_SIZE-1))); - flush_cache(vbuf, incr); - error = sim_trap_pread64(fd, pbuf, incr, offset, vbuf); total += error; if (error < 0) --- 142,147 ---- Index: src/Processor/tlb.cc =================================================================== diff -c -r1.6 -r1.7 *** src/Processor/tlb.cc 2002/10/25 20:25:19 1.6 --- src/Processor/tlb.cc 2002/12/04 18:43:12 1.7 *************** *** 304,320 **** { *attributes = tlb_attr(data); - if (tlb_mvalid(data)) - *address = tlb_data(data) | tlb_offset(addr); - else - return(TLB_FAULT); - if (write && tlb_rdonly(data)) return(TLB_FAULT); if (!priv && tlb_priv(data)) return(TLB_FAULT); return(TLB_HIT); } --- 304,320 ---- { *attributes = tlb_attr(data); if (write && tlb_rdonly(data)) return(TLB_FAULT); if (!priv && tlb_priv(data)) return(TLB_FAULT); + if (tlb_mvalid(data)) + *address = tlb_data(data) | tlb_offset(addr); + else + return(TLB_FAULT); + return(TLB_HIT); } *************** *** 342,349 **** entries[index].tag = (addr & ~(PAGE_SIZE-1)) | 1; entries[index].data = data; - *attributes = tlb_attr(data); - *address = tlb_data(data) | tlb_offset(addr); if (write && tlb_rdonly(data)) return(TLB_FAULT); --- 342,347 ---- *************** *** 351,356 **** --- 349,357 ---- if (!priv && tlb_priv(data)) return(TLB_FAULT); + *attributes = tlb_attr(data); + *address = tlb_data(data) | tlb_offset(addr); + return(TLB_HIT); *************** *** 371,387 **** { *attributes = tlb_attr(data); - if (tlb_mvalid(data)) - *address = tlb_data(data) | tlb_offset(addr); - else - return(TLB_FAULT); - if (write && tlb_rdonly(data)) return(TLB_FAULT); if (!priv && tlb_priv(data)) return(TLB_FAULT); return(TLB_HIT); } --- 372,388 ---- { *attributes = tlb_attr(data); if (write && tlb_rdonly(data)) return(TLB_FAULT); if (!priv && tlb_priv(data)) return(TLB_FAULT); + if (tlb_mvalid(data)) + *address = tlb_data(data) | tlb_offset(addr); + else + return(TLB_FAULT); + return(TLB_HIT); } *************** *** 425,441 **** { *attributes = tlb_attr(data); - if (tlb_mvalid(data)) - *address = tlb_data(data) | tlb_offset(addr); - else - return(TLB_FAULT); - if (write && tlb_rdonly(data)) return(TLB_FAULT); if (!priv && tlb_priv(data)) return(TLB_FAULT); old_age = entries[base+n].age; entries[base+n].age = associativity-1; for (i = 0; i < associativity; i++) --- 426,442 ---- { *attributes = tlb_attr(data); if (write && tlb_rdonly(data)) return(TLB_FAULT); if (!priv && tlb_priv(data)) return(TLB_FAULT); + if (tlb_mvalid(data)) + *address = tlb_data(data) | tlb_offset(addr); + else + return(TLB_FAULT); + old_age = entries[base+n].age; entries[base+n].age = associativity-1; for (i = 0; i < associativity; i++) *************** *** 475,491 **** { *attributes = tlb_attr(entries[base].data); - if (tlb_mvalid(entries[base].data)) - *address = tlb_data(entries[base].data) | tlb_offset(addr); - else - return(TLB_FAULT); - if (write && tlb_rdonly(entries[base].data)) return(TLB_FAULT); if (!priv && tlb_priv(entries[base].data)) return(TLB_FAULT); return(TLB_HIT); } --- 476,492 ---- { *attributes = tlb_attr(entries[base].data); if (write && tlb_rdonly(entries[base].data)) return(TLB_FAULT); if (!priv && tlb_priv(entries[base].data)) return(TLB_FAULT); + if (tlb_mvalid(entries[base].data)) + *address = tlb_data(entries[base].data) | tlb_offset(addr); + else + return(TLB_FAULT); + return(TLB_HIT); }