Module Name: src Committed By: jym Date: Sat Jul 24 00:45:57 UTC 2010
Modified Files: src/sys/arch/i386/conf: GENERIC src/sys/arch/i386/i386: bioscall.S kvm86call.S locore.S machdep.c mptramp.S multiboot.c src/sys/arch/i386/include: pmap.h src/sys/arch/x86/include: cpu.h pmap.h src/sys/arch/x86/x86: cpu.c pmap.c src/sys/arch/xen/x86: cpu.c x86_xpmap.c xenfunc.c Log Message: Welcome PAE inside i386 current. This patch is inspired by work previously done by Jeremy Morse, ported by me to -current, merged with the work previously done for port-xen, together with additionals fixes and improvements. PAE option is disabled by default in GENERIC (but will be enabled in ALL in the next few days). In quick, PAE switches the CPU to a mode where physical addresses become 36 bits (64 GiB). Virtual address space remains at 32 bits (4 GiB). To cope with the increased size of the physical address, they are manipulated as 64 bits variables by kernel and MMU. When supported by the CPU, it also allows the use of the NX/XD bit that provides no-execution right enforcement on a per physical page basis. Notes: - reworked locore.S - introduce cpu_load_pmap(), used to switch pmap for the curcpu. Due to the different handling of pmap mappings with PAE vs !PAE, Xen vs native, details are hidden within this function. This helps calling it from assembly, as some features, like BIOS calls, switch to pmap_kernel before mapping trampoline code in low memory. - some changes in bioscall and kvm86_call, to reflect the above. - the L3 is "pinned" per-CPU, and is only manipulated by a reduced set of functions within pmap. To track the L3, I added two elements to struct cpu_info, namely ci_l3_pdirpa (PA of the L3), and ci_l3_pdir (the L3 VA). Rest of the code considers that it runs "just like" a normal i386, except that the L2 is 4 pages long (PTP_LEVELS is still 2). - similar to the ci_pae_l3_pdir{,pa} variables, amd64's xen_current_user_pgd becomes an element of cpu_info (slowly paving the way for MP world). - bootinfo_source struct declaration is modified, to cope with paddr_t size change with PAE (it is not correct to assume that bs_addr is a paddr_t when compiled with PAE - it should remain 32 bits). bs_addrs is now a void * array (in bootloader's code under i386/stand/, the bs_addrs is a physaddr_t, which is an unsigned long). - fixes in multiboot code (same reason as bootinfo): paddr_t size change. I used Elf32_* types, use RELOC() where necessary, and move the memcpy() functions out of the if/else if (I do not expect sym and str tables to overlap with ELF). - 64 bits atomic functions for pmap - all pmap_pdirpa access are now done through the pmap_pdirpa macro. It hides the L3/L2 stuff from PAE, as well as the pm_pdirpa change in struct pmap (it now becomes a PDP_SIZE array, with or without PAE). - manipulation of recursive mappings ( PDIR_SLOT_{,A}PTEs ) is done via loops on PDP_SIZE. See also http://mail-index.netbsd.org/port-i386/2010/07/17/msg002062.html No objection raised on port-i386@ and port-...@r for about a week. XXX kvm(3) will be fixed in another patch to properly handle both PAE and !PAE kernel dumps (VA => PA macros are slightly different, and need proper 64 bits PA support in kvm_i386). XXX Mixing PAE and !PAE modules may lead to unwanted/unexpected results. This cannot be solved easily, and needs lots of thinking before being declared safe (paddr_t/bus_addr_t size handling, PD/PT macros abstractions). To generate a diff of this commit: cvs rdiff -u -r1.988 -r1.989 src/sys/arch/i386/conf/GENERIC cvs rdiff -u -r1.8 -r1.9 src/sys/arch/i386/i386/bioscall.S cvs rdiff -u -r1.9 -r1.10 src/sys/arch/i386/i386/kvm86call.S cvs rdiff -u -r1.92 -r1.93 src/sys/arch/i386/i386/locore.S cvs rdiff -u -r1.690 -r1.691 src/sys/arch/i386/i386/machdep.c cvs rdiff -u -r1.20 -r1.21 src/sys/arch/i386/i386/mptramp.S cvs rdiff -u -r1.19 -r1.20 src/sys/arch/i386/i386/multiboot.c cvs rdiff -u -r1.106 -r1.107 src/sys/arch/i386/include/pmap.h cvs rdiff -u -r1.22 -r1.23 src/sys/arch/x86/include/cpu.h cvs rdiff -u -r1.32 -r1.33 src/sys/arch/x86/include/pmap.h cvs rdiff -u -r1.72 -r1.73 src/sys/arch/x86/x86/cpu.c cvs rdiff -u -r1.112 -r1.113 src/sys/arch/x86/x86/pmap.c cvs rdiff -u -r1.46 -r1.47 src/sys/arch/xen/x86/cpu.c cvs rdiff -u -r1.20 -r1.21 src/sys/arch/xen/x86/x86_xpmap.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/xen/x86/xenfunc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.