From owner-svn-src-projects@FreeBSD.ORG Mon Feb 25 00:04:03 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id D91BF13B; Mon, 25 Feb 2013 00:04:03 +0000 (UTC) (envelope-from benno@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id BB9C4F17; Mon, 25 Feb 2013 00:04:03 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r1P043bv040078; Mon, 25 Feb 2013 00:04:03 GMT (envelope-from benno@svn.freebsd.org) Received: (from benno@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r1P043Wa040074; Mon, 25 Feb 2013 00:04:03 GMT (envelope-from benno@svn.freebsd.org) Message-Id: <201302250004.r1P043Wa040074@svn.freebsd.org> From: Benno Rice Date: Mon, 25 Feb 2013 00:04:03 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r247247 - in projects/uefi/sys/amd64: amd64 include X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Feb 2013 00:04:03 -0000 Author: benno Date: Mon Feb 25 00:04:02 2013 New Revision: 247247 URL: http://svnweb.freebsd.org/changeset/base/247247 Log: Rearrange early pmap bootstrap so we have real page tables before cninit. Modified: projects/uefi/sys/amd64/amd64/machdep.c projects/uefi/sys/amd64/amd64/pmap.c projects/uefi/sys/amd64/include/pmap.h Modified: projects/uefi/sys/amd64/amd64/machdep.c ============================================================================== --- projects/uefi/sys/amd64/amd64/machdep.c Sun Feb 24 23:57:52 2013 (r247246) +++ projects/uefi/sys/amd64/amd64/machdep.c Mon Feb 25 00:04:02 2013 (r247247) @@ -1525,16 +1525,13 @@ add_efi_map_entries(struct efi_header *e * * XXX first should be vm_paddr_t. */ -static void -getmemsize(caddr_t kmdp, u_int64_t first) +static int +parsememmap(caddr_t kmdp, u_int64_t first, vm_paddr_t *physmap) { - int i, physmap_idx, pa_indx, da_indx; - vm_paddr_t pa, physmap[PHYSMAP_SIZE]; - u_long physmem_start, physmem_tunable, memtest; - pt_entry_t *pte; + int i, physmap_idx; + u_long physmem_tunable; struct bios_smap *smapbase; struct efi_header *efihdr; - quad_t dcons_addr, dcons_size; bzero(physmap, sizeof(physmap)); basemem = 0; @@ -1548,12 +1545,8 @@ getmemsize(caddr_t kmdp, u_int64_t first panic("No BIOS smap or EFI map info from loader!"); if (efihdr != NULL) { - if (boothowto & RB_VERBOSE) - printf("Using EFI memory map.\n"); add_efi_map_entries(efihdr, physmap, &physmap_idx); } else { - if (boothowto & RB_VERBOSE) - printf("Using BIOS SMAP memory map.\n"); add_smap_entries(smapbase, physmap, &physmap_idx); } @@ -1591,26 +1584,38 @@ getmemsize(caddr_t kmdp, u_int64_t first Maxmem = atop(physmem_tunable); /* - * By default enable the memory test on real hardware, and disable - * it if we appear to be running in a VM. This avoids touching all - * pages unnecessarily, which doesn't matter on real hardware but is - * bad for shared VM hosts. Use a general name so that - * one could eventually do more with the code than just disable it. - */ - memtest = (vm_guest > VM_GUEST_NO) ? 0 : 1; - TUNABLE_ULONG_FETCH("hw.memtest.tests", &memtest); - - /* * Don't allow MAXMEM or hw.physmem to extend the amount of memory * in the system. */ if (Maxmem > atop(physmap[physmap_idx + 1])) Maxmem = atop(physmap[physmap_idx + 1]); + return (physmap_idx); +} + +static void +getmemsize(vm_paddr_t first, vm_paddr_t *physmap, int physmap_idx) +{ + u_long physmem_start, memtest; + int i, pa_indx, da_indx; + vm_paddr_t pa; + pt_entry_t *pte; + quad_t dcons_addr, dcons_size; + if (atop(physmap[physmap_idx + 1]) != Maxmem && (boothowto & RB_VERBOSE)) printf("Physical memory use set to %ldK\n", Maxmem * 4); + /* + * By default enable the memory test on real hardware, and disable + * it if we appear to be running in a VM. This avoids touching all + * pages unnecessarily, which doesn't matter on real hardware but is + * bad for shared VM hosts. Use a general name so that + * one could eventually do more with the code than just disable it. + */ + memtest = (vm_guest > VM_GUEST_NO) ? 0 : 1; + TUNABLE_ULONG_FETCH("hw.memtest.tests", &memtest); + /* call pmap initialization to make new kernel address space */ pmap_bootstrap(&first); @@ -1797,6 +1802,8 @@ hammer_time(u_int64_t modulep, u_int64_t u_int64_t msr; char *env; size_t kstack0_sz; + vm_paddr_t physmap[PHYSMAP_SIZE]; + int physmap_idx; thread0.td_kstack = physfree + KERNBASE; thread0.td_kstack_pages = KSTACK_PAGES; @@ -1906,6 +1913,9 @@ hammer_time(u_int64_t modulep, u_int64_t */ i8254_init(); + physmap_idx = parsememmap(kmdp, physfree, physmap); + create_pagetables(&physfree); + /* * Initialize the console before we print anything out. */ @@ -1970,7 +1980,7 @@ hammer_time(u_int64_t modulep, u_int64_t wrmsr(MSR_STAR, msr); wrmsr(MSR_SF_MASK, PSL_NT|PSL_T|PSL_I|PSL_C|PSL_D); - getmemsize(kmdp, physfree); + getmemsize(physfree, physmap, physmap_idx); init_param2(physmem); /* now running on new page tables, configured,and u/iom is accessible */ Modified: projects/uefi/sys/amd64/amd64/pmap.c ============================================================================== --- projects/uefi/sys/amd64/amd64/pmap.c Sun Feb 24 23:57:52 2013 (r247246) +++ projects/uefi/sys/amd64/amd64/pmap.c Mon Feb 25 00:04:02 2013 (r247247) @@ -529,7 +529,7 @@ nkpt_init(vm_paddr_t addr) nkpt = pt_pages; } -static void +void create_pagetables(vm_paddr_t *firstaddr) { int i, j, ndm1g, nkpdpe; @@ -647,11 +647,6 @@ pmap_bootstrap(vm_paddr_t *firstaddr) vm_offset_t va; pt_entry_t *pte, *unused; - /* - * Create an initial set of page tables to run the kernel in. - */ - create_pagetables(firstaddr); - virtual_avail = (vm_offset_t) KERNBASE + *firstaddr; virtual_avail = pmap_kmem_choose(virtual_avail); Modified: projects/uefi/sys/amd64/include/pmap.h ============================================================================== --- projects/uefi/sys/amd64/include/pmap.h Sun Feb 24 23:57:52 2013 (r247246) +++ projects/uefi/sys/amd64/include/pmap.h Mon Feb 25 00:04:02 2013 (r247247) @@ -307,6 +307,7 @@ extern vm_offset_t virtual_end; #define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) #define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz)) +void create_pagetables(vm_paddr_t *); void pmap_bootstrap(vm_paddr_t *); int pmap_change_attr(vm_offset_t, vm_size_t, int); void pmap_demote_DMAP(vm_paddr_t base, vm_size_t len, boolean_t invalidate);