From owner-svn-src-all@FreeBSD.ORG Fri Mar 12 07:08:21 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 328B6106564A; Fri, 12 Mar 2010 07:08:21 +0000 (UTC) (envelope-from neel@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 0943E8FC19; Fri, 12 Mar 2010 07:08:21 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o2C78KGn025550; Fri, 12 Mar 2010 07:08:20 GMT (envelope-from neel@svn.freebsd.org) Received: (from neel@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o2C78KTG025547; Fri, 12 Mar 2010 07:08:20 GMT (envelope-from neel@svn.freebsd.org) Message-Id: <201003120708.o2C78KTG025547@svn.freebsd.org> From: Neel Natu Date: Fri, 12 Mar 2010 07:08:20 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r205072 - in head/sys/mips: include mips X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 12 Mar 2010 07:08:21 -0000 Author: neel Date: Fri Mar 12 07:08:20 2010 New Revision: 205072 URL: http://svn.freebsd.org/changeset/base/205072 Log: - Enable kernel stack guard page. - Unmap the unused kernel stack page that we cannot use because it is not aligned on a (PAGE_SIZE * 2) boundary. Modified: head/sys/mips/include/param.h head/sys/mips/mips/vm_machdep.c Modified: head/sys/mips/include/param.h ============================================================================== --- head/sys/mips/include/param.h Fri Mar 12 06:57:53 2010 (r205071) +++ head/sys/mips/include/param.h Fri Mar 12 07:08:20 2010 (r205072) @@ -128,14 +128,13 @@ #define MAXDUMPPGS 1 /* xxx: why is this only one? */ /* - * NOTE: In FreeBSD, Uarea's don't have a fixed address. - * Therefore, any code imported from OpenBSD which depends on - * UADDR, UVPN and KERNELSTACK requires porting. - * XXX: 3 stack pages? Not 4 which would be more efficient from a tlb - * XXX: point of view. + * The kernel stack needs to be aligned on a (PAGE_SIZE * 2) boundary. + * + * Although we allocate 3 pages for the kernel stack we end up using + * only the 2 pages that are aligned on a (PAGE_SIZE * 2) boundary. */ #define KSTACK_PAGES 3 /* kernel stack*/ -#define KSTACK_GUARD_PAGES 0 /* pages of kstack guard; 0 disables */ +#define KSTACK_GUARD_PAGES 1 /* pages of kstack guard; 0 disables */ #define UPAGES 2 Modified: head/sys/mips/mips/vm_machdep.c ============================================================================== --- head/sys/mips/mips/vm_machdep.c Fri Mar 12 06:57:53 2010 (r205071) +++ head/sys/mips/mips/vm_machdep.c Fri Mar 12 07:08:20 2010 (r205072) @@ -214,6 +214,16 @@ cpu_thread_swapin(struct thread *td) { pt_entry_t *pte; int i; + vm_offset_t unused_kstack_page; + + /* + * Unmap the unused kstack page. + */ + unused_kstack_page = td->td_kstack; + if (td->td_md.md_realstack == td->td_kstack) + unused_kstack_page += (KSTACK_PAGES - 1) * PAGE_SIZE; + + pmap_kremove(unused_kstack_page); /* * The kstack may be at a different physical address now. @@ -239,13 +249,19 @@ cpu_thread_swapout(struct thread *td) void cpu_thread_alloc(struct thread *td) { + vm_offset_t unused_kstack_page; pt_entry_t *pte; int i; - if(td->td_kstack & (1 << PAGE_SHIFT)) + if (td->td_kstack & (1 << PAGE_SHIFT)) { td->td_md.md_realstack = td->td_kstack + PAGE_SIZE; - else + unused_kstack_page = td->td_kstack; + } else { td->td_md.md_realstack = td->td_kstack; + unused_kstack_page = td->td_kstack + + (KSTACK_PAGES - 1) * PAGE_SIZE; + } + pmap_kremove(unused_kstack_page); td->td_pcb = (struct pcb *)(td->td_md.md_realstack + (td->td_kstack_pages - 1) * PAGE_SIZE) - 1;