==== //depot/projects/mips2/src/sys/dev/ata/ata-pci.c#1 - /home/suleiman/freebsd/p4/mips/sys/dev/ata/ata-pci.c ==== --- /tmp/tmp.61628.0 Fri Sep 8 00:58:41 2006 +++ /home/suleiman/freebsd/p4/mips/sys/dev/ata/ata-pci.c Wed Sep 6 15:52:10 2006 @@ -475,6 +475,12 @@ ata_pci_dmareset(device_t dev) { struct ata_channel *ch = device_get_softc(dev); + if (ch->r_io[ATA_BMCMD_PORT].res == 0) { + printf("%s: NULL res\n", __func__); + return; + } + + ATA_IDX_OUTB(ch, ATA_BMCMD_PORT, ATA_IDX_INB(ch, ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP); ch->dma->flags &= ~ATA_DMA_ACTIVE; ==== //depot/projects/mips2/src/sys/kern/imgact_elf.c#1 - /home/suleiman/freebsd/p4/mips/sys/kern/imgact_elf.c ==== --- /tmp/tmp.61628.1 Fri Sep 8 00:58:41 2006 +++ /home/suleiman/freebsd/p4/mips/sys/kern/imgact_elf.c Thu Sep 7 15:14:37 2006 @@ -220,6 +220,10 @@ __elfN(check_header)(const Elf_Ehdr *hdr for (i = 0; i < MAX_BRANDS; i++) { bi = elf_brand_list[i]; + if (bi) + printf("%s: bi %d mach %d hdr mach %d\n", __func__, i, bi->machine, hdr->e_machine); + else + printf("%s: bi %d NULL\n", __func__, i); if (bi != NULL && bi->machine == hdr->e_machine) break; } @@ -786,6 +790,7 @@ __CONCAT(exec_, __elfN(imgact))(struct i imgp->proc->p_sysent = sv; if (interp != NULL) { + printf("%s: interp != NULL\n", __func__); VOP_UNLOCK(imgp->vp, 0, td); if (brand_info->emul_path != NULL && brand_info->emul_path[0] != '\0') { @@ -794,6 +799,7 @@ __CONCAT(exec_, __elfN(imgact))(struct i brand_info->emul_path, interp); error = __elfN(load_file)(imgp->proc, path, &addr, &imgp->entry_addr, sv->sv_pagesize); + printf("%s: load_file returned %d\n", __func__, error); free(path, M_TEMP); if (error == 0) interp = NULL; @@ -807,7 +813,8 @@ __CONCAT(exec_, __elfN(imgact))(struct i uprintf("ELF interpreter %s not found\n", interp); return (error); } - } + } else + printf("%s: interp == NULL\n", __func__); /* * Construct auxargs table (used by the fixup routine) ==== //depot/projects/mips2/src/sys/kern/init_main.c#1 - /home/suleiman/freebsd/p4/mips/sys/kern/init_main.c ==== --- /tmp/tmp.61628.2 Fri Sep 8 00:58:41 2006 +++ /home/suleiman/freebsd/p4/mips/sys/kern/init_main.c Thu Sep 7 13:10:34 2006 @@ -616,6 +616,7 @@ start_init(void *dummy) */ options = 0; ucp = (char *)p->p_sysent->sv_usrstack; + printf("%s: usrstack %p\n", __func__, ucp); (void)subyte(--ucp, 0); /* trailing zero */ if (boothowto & RB_SINGLE) { (void)subyte(--ucp, 's'); @@ -675,6 +676,8 @@ start_init(void *dummy) if (error != ENOENT) printf("exec %.*s: error %d\n", (int)(next - path), path, error); + else + printf("%s: woo\n", __func__); } printf("init: not found in path %s\n", init_path); panic("no init"); @@ -693,6 +696,7 @@ create_init(const void *udata __unused) struct ucred *newcred, *oldcred; int error; + printf("%s: creating init\n", __func__); error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc); if (error) panic("cannot fork init: %d\n", error); ==== //depot/projects/mips2/src/sys/kern/kern_exec.c#1 - /home/suleiman/freebsd/p4/mips/sys/kern/kern_exec.c ==== --- /tmp/tmp.61628.3 Fri Sep 8 00:58:41 2006 +++ /home/suleiman/freebsd/p4/mips/sys/kern/kern_exec.c Thu Sep 7 13:04:09 2006 @@ -386,8 +386,10 @@ interpret: imgp->vp->v_vflag |= VV_TEXT; error = exec_map_first_page(imgp); - if (error) + if (error) { + printf("%s: exec_map_first_page failed %d\n", __func__, error); goto exec_fail_dealloc; + } /* * If the current process has a special image activator it @@ -395,8 +397,11 @@ interpret: * scripts differently. */ error = -1; - if ((img_first = imgp->proc->p_sysent->sv_imgact_try) != NULL) + if ((img_first = imgp->proc->p_sysent->sv_imgact_try) != NULL) { error = img_first(imgp); + if (error) + printf("%s: img_first failed %d\n", __func__, error); + } /* * Loop through the list of image activators, calling each one. @@ -409,9 +414,12 @@ interpret: continue; } error = (*execsw[i]->ex_imgact)(imgp); + if (error) + printf("%s: imgact %p failed %d\n", __func__, execsw[i]->ex_imgact, error); } if (error) { + printf("%s: all imgact failed %d\n", __func__, error); if (error == -1) { if (textset == 0) imgp->vp->v_vflag &= ~VV_TEXT; @@ -420,6 +428,8 @@ interpret: goto exec_fail_dealloc; } + printf("%s: found good imgact\n", __func__); + /* * Special interpreter operation, cleanup and loop up to try to * activate the interpreter. @@ -517,6 +527,8 @@ interpret: /* reset caught signals */ execsigs(p); + printf("%s: reset caught signals\n", __func__); + /* name this process - nameiexec(p, ndp) */ len = min(ndp->ni_cnd.cn_namelen,MAXCOMLEN); bcopy(ndp->ni_cnd.cn_nameptr, p->p_comm, len); @@ -709,6 +721,8 @@ interpret: vfs_mark_atime(imgp->vp, td); + printf("%s: done\n", __func__); + done1: /* * Free any resources malloc'd earlier that we didn't use. @@ -971,6 +985,7 @@ exec_copyin_args(struct image_args *args */ args->buf = (char *) kmem_alloc_wait(exec_map, PATH_MAX + ARG_MAX + MAXSHELLCMDLEN); + printf("%s: allocated %d bytes at %p\n", __func__, PATH_MAX + ARG_MAX + MAXSHELLCMDLEN, args->buf); if (args->buf == NULL) return (ENOMEM); args->begin_argv = args->buf; @@ -978,6 +993,7 @@ exec_copyin_args(struct image_args *args args->stringspace = ARG_MAX; args->fname = args->buf + ARG_MAX; + printf("%s: buf %p fname %p\n", __func__, args->buf, args->fname); /* * Copy the file name. @@ -1042,6 +1058,7 @@ exec_free_args(struct image_args *args) { if (args->buf) { + printf("%s: freeing %d bytes at %p\n", __func__, PATH_MAX + ARG_MAX + MAXSHELLCMDLEN, args->buf); kmem_free_wakeup(exec_map, (vm_offset_t)args->buf, PATH_MAX + ARG_MAX + MAXSHELLCMDLEN); args->buf = NULL; ==== //depot/projects/mips2/src/sys/kern/kern_exit.c#1 - /home/suleiman/freebsd/p4/mips/sys/kern/kern_exit.c ==== --- /tmp/tmp.61628.4 Fri Sep 8 00:58:41 2006 +++ /home/suleiman/freebsd/p4/mips/sys/kern/kern_exit.c Thu Sep 7 12:25:54 2006 @@ -130,6 +130,7 @@ exit1(struct thread *td, int rv) p = td->td_proc; if (p == initproc) { + panic("init died"); printf("init died (signal %d, exit %d)\n", WTERMSIG(rv), WEXITSTATUS(rv)); panic("Going nowhere without my init!"); ==== //depot/projects/mips2/src/sys/kern/kern_fork.c#1 - /home/suleiman/freebsd/p4/mips/sys/kern/kern_fork.c ==== --- /tmp/tmp.61628.5 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/kern/kern_fork.c Thu Sep 7 13:50:17 2006 @@ -819,6 +819,8 @@ fork_exit(callout, arg, frame) * initproc has its own fork handler, but it does return. */ KASSERT(callout != NULL, ("NULL callout in fork_exit")); + printf("%s: calling callout %p (should be %p) arg %p frame %p on thread %s\n", __func__, callout, fork_return, arg, (void *)frame, + p->p_comm); callout(arg, frame); /* ==== //depot/projects/mips2/src/sys/kern/kern_kthread.c#1 - /home/suleiman/freebsd/p4/mips/sys/kern/kern_kthread.c ==== --- /tmp/tmp.61628.6 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/kern/kern_kthread.c Tue Sep 5 22:16:10 2006 @@ -83,6 +83,7 @@ kthread_create(void (*func)(void *), voi if (!proc0.p_stats) panic("kthread_create called too soon"); + printf("%s: creating %s\n", __func__, fmt); error = fork1(&thread0, RFMEM | RFFDG | RFPROC | RFSTOPPED | flags, pages, &p2); if (error) ==== //depot/projects/mips2/src/sys/mips/conf/MALTA#9 - /home/suleiman/freebsd/p4/mips/sys/mips/conf/MALTA ==== --- /tmp/tmp.61628.7 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/conf/MALTA Tue Sep 5 22:27:43 2006 @@ -49,6 +49,7 @@ options SOFTUPDATES options UFS_ACL #Support for access control lists options UFS_DIRHASH #Improve performance on big directories +options VERBOSE_SYSINIT # Debugging for use in -current #options INVARIANTS #Enable calls of extra sanity checking ==== //depot/projects/mips2/src/sys/mips/include/md_var.h#2 - /home/suleiman/freebsd/p4/mips/sys/mips/include/md_var.h ==== --- /tmp/tmp.61628.8 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/include/md_var.h Thu Sep 7 11:51:22 2006 @@ -28,6 +28,9 @@ #ifndef _MACHINE_MD_VAR_H_ #define _MACHINE_MD_VAR_H_ +extern char sigcode[]; +extern int szsigcode; + extern vm_offset_t kstack0; extern vm_paddr_t kstack0_phys; ==== //depot/projects/mips2/src/sys/mips/include/pcb.h#3 - /home/suleiman/freebsd/p4/mips/sys/mips/include/pcb.h ==== --- /tmp/tmp.61628.9 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/include/pcb.h Tue Sep 5 14:52:44 2006 @@ -35,6 +35,7 @@ */ struct pcb { __register_t pcb_regs[13]; + caddr_t pcb_onfault; }; #define PCB_REG_S0 (0) ==== //depot/projects/mips2/src/sys/mips/include/pmap.h#3 - /home/suleiman/freebsd/p4/mips/sys/mips/include/pmap.h ==== --- /tmp/tmp.61628.10 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/include/pmap.h Wed Sep 6 02:18:38 2006 @@ -84,6 +84,7 @@ vm_offset_t pmap_steal_memory(vm_size_t) void *pmap_mapdev(vm_offset_t, vm_size_t); void pmap_unmapdev(vm_offset_t, vm_size_t); void pmap_deactivate(struct thread *); +pt_entry_t* pmap_pte(pmap_t pmap, vm_offset_t va); #define pmap_resident_count(pm) ((pm)->pm_stats.resident_count) #define vtophys(va) pmap_kextract((vm_offset_t)(va)) ==== //depot/projects/mips2/src/sys/mips/include/pte.h#2 - /home/suleiman/freebsd/p4/mips/sys/mips/include/pte.h ==== --- /tmp/tmp.61628.11 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/include/pte.h Wed Sep 6 13:32:50 2006 @@ -54,9 +54,11 @@ typedef unsigned long pt_entry_t; #define MIPS_TLB_SWSHIFT 30 #define MIPS_PFN_SHIFT 6 #define MIPS_PFN_MASK 0xFFFFFF -#define MIPS_PA_TO_PFN(pa) (((pa) >> MIPS_PFN_SHIFT) & MIPS_PFN_MASK) -#define MIPS_PFN_TO_PA(pfn) ((pfn) << MIPS_PFN_SHIFT) -#define MIPS_PTE_TO_PFN(pte) ((pte) & MIPS_PFN_MASK) +//#define MIPS_PA_TO_PFN(pa) (((pa) >> MIPS_PFN_SHIFT) & MIPS_PFN_MASK) +#define MIPS_PA_TO_PFN(pa) (((pa) >> PAGE_SHIFT)) +//#define MIPS_PFN_TO_PA(pfn) ((pfn) << MIPS_PFN_SHIFT) +#define MIPS_PFN_TO_PA(pfn) ((pfn) << PAGE_SHIFT) +#define MIPS_PTE_TO_PFN(pte) (((pte) >> MIPS_PFN_SHIFT) & MIPS_PFN_MASK) #define MIPS_PTE_TO_PA(pte) (MIPS_PFN_TO_PA(MIPS_PTE_TO_PFN((pte)))) /* ==== //depot/projects/mips2/src/sys/mips/include/sf_buf.h#2 - /home/suleiman/freebsd/p4/mips/sys/mips/include/sf_buf.h ==== --- /tmp/tmp.61628.12 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/include/sf_buf.h Thu Sep 7 01:30:17 2006 @@ -28,30 +28,26 @@ #ifndef _MACHINE_SF_BUF_H_ #define _MACHINE_SF_BUF_H_ -#include +#include +#include +#include struct vm_page; -struct sf_buf { - LIST_ENTRY(sf_buf) list_entry; /* list of buffers */ - TAILQ_ENTRY(sf_buf) free_entry; /* list of buffers */ - struct vm_page *m; /* currently mapped page */ - vm_offset_t kva; /* va of mapping */ - int ref_count; /* usage of this mapping */ -}; +struct sf_buf; static __inline vm_offset_t sf_buf_kva(struct sf_buf *sf) { - return (sf->kva); + return (MIPS_PHYS_TO_KSEG0(VM_PAGE_TO_PHYS((vm_page_t)sf))); } static __inline struct vm_page * sf_buf_page(struct sf_buf *sf) { - return (sf->m); + return ((vm_page_t)sf); } #endif /* !_MACHINE_SF_BUF_H_ */ ==== //depot/projects/mips2/src/sys/mips/include/tlb.h#3 - /home/suleiman/freebsd/p4/mips/sys/mips/include/tlb.h ==== --- /tmp/tmp.61628.13 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/include/tlb.h Wed Sep 6 02:21:42 2006 @@ -40,7 +40,7 @@ void tlb_enter(pmap_t, vm_offset_t, vm_p void tlb_invalidate_all(void); void tlb_invalidate_one(int); void tlb_invalidate_page(vm_offset_t); -void tlb_modified(void *); +void tlb_modified(pmap_t, void *); void tlb_remove(pmap_t, vm_offset_t); void tlb_remove_pages(pmap_t, vm_offset_t, int); void tlb_remove_range(pmap_t, vm_offset_t, vm_offset_t); ==== //depot/projects/mips2/src/sys/mips/mips/copystr.S#3 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/copystr.S ==== --- /tmp/tmp.61628.14 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/copystr.S Wed Sep 6 02:36:13 2006 @@ -66,7 +66,9 @@ END(copystr) ENTRY(copyinstr) - break + //break + j copystr + nop END(copyinstr) ENTRY(copyoutstr) ==== //depot/projects/mips2/src/sys/mips/mips/cpu.c#14 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/cpu.c ==== --- /tmp/tmp.61628.15 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/cpu.c Wed Sep 6 00:24:08 2006 @@ -78,8 +78,11 @@ mips_vector_do_install(vm_offset_t addr, max = 0x80; len = end - begin; + printf("%s: installing at addr %p begin %p end %p\n", __func__, + (void *)addr, begin, end); if (len > max) - panic("exception code too big for vector %jx", (intmax_t) addr); + panic("exception code too big for vector %jx (%#x)", + (intmax_t) addr, len); if (len == max) printf("Exception vector at %jx out of space\n", (intmax_t) addr); else if (len + 8 >= max) ==== //depot/projects/mips2/src/sys/mips/mips/elf_machdep.c#2 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/elf_machdep.c ==== --- /tmp/tmp.61628.16 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/elf_machdep.c Thu Sep 7 14:02:11 2006 @@ -26,10 +26,82 @@ */ #include +#include #include -#include +#include #include +#include +#include #include +#include +#include + +#include +#include +#include + +#include +#include + +struct sysentvec elf32_freebsd_sysvec = { + SYS_MAXSYSCALL, + sysent, + 0, + 0, + NULL, + 0, + NULL, + NULL, + __elfN(freebsd_fixup), + sendsig, + sigcode, + &szsigcode, + NULL, + "FreeBSD ELF32", + __elfN(coredump), + NULL, + MINSIGSTKSZ, + PAGE_SIZE, + VM_MIN_ADDRESS, + VM_MAXUSER_ADDRESS, + USRSTACK, + PS_STRINGS, + VM_PROT_ALL, + exec_copyout_strings, + exec_setregs, + NULL +}; + +static Elf32_Brandinfo freebsd_brand_info = { + ELFOSABI_FREEBSD, + EM_MIPS, + "FreeBSD", + NULL, + "/libexec/ld-elf.so.1", + &elf32_freebsd_sysvec, + NULL, + 0, + }; + +SYSINIT(elf32, SI_SUB_EXEC, SI_ORDER_ANY, + (sysinit_cfunc_t) elf32_insert_brand_entry, + &freebsd_brand_info); + +static Elf32_Brandinfo freebsd_brand_oinfo = { + ELFOSABI_FREEBSD, + EM_MIPS, + "FreeBSD", + NULL, + "/usr/libexec/ld-elf.so.1", + &elf32_freebsd_sysvec, + NULL, + 0, + }; + +SYSINIT(oelf32, SI_SUB_EXEC, SI_ORDER_ANY, + (sysinit_cfunc_t) elf32_insert_brand_entry, + &freebsd_brand_oinfo); + void elf32_dump_thread(struct thread *td, void *dst, size_t *off) ==== //depot/projects/mips2/src/sys/mips/mips/exception.S#8 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/exception.S ==== --- /tmp/tmp.61628.17 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/exception.S Thu Sep 7 01:11:28 2006 @@ -167,8 +167,8 @@ LEAF(GenericException) * having a clean go at restoring. */ mtc0 zero, MIPS_COP_0_CAUSE - li t0, MIPS_SR_KX - mtc0 t0, MIPS_COP_0_STATUS + //li t0, MIPS_SR_KX + //mtc0 t0, MIPS_COP_0_STATUS move k1, sp jal exception_restore_registers @@ -202,8 +202,40 @@ VEND(CacheVector) */ LEAF(TLBMissVector) .set noat +// .set noreorder mfc0 k0, MIPS_COP_0_BAD_VADDR + nop + bltz k0, 5f + nop + + /* Userland */ +6: + subu sp, sp, TF_SIZE + la k0, 4f + j exception_save_registers + move k1, sp +4: mfc0 a1, MIPS_COP_0_CAUSE + mfc0 a2, MIPS_COP_0_BAD_VADDR + jal trap + move a0, k1 + + move k1, sp + jal exception_restore_registers + nop + + addu sp, sp, TF_SIZE + eret +5: + j kernfault + +VEND(TLBMissVector) + .data +2: .asciiz "TLBMissVector" + .text + + +kernfault: /* * Shift right logical to get a page index, but leaving * enough bits to index an array of 64 bit values, plus @@ -240,29 +272,43 @@ LEAF(TLBMissVector) */ mtc0 k0, MIPS_COP_0_TLB_LO0 mtc0 k1, MIPS_COP_0_TLB_LO1 - nop + //nop tlbp - - mfc0 k0, MIPS_COP_0_TLB_INDEX + + mfc0 k1, MIPS_COP_0_BAD_VADDR + srl k1, PAGE_SHIFT + andi k1, k1, 1 + bne k1, zero, 2f + nop + + mfc0 k1, MIPS_COP_0_TLB_LO0 + b 3f nop +2: + mfc0 k1, MIPS_COP_0_TLB_LO1 + nop +3: + andi k1, 2 + bne k1, zero, 4f + nop + j 6b + nop + +4: + mfc0 k0, MIPS_COP_0_TLB_INDEX bltz k0, 1f nop tlbwi - eret 1: tlbwr - eret + eret +// .set reorder .set at -VEND(TLBMissVector) - .data -2: .asciiz "TLBMissVector" - .text - LEAF(XTLBMissVector) ==== //depot/projects/mips2/src/sys/mips/mips/genassym.c#2 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/genassym.c ==== --- /tmp/tmp.61628.18 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/genassym.c Tue Sep 5 14:51:43 2006 @@ -168,6 +168,7 @@ ASSYM(PCB_REG_S8, offsetof(struct pcb, p ASSYM(PCB_REG_SP, offsetof(struct pcb, pcb_regs[PCB_REG_SP])); ASSYM(PCB_REG_SR, offsetof(struct pcb, pcb_regs[PCB_REG_SR])); ASSYM(PCB_REG_RA, offsetof(struct pcb, pcb_regs[PCB_REG_RA])); +ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault)); ASSYM(VM_MIN_ADDRESS, VM_MIN_ADDRESS); ASSYM(VM_MAXUSER_ADDRESS, VM_MAXUSER_ADDRESS); ==== //depot/projects/mips2/src/sys/mips/mips/locore.S#13 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/locore.S ==== --- /tmp/tmp.61628.19 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/locore.S Thu Sep 7 11:55:21 2006 @@ -114,3 +114,12 @@ ASM_ENTRY(_start) nop /* NOTREACHED */ + +ASM_ENTRY(sigcode) + break + +esigcode: + .data + .global szsigcode +szsigcode: + .long esigcode-sigcode ==== //depot/projects/mips2/src/sys/mips/mips/machdep.c#19 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/machdep.c ==== --- /tmp/tmp.61628.20 Fri Sep 8 00:58:42 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/machdep.c Thu Sep 7 16:37:24 2006 @@ -87,6 +87,12 @@ void cpu_startup(void *); SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); void +sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) +{ + __asm __volatile("break"); +} + +void mips_init(void) { int i; @@ -226,6 +232,7 @@ int set_regs(struct thread *td, struct reg *regs) { + __asm __volatile("break"); return (0); } @@ -267,18 +274,34 @@ ptrace_single_step(struct thread *td) void cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t sz) { - + printf("%s unimplemented\n", __func__); } void exec_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings) { +#if 0 + struct pcb *pcb = td->td_pcb; + + printf("%s: td %s entry %#lx stack %#lx strings %#lx old ra %p curthread %p td %p\n", __func__, td->td_proc->p_comm, entry, stack, ps_strings, (void *)pcb->pcb_regs[PCB_REG_RA], curthread, td); + bzero(pcb, sizeof(struct pcb)); + pcb->pcb_regs[PCB_REG_RA] = (register_t)entry; + pcb->pcb_regs[PCB_REG_SP] = (register_t)stack; + pcb->pcb_regs[PCB_REG_S0] = (register_t)fork_return; +#else + struct trapframe *tf = td->td_frame; + + tf->tf_regs[TF_S0] = (register_t)entry; + tf->tf_regs[TF_SP] = (register_t)stack; + tf->tf_regs[TF_SR] |= MIPS_SR_KSU_USER; +#endif } intptr_t casuptr(intptr_t *p, intptr_t old, intptr_t new) { + __asm __volatile("break"); return (-1); } ==== //depot/projects/mips2/src/sys/mips/mips/pmap.c#8 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/pmap.c ==== --- /tmp/tmp.61628.21 Fri Sep 8 00:58:43 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/pmap.c Thu Sep 7 12:21:08 2006 @@ -205,14 +205,26 @@ static void pmap_insert_entry(pmap_t pma * Extract the page table entry associated with * the given map/virtual addresss pair. */ -static pt_entry_t* +pt_entry_t* pmap_pte(pmap_t pmap, vm_offset_t va) { - if (pmap != kernel_pmap) - panic("non kernel pmap unsupported"); - if (pmap == NULL || pmap->pm_lev1 == NULL) - return NULL; - return tlb_pte_find(pmap->pm_lev1, va); + pt_entry_t *pte = NULL; + unsigned long lev1; + + if (pmap != kernel_pmap && pmap) { + //panic("non kernel pmap unsupported"); + lev1 = (unsigned long)pmap->pm_lev1; + lev1 = (unsigned long)tlb_pte_find(kptmap, lev1); + lev1 = (unsigned long)MIPS_PTE_TO_PA(*(pt_entry_t *)lev1); + + pte = tlb_pte_find((pt_entry_t *)MIPS_PHYS_TO_KSEG0((pt_entry_t *)lev1), va); + //printf("%s: lev1 %p pte %p\n", __func__, (void *)lev1, pte); + + //printf("%s: pmap %p va %p lev1 %p pte %p\n", __func__, pmap, + // (void *)va, pmap->pm_lev1, pte); + } else + pte = tlb_pte_find(kptmap, va); + return pte; } @@ -564,6 +576,7 @@ pmap_extract(pmap, va) vm_offset_t va; { pt_entry_t* pte = pmap_pte(pmap, va); + //printf("%s: va %p pa %p\n", __func__, (void*)va, (void*)(pmap_pte_pa(pte) | (va & PAGE_MASK))); if (pte) return pmap_pte_pa(pte) | (va & PAGE_MASK); else @@ -628,9 +641,12 @@ pmap_qremove(vm_offset_t sva, int count) { vm_offset_t va; + //printf("%s: removing %d from %p\n", __func__, count, (void *)sva); + va = sva; while (count-- > 0) { pmap_kremove(va); + //printf("%s: removed %p (%d)\n", __func__, (void *)va, count); va += PAGE_SIZE; } } @@ -708,34 +724,40 @@ void pmap_pinit(pmap) register struct pmap *pmap; { -#ifdef notyet - vm_page_t lev1pg; - int i; +#if 1 + char *lev1pg; + //vm_page_t lev1pg; + //int i; /* * allocate object for the ptes */ - if (pmap->pm_pteobj == NULL) - pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, NUSERLEV3MAPS + NUSERLEV2MAPS + 1); + //if (pmap->pm_pteobj == NULL) + //pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, NUSERLEV3MAPS + NUSERLEV2MAPS + 1); /* * allocate the page directory page */ - VM_OBJECT_LOCK(pmap->pm_pteobj); - lev1pg = vm_page_grab(pmap->pm_pteobj, NUSERLEV3MAPS + NUSERLEV2MAPS, - VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | VM_ALLOC_ZERO); - - vm_page_lock_queues(); - vm_page_flag_clear(lev1pg, PG_BUSY); - lev1pg->valid = VM_PAGE_BITS_ALL; - vm_page_unlock_queues(); - VM_OBJECT_UNLOCK(pmap->pm_pteobj); + //VM_OBJECT_LOCK(pmap->pm_pteobj); + //lev1pg = vm_page_grab(pmap->pm_pteobj, NUSERLEV3MAPS + NUSERLEV2MAPS, + // VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | VM_ALLOC_ZERO); + printf("%s: allocating page tables for pmap %p\n", __func__, pmap); + lev1pg = malloc(2097152, M_TEMP, M_WAITOK); + if (lev1pg == NULL) + panic("no lev1pg\n"); + + //vm_page_lock_queues(); + //vm_page_flag_clear(lev1pg, PG_BUSY); + //lev1pg->valid = VM_PAGE_BITS_ALL; + //vm_page_unlock_queues(); + //VM_OBJECT_UNLOCK(pmap->pm_pteobj); - pmap->pm_lev1 = (pt_entry_t*) MIPS_PHYS_TO_KSEG0(VM_PAGE_TO_PHYS(lev1pg)); + //pmap->pm_lev1 = (pt_entry_t*) MIPS_PHYS_TO_KSEG0(VM_VIRT_TO_PHYS(lev1pg)); + pmap->pm_lev1 = (pt_entry_t*) lev1pg; /* install self-referential address mapping entry (not PG_ASM) */ - pmap->pm_lev1[PTLEV1I] = pmap_phys_to_pte(VM_PAGE_TO_PHYS(lev1pg)) - | PG_V | PG_KRE | PG_KWE; + //pmap->pm_lev1[PTLEV1I] = pmap_phys_to_pte(VM_PAGE_TO_PHYS(lev1pg)) + // | PG_V | PG_KRE | PG_KWE; #else pmap->pm_lev1 = NULL; #endif @@ -974,6 +996,9 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t void pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) { + int count; + vm_offset_t va; + pt_entry_t *pte; if (pmap == NULL) return; @@ -981,7 +1006,17 @@ pmap_remove(pmap_t pmap, vm_offset_t sva if (pmap->pm_stats.resident_count == 0) return; - tlb_remove_range(pmap, sva, eva); + count = (eva - sva) >> PAGE_SHIFT; + va = sva; + while (count--) { + pte = pmap_pte(pmap, va); + pmap_remove_pte(pmap, pte, va); + tlb_remove(pmap, va); + va += PAGE_SIZE; + } + + //tlb_remove_range(pmap, sva, eva); + } /* @@ -1143,15 +1178,15 @@ pmap_enter(pmap_t pmap, vm_offset_t va, #endif mpte = NULL; + pte = pmap_pte(pmap, va); /* * In the case that a page table page is not * resident, we are creating it here. */ if (va < VM_MAXUSER_ADDRESS) { - panic("need to allocate mpte\n"); + //printf("need to allocate mpte\n"); } - pte = pmap_pte(pmap, va); /* * Page Directory table entry not valid, we need a new PT page @@ -1161,6 +1196,8 @@ pmap_enter(pmap_t pmap, vm_offset_t va, } pa = VM_PAGE_TO_PHYS(m) & ~PAGE_MASK; + //printf("%s: va %p pa %p page phys %p\n", __func__, (void *)va, + // (void *)pa, (void *)VM_PAGE_TO_PHYS(m)); if (pte_valid(pte) && (opa = pmap_pte_pa(pte)) == pa) { if (pte_wired(pte)) { @@ -1652,6 +1689,8 @@ void * pmap_mapdev(vm_offset_t pa, vm_size_t size) { /* XXXMIPS: return (void *)MIPS_PHYS_TO_KSEG1(pa); */ + __asm __volatile("break"); + //return (void *)MIPS_PHYS_TO_KSEG0(pa); return 0; } ==== //depot/projects/mips2/src/sys/mips/mips/support.S#7 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/support.S ==== --- /tmp/tmp.61628.22 Fri Sep 8 00:58:43 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/support.S Thu Sep 7 12:56:01 2006 @@ -128,10 +128,21 @@ END(memcpy) * int subyte(void *addr, int byte) */ ENTRY(subyte) +#if 0 break li v0, -1 jr ra nop +#endif + + sb a1, 0(a0) + jr ra + move v0, zero +#if 0 + lw t0, pcpup + lw t1, PC_CURPCB(t0) + lw t0, PCB_ONFAULT(t1) +#endif END(subyte) /* @@ -161,10 +172,15 @@ END(suswintr) * int suword(void *addr, long word) */ ENTRY(suword) +#if 0 break li v0, -1 jr ra nop +#endif + sw a1, 0(a0) + jr ra + move v0, zero END(suword) /* @@ -172,10 +188,14 @@ END(suword) * int suword32(void *addr, int word) */ ENTRY(suword32) +#if 0 break li v0, -1 jr ra nop +#endif + j suword + nop END(suword32) /* @@ -243,10 +263,15 @@ END(fuswintr) * long fuword(const void *addr) */ ENTRY(fuword) +#if 0 break li v0, -1 jr ra nop +#endif + lw v0, 0(a0) + jr ra + nop END(fuword) /* @@ -274,9 +299,17 @@ END(fuword32) * int copyin(const void *useraddr, void *kernaddr, size_t len) */ ENTRY(copyin) +#if 0 break jr ra nop +#endif + move t0, a0 + move a0, a1 + move a0, t0 + move v0, zero + j bcopy + nop END(copyin) /* @@ -284,8 +317,13 @@ END(copyin) * int copyout(const void *kernaddr, void *useraddr, size_t len) */ ENTRY(copyout) +#if 0 break jr ra + nop +#endif + move v0, zero + j bcopy nop END(copyout) ==== //depot/projects/mips2/src/sys/mips/mips/swtch.S#3 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/swtch.S ==== ==== //depot/projects/mips2/src/sys/mips/mips/tlb.c#6 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/tlb.c ==== --- /tmp/tmp.61628.23 Fri Sep 8 00:58:43 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/tlb.c Thu Sep 7 03:08:01 2006 @@ -56,6 +56,7 @@ #include #include #include +#include pt_entry_t *kptmap; vm_size_t kptsize; @@ -133,17 +134,30 @@ tlb_enter(pmap_t pmap, vm_offset_t va, v pa &= ~PAGE_MASK; va &= ~PAGE_MASK; - pte = tlb_pte_find(pmap->pm_lev1, va); + //pte = tlb_pte_find(pmap->pm_lev1, va); + pte = pmap_pte(pmap, va); if (pte_valid(pte)) tlb_invalidate_page(va); + //printf("%s: entering valid mapping\n", __func__); + //panic("entering where mapping already valid\n"); else mips_dcache_wbinv_range_index(va, PAGE_SIZE); if ((bits & PG_V) == 0) panic("pmap %p entering invalid mapping for va %lx to pa %lx [%lx]", pmap, (u_long)va, (u_long)pa, (u_long)bits); *pte &= PG_G; - *pte |= MIPS_PA_TO_PFN(pa) | bits; + *pte |= (MIPS_PA_TO_PFN(pa) << MIPS_PFN_SHIFT) | bits; *pte |= PG_C_UNCACHED; + + //printf("%s: va %p pa %p pte %#lx\n", __func__, (void *)va, (void *)pa, + // *pte); + +#if 1 + if ((va >> PAGE_SHIFT) & 1) + tlb_update(va, pte[-1], pte[0]); + else + tlb_update(va, pte[0], pte[1]); +#endif } void @@ -153,7 +167,10 @@ tlb_remove(pmap_t pmap, vm_offset_t va) va &= ~PAGE_MASK; - pte = tlb_pte_find(pmap->pm_lev1, va); + //printf("%s: removing va %p\n", __func__, (void *)va); + + //pte = tlb_pte_find(pmap->pm_lev1, va); + pte = pmap_pte(pmap, va); pte_clear(pte, PG_V); tlb_invalidate_page(va); } @@ -171,7 +188,7 @@ tlb_remove_pages(pmap_t pmap, vm_offset_ void tlb_remove_range(pmap_t pmap, vm_offset_t va, vm_offset_t eva) { - tlb_remove_pages(pmap, va, eva - va); + tlb_remove_pages(pmap, va, (eva - va) >> PAGE_SHIFT); } void @@ -180,6 +197,9 @@ tlb_update(vm_offset_t va, pt_entry_t pt u_long ehi; int i; + //printf("%s: va %p pa1 %#lx pa2 %#lx\n", __func__, (void *)va, + // MIPS_PTE_TO_PA(pte0), MIPS_PTE_TO_PA(pte1)); + va &= ~PAGE_MASK; ehi = MIPS_HI_ENTRY(va, /*asid*/0); mips_wr_entryhi(ehi); @@ -212,7 +232,7 @@ tlb_invalidate_one(int i) u_long ehi; /* Bogus VPN2. */ - ehi = MIPS_KSEG1_END + 2 * i * PAGE_SIZE; + ehi = MIPS_KSEG2_START + 0x0fff0000 + 2 * i * PAGE_SIZE; mips_wr_index(i); mips_wr_entrylo0(0); mips_wr_entrylo1(0); @@ -226,6 +246,8 @@ tlb_invalidate_page(vm_offset_t va) u_long ehi; int i; + //printf("%s: va %p\n", __func__, (void *)va); + va &= ~PAGE_MASK; ehi = MIPS_HI_ENTRY(va, /*asid*/0); mips_wr_entryhi(ehi); @@ -240,13 +262,14 @@ tlb_invalidate_page(vm_offset_t va) * PTE was not dirty and is being written to. XXX kernel only for now. */ void -tlb_modified(void *badvaddr) +tlb_modified(pmap_t pmap, void *badvaddr) { pt_entry_t *pte; vm_offset_t va; va = (vm_offset_t) badvaddr; - pte = tlb_pte_find(kernel_pmap->pm_lev1, va); + //pte = tlb_pte_find(kernel_pmap->pm_lev1, va); + pte = pmap_pte(pmap, va); /* * Do we really want to dirty this page? ==== //depot/projects/mips2/src/sys/mips/mips/trap.c#5 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/trap.c ==== --- /tmp/tmp.61628.24 Fri Sep 8 00:58:43 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/trap.c Wed Sep 6 20:39:42 2006 @@ -36,6 +36,9 @@ #include #include #include +#include +#include +#include #include #include @@ -95,9 +98,13 @@ static volatile int trap_error; void trap(struct trapframe *retf, u_int cause, void *badvaddr) { + vm_offset_t va; + vm_map_t map; + struct thread *td; struct trapframe *tf; struct trap_identifier *tid; int code, kernelmode; + int ftype, error; platform_trap_enter(); @@ -115,9 +122,56 @@ trap(struct trapframe *retf, u_int cause */ switch (code) { case TrMod: + printf("TLB mod %p\n", badvaddr); /* XXX Kernel only. */ - tlb_modified(badvaddr); + va = trunc_page(badvaddr); + if (va >= KERNBASE) + tlb_modified(kernel_pmap, (void *)va); + else + tlb_modified(&curthread->td_proc->p_vmspace->vm_pmap, + (void *)va); goto done; + case TrTLBL: + case TrTLBS: + va = trunc_page(badvaddr); + td = curthread; + + printf("TLB%c refill vaddr %p pc %#x td %p\n", code == TrTLBL ? 'L' : 'S' , badvaddr, tf->tf_regs[TF_EPC], td); + + if (va >= KERNBASE) { + //panic("wtf?\n"); + pt_entry_t *pte; + pte = tlb_pte_find(kernel_pmap->pm_lev1, va); + + printf("pte %p %#lx pa %p\n", pte, *pte, (void *)MIPS_PTE_TO_PA(*pte)); + if (!pte_valid(pte)) { + //break; + //panic("bad pte"); + map = kernel_map; + goto heavy; + } + + if ((va >> PAGE_SHIFT) & 1) + tlb_update(va, pte[-1], pte[0]); + else + tlb_update(va, pte[0], pte[1]); + goto done; + } else + map = &td->td_proc->p_vmspace->vm_map; + +heavy: + if (code == TrTLBL) + ftype = VM_PROT_READ; + else + ftype = VM_PROT_WRITE; + error = vm_fault(map, va, ftype, + (ftype & VM_PROT_WRITE) ? VM_FAULT_DIRTY : VM_FAULT_NORMAL); + + if (error == KERN_SUCCESS) + goto done; + if (kernelmode) + break; + /* XXX send signal */ case TrAdEL: case TrDBE: if (trap_error == -1/* && trap_addr == badvaddr*/) { ==== //depot/projects/mips2/src/sys/mips/mips/vm_machdep.c#7 - /home/suleiman/freebsd/p4/mips/sys/mips/mips/vm_machdep.c ==== --- /tmp/tmp.61628.25 Fri Sep 8 00:58:43 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips/vm_machdep.c Thu Sep 7 01:31:06 2006 @@ -134,7 +134,6 @@ cpu_thread_swapout(struct thread *td) void sf_buf_free(struct sf_buf *sf) { - panic("%s", __func__); } #if 0 static void @@ -147,8 +146,7 @@ sf_buf_init(void *arg) struct sf_buf * sf_buf_alloc(struct vm_page *m, int flags) { - panic("%s", __func__); - return (NULL); + return ((struct sf_buf *)m); } void ==== //depot/projects/mips2/src/sys/mips/mips4k/malta/gt_pci.c#2 - /home/suleiman/freebsd/p4/mips/sys/mips/mips4k/malta/gt_pci.c ==== --- /tmp/tmp.61628.26 Fri Sep 8 00:58:43 2006 +++ /home/suleiman/freebsd/p4/mips/sys/mips/mips4k/malta/gt_pci.c Wed Sep 6 15:45:49 2006 @@ -587,6 +587,9 @@ gt_pci_activate_resource(device_t bus, d { bus_space_handle_t p; int error; + + if (r == NULL) + panic("null resource"); if ((type == SYS_RES_MEMORY) || (type == SYS_RES_IOPORT)) { error = bus_space_map(rman_get_bustag(r), ==== //depot/projects/mips2/src/sys/vm/vm_map.c#2 - /home/suleiman/freebsd/p4/mips/sys/vm/vm_map.c ==== --- /tmp/tmp.61628.27 Fri Sep 8 00:58:44 2006 +++ /home/suleiman/freebsd/p4/mips/sys/vm/vm_map.c Tue Sep 5 22:37:51 2006 @@ -137,7 +137,7 @@ static uma_zone_t kmapentzone; static uma_zone_t mapzone; static uma_zone_t vmspace_zone; static struct vm_object kmapentobj; -static int vmspace_zinit(void *mem, int size, int flags); +static int vmspace_zinit(void *mem, int size, void *arg, int flags); static void vmspace_zfini(void *mem, int size); static int vm_map_zinit(void *mem, int ize, int flags); static void vm_map_zfini(void *mem, int size); @@ -186,7 +186,7 @@ vmspace_zfini(void *mem, int size) } static int -vmspace_zinit(void *mem, int size, int flags) +vmspace_zinit(void *mem, int size, void *arg, int flags) { struct vmspace *vm; @@ -277,13 +277,13 @@ vm_init2(void) uma_zone_set_obj(kmapentzone, &kmapentobj, lmin(cnt.v_page_count, (VM_MAX_KERNEL_ADDRESS - KERNBASE) / PAGE_SIZE) / 8 + maxproc * 2 + maxfiles); - vmspace_zone = uma_zcreate("VMSPACE", sizeof(struct vmspace), NULL, + vmspace_zone = uma_zcreate("VMSPACE", sizeof(struct vmspace), vmspace_zinit, #ifdef INVARIANTS vmspace_zdtor, #else NULL, #endif - vmspace_zinit, vmspace_zfini, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); + NULL, vmspace_zfini, UMA_ALIGN_PTR, UMA_ZONE_NOFREE); } static inline void