Date: Fri, 13 Oct 2006 14:26:43 GMT From: Oleksandr Tymoshenko <gonzo@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 107822 for review Message-ID: <200610131426.k9DEQhsW032965@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=107822 Change 107822 by gonzo@gonzo_hq on 2006/10/13 14:25:55 o Keep realstack pointer and pte0, pte1 for this pointer in machine-dependant fields of thread struct for further use. Affected files ... .. //depot/projects/mips2/src/sys/mips/include/proc.h#4 edit .. //depot/projects/mips2/src/sys/mips/mips/vm_machdep.c#9 edit Differences ... ==== //depot/projects/mips2/src/sys/mips/include/proc.h#4 (text+ko) ==== @@ -33,14 +33,18 @@ #ifndef _MACHINE_PROC_H_ #define _MACHINE_PROC_H_ +#include <machine/pte.h> + /* * Machine-dependent part of the proc structure for AMD64. */ struct mdthread { - int md_flags; /* machine-dependent flags */ - void *md_regs; /* registers on current frame */ - __register_t md_saved_sr; /* critical section saved SR */ - int md_spinlock_count; + int md_flags; /* machine-dependent flags */ + void *md_regs; /* registers on current frame */ + __register_t md_saved_sr; /* critical section saved SR */ + vm_offset_t md_realstack; + pt_entry_t md_stack_pte[2]; + int md_spinlock_count; }; struct mdproc { ==== //depot/projects/mips2/src/sys/mips/mips/vm_machdep.c#9 (text+ko) ==== @@ -40,6 +40,7 @@ #include <machine/cpu.h> #include <machine/pcb.h> #include <machine/sysarch.h> +#include <machine/tlb.h> #include <vm/vm.h> #include <vm/pmap.h> #include <sys/lock.h> @@ -178,8 +179,31 @@ void cpu_thread_setup(struct thread *td) { + pt_entry_t *pte; + /* + * To use wired TLB we should have even-aligned virtual address + * Since there is no way to specify alignment for td_kstack we + * drop KSTACK_GUARD support and request 3 pages for kstack. + * And use first even-aligned page number. + */ + if(td->td_kstack & (1 << PAGE_SHIFT)) + td->td_md.md_realstack = td->td_kstack + PAGE_SIZE; + else + td->td_md.md_realstack = td->td_kstack; + + /* + * Fill out PTEs to be wired then + */ + pte = tlb_kern_pte_find(kptmap, td->td_md.md_realstack); + td->td_md.md_stack_pte[0] = *pte; + + pte = tlb_kern_pte_find(kptmap, td->td_md.md_realstack + PAGE_SIZE); + td->td_md.md_stack_pte[1] = *pte; + + td->td_pcb = - (struct pcb *)(td->td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; + (struct pcb *)(td->td_md.md_realstack \ + + (KSTACK_PAGES - 1) * PAGE_SIZE) - 1; td->td_frame = (struct trapframe *)td->td_pcb - 1; /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200610131426.k9DEQhsW032965>