Date: Fri, 11 Aug 2006 20:47:23 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 103661 for review Message-ID: <200608112047.k7BKlNol022232@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=103661 Change 103661 by jhb@jhb_mutex on 2006/08/11 20:47:19 IFC @103654. Affected files ... .. //depot/projects/smpng/sys/Makefile#13 integrate .. //depot/projects/smpng/sys/amd64/acpica/madt.c#11 integrate .. //depot/projects/smpng/sys/amd64/amd64/pmap.c#66 integrate .. //depot/projects/smpng/sys/amd64/amd64/trap.c#53 integrate .. //depot/projects/smpng/sys/amd64/include/pmap.h#24 integrate .. //depot/projects/smpng/sys/amd64/linux32/linux32_sysvec.c#17 integrate .. //depot/projects/smpng/sys/arm/arm/mem.c#3 integrate .. //depot/projects/smpng/sys/arm/arm/pmap.c#33 integrate .. //depot/projects/smpng/sys/arm/arm/vm_machdep.c#22 integrate .. //depot/projects/smpng/sys/arm/at91/at91_st.c#5 integrate .. //depot/projects/smpng/sys/arm/at91/kb920x_machdep.c#9 integrate .. //depot/projects/smpng/sys/arm/include/pmap.h#18 integrate .. //depot/projects/smpng/sys/arm/include/sf_buf.h#2 integrate .. //depot/projects/smpng/sys/arm/include/vmparam.h#6 integrate .. //depot/projects/smpng/sys/arm/sa11x0/assabet_machdep.c#11 integrate .. //depot/projects/smpng/sys/arm/xscale/i80321/iq31244_machdep.c#19 integrate .. //depot/projects/smpng/sys/boot/Makefile#22 integrate .. //depot/projects/smpng/sys/boot/arm/Makefile#1 branch .. //depot/projects/smpng/sys/boot/arm/at91/Makefile.inc#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/bootiic/Makefile#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/bootiic/arm_init.S#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/bootiic/env_vars.c#1 branch .. //depot/projects/smpng/sys/boot/arm/at91/bootiic/env_vars.h#1 branch .. //depot/projects/smpng/sys/boot/arm/at91/bootiic/loader_prompt.c#1 branch .. //depot/projects/smpng/sys/boot/arm/at91/bootiic/loader_prompt.h#1 branch .. //depot/projects/smpng/sys/boot/arm/at91/bootiic/main.c#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/Makefile#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/at91rm9200.h#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/at91rm9200_lowlevel.h#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/eeprom.c#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/eeprom.h#2 delete .. //depot/projects/smpng/sys/boot/arm/at91/libat91/emac.c#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/emac.h#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/env_vars.c#2 delete .. //depot/projects/smpng/sys/boot/arm/at91/libat91/env_vars.h#2 delete .. //depot/projects/smpng/sys/boot/arm/at91/libat91/lib.h#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/loader_prompt.c#2 delete .. //depot/projects/smpng/sys/boot/arm/at91/libat91/loader_prompt.h#2 delete .. //depot/projects/smpng/sys/boot/arm/at91/libat91/p_string.c#2 integrate .. //depot/projects/smpng/sys/boot/arm/at91/libat91/p_string.h#2 delete .. //depot/projects/smpng/sys/boot/arm/at91/libat91/spi_flash.c#1 branch .. //depot/projects/smpng/sys/boot/arm/at91/libat91/spi_flash.h#1 branch .. //depot/projects/smpng/sys/boot/arm/at91/libat91/xmodem.c#2 integrate .. //depot/projects/smpng/sys/boot/i386/loader/main.c#13 integrate .. //depot/projects/smpng/sys/boot/pc98/loader/main.c#11 integrate .. //depot/projects/smpng/sys/compat/linprocfs/linprocfs.c#49 integrate .. //depot/projects/smpng/sys/compat/svr4/svr4_sockio.c#10 integrate .. //depot/projects/smpng/sys/compat/svr4/svr4_stream.c#42 integrate .. //depot/projects/smpng/sys/conf/files#185 integrate .. //depot/projects/smpng/sys/conf/options#125 integrate .. //depot/projects/smpng/sys/conf/options.arm#10 integrate .. //depot/projects/smpng/sys/dev/acpica/Osd/OsdMemory.c#10 integrate .. //depot/projects/smpng/sys/dev/acpica/acpi_dock.c#3 integrate .. //depot/projects/smpng/sys/dev/acpica/acpi_hpet.c#4 integrate .. //depot/projects/smpng/sys/dev/acpica/acpi_pci_link.c#35 integrate .. //depot/projects/smpng/sys/dev/acpica/acpi_video.c#11 integrate .. //depot/projects/smpng/sys/dev/ata/ata-chipset.c#71 integrate .. //depot/projects/smpng/sys/dev/ata/ata-disk.c#59 integrate .. //depot/projects/smpng/sys/dev/ata/ata-pci.h#45 integrate .. //depot/projects/smpng/sys/dev/ath/if_ath.c#43 integrate .. //depot/projects/smpng/sys/dev/ath/if_athioctl.h#14 integrate .. //depot/projects/smpng/sys/dev/bge/if_bge.c#78 integrate .. //depot/projects/smpng/sys/dev/bge/if_bgereg.h#44 integrate .. //depot/projects/smpng/sys/dev/bktr/CHANGELOG.TXT#5 integrate .. //depot/projects/smpng/sys/dev/dpt/dpt_scsi.c#15 integrate .. //depot/projects/smpng/sys/dev/em/README#13 integrate .. //depot/projects/smpng/sys/dev/em/if_em.c#71 integrate .. //depot/projects/smpng/sys/dev/em/if_em.h#33 integrate .. //depot/projects/smpng/sys/dev/em/if_em_hw.c#19 integrate .. //depot/projects/smpng/sys/dev/em/if_em_hw.h#19 integrate .. //depot/projects/smpng/sys/dev/em/if_em_osdep.h#18 integrate .. //depot/projects/smpng/sys/dev/fe/if_fe.c#24 integrate .. //depot/projects/smpng/sys/dev/isp/isp.c#42 integrate .. //depot/projects/smpng/sys/dev/isp/isp_freebsd.c#44 integrate .. //depot/projects/smpng/sys/dev/isp/isp_ioctl.h#16 integrate .. //depot/projects/smpng/sys/dev/isp/isp_library.c#4 integrate .. //depot/projects/smpng/sys/dev/isp/isp_target.c#20 integrate .. //depot/projects/smpng/sys/dev/isp/isp_target.h#13 integrate .. //depot/projects/smpng/sys/dev/isp/isp_tpublic.h#10 integrate .. //depot/projects/smpng/sys/dev/ixgb/if_ixgb.c#16 integrate .. //depot/projects/smpng/sys/dev/mxge/if_mxge.c#5 integrate .. //depot/projects/smpng/sys/dev/patm/if_patm_intr.c#7 integrate .. //depot/projects/smpng/sys/dev/pccard/pccard_cis.c#24 integrate .. //depot/projects/smpng/sys/dev/pci/pcivar.h#18 integrate .. //depot/projects/smpng/sys/dev/re/if_re.c#44 integrate .. //depot/projects/smpng/sys/dev/sound/pci/emu10k1.c#29 integrate .. //depot/projects/smpng/sys/dev/sound/pci/emu10kx-pcm.c#2 integrate .. //depot/projects/smpng/sys/dev/sound/pci/emu10kx.c#2 integrate .. //depot/projects/smpng/sys/dev/sound/pci/emu10kx.h#2 integrate .. //depot/projects/smpng/sys/dev/sym/sym_fw1.h#5 integrate .. //depot/projects/smpng/sys/dev/sym/sym_fw2.h#5 integrate .. //depot/projects/smpng/sys/dev/usb/usbdevs#93 integrate .. //depot/projects/smpng/sys/dev/usb/uscanner.c#34 integrate .. //depot/projects/smpng/sys/dev/wi/if_wavelan_ieee.h#14 integrate .. //depot/projects/smpng/sys/dev/wi/if_wi.c#81 integrate .. //depot/projects/smpng/sys/dev/wi/if_wireg.h#22 integrate .. //depot/projects/smpng/sys/fs/hpfs/hpfs.h#11 integrate .. //depot/projects/smpng/sys/fs/msdosfs/msdosfs_vfsops.c#47 integrate .. //depot/projects/smpng/sys/fs/nwfs/nwfs_io.c#21 integrate .. //depot/projects/smpng/sys/fs/smbfs/smbfs_io.c#24 integrate .. //depot/projects/smpng/sys/geom/bde/g_bde_work.c#16 integrate .. //depot/projects/smpng/sys/geom/eli/g_eli.c#14 integrate .. //depot/projects/smpng/sys/geom/eli/g_eli.h#7 integrate .. //depot/projects/smpng/sys/geom/eli/g_eli_ctl.c#6 integrate .. //depot/projects/smpng/sys/geom/geom_gpt.c#26 integrate .. //depot/projects/smpng/sys/geom/mirror/g_mirror.c#33 integrate .. //depot/projects/smpng/sys/geom/raid3/g_raid3.c#34 integrate .. //depot/projects/smpng/sys/i386/acpica/acpi_machdep.c#24 integrate .. //depot/projects/smpng/sys/i386/acpica/acpi_wakeup.c#35 integrate .. //depot/projects/smpng/sys/i386/acpica/madt.c#17 integrate .. //depot/projects/smpng/sys/i386/conf/XBOX#7 integrate .. //depot/projects/smpng/sys/i386/i386/identcpu.c#48 integrate .. //depot/projects/smpng/sys/i386/i386/machdep.c#115 integrate .. //depot/projects/smpng/sys/i386/i386/pmap.c#106 integrate .. //depot/projects/smpng/sys/i386/i386/tsc.c#10 integrate .. //depot/projects/smpng/sys/i386/include/pmap.h#31 integrate .. //depot/projects/smpng/sys/i386/isa/clock.c#48 integrate .. //depot/projects/smpng/sys/i386/linux/linux_sysvec.c#52 integrate .. //depot/projects/smpng/sys/ia64/include/pmap.h#24 integrate .. //depot/projects/smpng/sys/kern/Makefile#5 integrate .. //depot/projects/smpng/sys/kern/init_sysent.c#74 integrate .. //depot/projects/smpng/sys/kern/kern_resource.c#62 integrate .. //depot/projects/smpng/sys/kern/kern_tc.c#42 integrate .. //depot/projects/smpng/sys/kern/makesyscalls.sh#21 integrate .. //depot/projects/smpng/sys/kern/subr_bus.c#62 integrate .. //depot/projects/smpng/sys/kern/subr_rman.c#29 integrate .. //depot/projects/smpng/sys/kern/syscalls.c#74 integrate .. //depot/projects/smpng/sys/kern/systrace_args.c#1 branch .. //depot/projects/smpng/sys/kern/uipc_proto.c#7 delete .. //depot/projects/smpng/sys/kern/uipc_socket.c#91 integrate .. //depot/projects/smpng/sys/kern/uipc_syscalls.c#93 integrate .. //depot/projects/smpng/sys/kern/uipc_usrreq.c#66 integrate .. //depot/projects/smpng/sys/kern/vfs_bio.c#94 integrate .. //depot/projects/smpng/sys/kern/vfs_lookup.c#37 integrate .. //depot/projects/smpng/sys/kern/vfs_subr.c#132 integrate .. //depot/projects/smpng/sys/net/bpf.c#63 integrate .. //depot/projects/smpng/sys/net/if_faith.c#33 integrate .. //depot/projects/smpng/sys/net/if_gif.c#38 integrate .. //depot/projects/smpng/sys/net/if_gre.c#32 integrate .. //depot/projects/smpng/sys/net/if_stf.c#38 integrate .. //depot/projects/smpng/sys/net/if_tun.c#47 integrate .. //depot/projects/smpng/sys/net/if_var.h#45 integrate .. //depot/projects/smpng/sys/net/if_vlan.c#52 integrate .. //depot/projects/smpng/sys/net/net_osdep.h#14 delete .. //depot/projects/smpng/sys/net80211/ieee80211_input.c#31 integrate .. //depot/projects/smpng/sys/net80211/ieee80211_ioctl.c#28 integrate .. //depot/projects/smpng/sys/net80211/ieee80211_ioctl.h#13 integrate .. //depot/projects/smpng/sys/net80211/ieee80211_output.c#26 integrate .. //depot/projects/smpng/sys/netatalk/ddp_usrreq.c#27 integrate .. //depot/projects/smpng/sys/netgraph/ng_ether.c#33 integrate .. //depot/projects/smpng/sys/netgraph/ng_pppoe.c#30 integrate .. //depot/projects/smpng/sys/netgraph/ng_pppoe.h#13 integrate .. //depot/projects/smpng/sys/netinet/in_gif.c#19 integrate .. //depot/projects/smpng/sys/netinet/ip_encap.c#15 integrate .. //depot/projects/smpng/sys/netinet/ip_fw2.c#76 integrate .. //depot/projects/smpng/sys/netinet6/ah_aesxcbcmac.c#4 integrate .. //depot/projects/smpng/sys/netinet6/ah_core.c#11 integrate .. //depot/projects/smpng/sys/netinet6/ah_input.c#14 integrate .. //depot/projects/smpng/sys/netinet6/ah_output.c#7 integrate .. //depot/projects/smpng/sys/netinet6/esp_aesctr.c#4 integrate .. //depot/projects/smpng/sys/netinet6/esp_core.c#12 integrate .. //depot/projects/smpng/sys/netinet6/esp_input.c#19 integrate .. //depot/projects/smpng/sys/netinet6/esp_output.c#8 integrate .. //depot/projects/smpng/sys/netinet6/esp_rijndael.c#6 integrate .. //depot/projects/smpng/sys/netinet6/frag6.c#12 integrate .. //depot/projects/smpng/sys/netinet6/icmp6.c#34 integrate .. //depot/projects/smpng/sys/netinet6/in6.c#34 integrate .. //depot/projects/smpng/sys/netinet6/in6_cksum.c#11 integrate .. //depot/projects/smpng/sys/netinet6/in6_gif.c#14 integrate .. //depot/projects/smpng/sys/netinet6/in6_ifattach.c#18 integrate .. //depot/projects/smpng/sys/netinet6/in6_proto.c#15 integrate .. //depot/projects/smpng/sys/netinet6/in6_src.c#26 integrate .. //depot/projects/smpng/sys/netinet6/ip6_forward.c#18 integrate .. //depot/projects/smpng/sys/netinet6/ip6_input.c#45 integrate .. //depot/projects/smpng/sys/netinet6/ip6_mroute.c#26 integrate .. //depot/projects/smpng/sys/netinet6/ip6_output.c#47 integrate .. //depot/projects/smpng/sys/netinet6/ipcomp_core.c#8 integrate .. //depot/projects/smpng/sys/netinet6/ipcomp_input.c#8 integrate .. //depot/projects/smpng/sys/netinet6/ipcomp_output.c#7 integrate .. //depot/projects/smpng/sys/netinet6/ipsec.c#25 integrate .. //depot/projects/smpng/sys/netinet6/mld6.c#18 integrate .. //depot/projects/smpng/sys/netinet6/nd6.c#34 integrate .. //depot/projects/smpng/sys/netinet6/nd6_nbr.c#22 integrate .. //depot/projects/smpng/sys/netinet6/nd6_rtr.c#17 integrate .. //depot/projects/smpng/sys/netinet6/udp6_output.c#20 integrate .. //depot/projects/smpng/sys/netkey/key.c#33 integrate .. //depot/projects/smpng/sys/netkey/keydb.c#7 integrate .. //depot/projects/smpng/sys/netncp/ncp_sock.c#9 integrate .. //depot/projects/smpng/sys/netsmb/smb_trantcp.c#20 integrate .. //depot/projects/smpng/sys/nfsclient/nfs_bio.c#47 integrate .. //depot/projects/smpng/sys/nfsclient/nfs_vfsops.c#55 integrate .. //depot/projects/smpng/sys/pc98/include/md_var.h#2 integrate .. //depot/projects/smpng/sys/pc98/pc98/pc98_machdep.c#7 integrate .. //depot/projects/smpng/sys/pci/agp.c#27 integrate .. //depot/projects/smpng/sys/pci/ncr.c#21 integrate .. //depot/projects/smpng/sys/powerpc/powerpc/machdep.c#69 integrate .. //depot/projects/smpng/sys/security/mac_biba/mac_biba.c#40 integrate .. //depot/projects/smpng/sys/sparc64/sparc64/pmap.c#67 integrate .. //depot/projects/smpng/sys/sys/domain.h#9 integrate .. //depot/projects/smpng/sys/sys/mac_policy.h#37 integrate .. //depot/projects/smpng/sys/sys/param.h#103 integrate .. //depot/projects/smpng/sys/sys/stat.h#18 integrate .. //depot/projects/smpng/sys/sys/syscall.h#73 integrate .. //depot/projects/smpng/sys/sys/syscall.mk#73 integrate .. //depot/projects/smpng/sys/sys/sysent.h#21 integrate .. //depot/projects/smpng/sys/sys/sysproto.h#77 integrate .. //depot/projects/smpng/sys/sys/systm.h#72 integrate .. //depot/projects/smpng/sys/sys/time.h#21 integrate .. //depot/projects/smpng/sys/sys/types.h#32 integrate .. //depot/projects/smpng/sys/vm/device_pager.c#21 integrate .. //depot/projects/smpng/sys/vm/swap_pager.c#64 integrate .. //depot/projects/smpng/sys/vm/vm_fault.c#60 integrate .. //depot/projects/smpng/sys/vm/vm_object.c#84 integrate .. //depot/projects/smpng/sys/vm/vm_page.c#81 integrate .. //depot/projects/smpng/sys/vm/vm_page.h#33 integrate .. //depot/projects/smpng/sys/vm/vnode_pager.c#59 integrate Differences ... ==== //depot/projects/smpng/sys/Makefile#13 (text+ko) ==== @@ -1,13 +1,11 @@ -# $FreeBSD: src/sys/Makefile,v 1.37 2006/07/04 14:14:16 maxim Exp $ +# $FreeBSD: src/sys/Makefile,v 1.38 2006/08/10 06:29:43 imp Exp $ .include <bsd.own.mk> # The boot loader .if ${MK_BOOT} != "no" -.if ${MACHINE_ARCH} != "arm" SUBDIR= boot .endif -.endif # Directories to include in cscope name file and TAGS. CSCOPEDIRS= coda compat conf contrib crypto ddb dev fs geom gnu i4b isa \ ==== //depot/projects/smpng/sys/amd64/acpica/madt.c#11 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/acpica/madt.c,v 1.20 2006/03/27 15:59:48 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/acpica/madt.c,v 1.21 2006/08/11 19:22:55 jhb Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -203,15 +203,15 @@ /* * Map in the RSDP. Since ACPI uses AcpiOsMapMemory() which in turn - * calls pmap_mapdev() to find the RSDP, we assume that we can use - * pmap_mapdev() to map the RSDP. + * calls pmap_mapbios() to find the RSDP, we assume that we can use + * pmap_mapbios() to map the RSDP. */ if (AcpiOsGetRootPointer(ACPI_LOGICAL_ADDRESSING, &rsdp_ptr) != AE_OK) return (ENXIO); #ifdef __i386__ KASSERT(rsdp_ptr.Pointer.Physical < KERNLOAD, ("RSDP too high")); #endif - rsdp = pmap_mapdev(rsdp_ptr.Pointer.Physical, sizeof(RSDP_DESCRIPTOR)); + rsdp = pmap_mapbios(rsdp_ptr.Pointer.Physical, sizeof(RSDP_DESCRIPTOR)); if (rsdp == NULL) { if (bootverbose) printf("MADT: Failed to map RSDP\n"); @@ -261,7 +261,7 @@ break; madt_unmap_table(rsdt); } - pmap_unmapdev((vm_offset_t)rsdp, sizeof(RSDP_DESCRIPTOR)); + pmap_unmapbios((vm_offset_t)rsdp, sizeof(RSDP_DESCRIPTOR)); if (madt_physaddr == 0) { if (bootverbose) printf("MADT: No MADT table found\n"); @@ -335,7 +335,7 @@ madt_setup_local(void) { - madt = pmap_mapdev(madt_physaddr, madt_length); + madt = pmap_mapbios(madt_physaddr, madt_length); lapic_init((uintptr_t)madt->LocalApicAddress); printf("ACPI APIC Table: <%.*s %.*s>\n", (int)sizeof(madt->OemId), madt->OemId, ==== //depot/projects/smpng/sys/amd64/amd64/pmap.c#66 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.568 2006/08/01 19:06:04 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.570 2006/08/11 19:22:55 jhb Exp $"); /* * Manages physical address maps. @@ -665,6 +665,84 @@ * Low level helper routines..... ***************************************************/ +/* + * Determine the appropriate bits to set in a PTE or PDE for a specified + * caching mode. + */ +static int +pmap_cache_bits(int mode, boolean_t is_pde) +{ + int pat_flag, pat_index, cache_bits; + + /* The PAT bit is different for PTE's and PDE's. */ + pat_flag = is_pde ? PG_PDE_PAT : PG_PTE_PAT; + + /* If we don't support PAT, map extended modes to older ones. */ + if (!(cpu_feature & CPUID_PAT)) { + switch (mode) { + case PAT_UNCACHEABLE: + case PAT_WRITE_THROUGH: + case PAT_WRITE_BACK: + break; + case PAT_UNCACHED: + case PAT_WRITE_COMBINING: + case PAT_WRITE_PROTECTED: + mode = PAT_UNCACHEABLE; + break; + } + } + + /* Map the caching mode to a PAT index. */ + switch (mode) { +#ifdef PAT_WORKS + case PAT_UNCACHEABLE: + pat_index = 3; + break; + case PAT_WRITE_THROUGH: + pat_index = 1; + break; + case PAT_WRITE_BACK: + pat_index = 0; + break; + case PAT_UNCACHED: + pat_index = 2; + break; + case PAT_WRITE_COMBINING: + pat_index = 5; + break; + case PAT_WRITE_PROTECTED: + pat_index = 4; + break; +#else + case PAT_UNCACHED: + case PAT_UNCACHEABLE: + case PAT_WRITE_PROTECTED: + pat_index = 3; + break; + case PAT_WRITE_THROUGH: + pat_index = 1; + break; + case PAT_WRITE_BACK: + pat_index = 0; + break; + case PAT_WRITE_COMBINING: + pat_index = 2; + break; +#endif + default: + panic("Unknown caching mode %d\n", mode); + } + + /* Map the 3-bit index value into the PAT, PCD, and PWT bits. */ + cache_bits = 0; + if (pat_index & 0x4) + cache_bits |= pat_flag; + if (pat_index & 0x2) + cache_bits |= PG_NC_PCD; + if (pat_index & 0x1) + cache_bits |= PG_NC_PWT; + return (cache_bits); +} #ifdef SMP /* * For SMP, these functions have to use the IPI mechanism for coherence. @@ -962,6 +1040,15 @@ pte_store(pte, pa | PG_RW | PG_V | PG_G); } +PMAP_INLINE void +pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode) +{ + pt_entry_t *pte; + + pte = vtopte(va); + pte_store(pte, pa | PG_RW | PG_V | PG_G | pmap_cache_bits(mode, 0)); +} + /* * Remove a page from the kernel pagetables. * Note: not SMP coherent. @@ -2281,6 +2368,10 @@ if (pmap == kernel_pmap) newpte |= PG_G; + /* Preserve any caching attributes. */ + /* XXX: Should this be conditional on something? */ + newpte |= (origpte & (PG_PTE_PAT | PG_NC_PCD | PG_NC_PWT)); + /* * if the mapping or permission bits are different, we need * to update the pte. @@ -2506,7 +2597,6 @@ retry: p = vm_page_lookup(object, pindex); if (p != NULL) { - vm_page_lock_queues(); if (vm_page_sleep_if_busy(p, FALSE, "init4p")) goto retry; } else { @@ -2525,8 +2615,8 @@ p = vm_page_lookup(object, pindex); vm_page_lock_queues(); vm_page_wakeup(p); + vm_page_unlock_queues(); } - vm_page_unlock_queues(); ptepa = VM_PAGE_TO_PHYS(p); if (ptepa & (NBPDR - 1)) @@ -3102,6 +3192,46 @@ * Miscellaneous support routines follow */ +/* Adjust the cache mode for a 4KB page mapped via a PTE. */ +static __inline void +pmap_pte_attr(vm_offset_t va, int mode) +{ + pt_entry_t *pte; + u_int opte, npte; + + pte = vtopte(va); + + /* + * The cache mode bits are all in the low 32-bits of the + * PTE, so we can just spin on updating the low 32-bits. + */ + do { + opte = *(u_int *)pte; + npte = opte & ~(PG_PTE_PAT | PG_NC_PCD | PG_NC_PWT); + npte |= pmap_cache_bits(mode, 0); + } while (npte != opte && !atomic_cmpset_int((u_int *)pte, opte, npte)); +} + +/* Adjust the cache mode for a 2MB page mapped via a PDE. */ +static __inline void +pmap_pde_attr(vm_offset_t va, int mode) +{ + pd_entry_t *pde; + u_int opde, npde; + + pde = pmap_pde(kernel_pmap, va); + + /* + * The cache mode bits are all in the low 32-bits of the + * PDE, so we can just spin on updating the low 32-bits. + */ + do { + opde = *(u_int *)pde; + npde = opde & ~(PG_PDE_PAT | PG_NC_PCD | PG_NC_PWT); + npde |= pmap_cache_bits(mode, 1); + } while (npde != opde && !atomic_cmpset_int((u_int *)pde, opde, npde)); +} + /* * Map a set of physical memory pages into the kernel virtual * address space. Return a pointer to where it is mapped. This @@ -3109,12 +3239,15 @@ * NOT real memory. */ void * -pmap_mapdev(vm_paddr_t pa, vm_size_t size) +pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode) { vm_offset_t va, tmpva, offset; - /* If this fits within the direct map window, use it */ - if (pa < dmaplimit && (pa + size) < dmaplimit) + /* + * If this fits within the direct map window and use WB caching + * mode, use the direct map. + */ + if (pa < dmaplimit && (pa + size) < dmaplimit && mode == PAT_WRITE_BACK) return ((void *)PHYS_TO_DMAP(pa)); offset = pa & PAGE_MASK; size = roundup(offset + size, PAGE_SIZE); @@ -3123,15 +3256,30 @@ panic("pmap_mapdev: Couldn't alloc kernel virtual memory"); pa = trunc_page(pa); for (tmpva = va; size > 0; ) { - pmap_kenter(tmpva, pa); + pmap_kenter_attr(tmpva, pa, mode); size -= PAGE_SIZE; tmpva += PAGE_SIZE; pa += PAGE_SIZE; } pmap_invalidate_range(kernel_pmap, va, tmpva); + pmap_invalidate_cache(); return ((void *)(va + offset)); } +void * +pmap_mapdev(vm_paddr_t pa, vm_size_t size) +{ + + return (pmap_mapdev_attr(pa, size, PAT_UNCACHEABLE)); +} + +void * +pmap_mapbios(vm_paddr_t pa, vm_size_t size) +{ + + return (pmap_mapdev_attr(pa, size, PAT_WRITE_BACK)); +} + void pmap_unmapdev(vm_offset_t va, vm_size_t size) { @@ -3149,6 +3297,73 @@ kmem_free(kernel_map, base, size); } +int +pmap_change_attr(va, size, mode) + vm_offset_t va; + vm_size_t size; + int mode; +{ + vm_offset_t base, offset, tmpva; + pd_entry_t *pde; + pt_entry_t *pte; + + base = va & PG_FRAME; + offset = va & PAGE_MASK; + size = roundup(offset + size, PAGE_SIZE); + + /* Only supported on kernel virtual addresses. */ + if (base <= VM_MAXUSER_ADDRESS) + return (EINVAL); + + /* + * XXX: We have to support tearing 2MB pages down into 4k pages if + * needed here. + */ + /* Pages that aren't mapped aren't supported. */ + for (tmpva = base; tmpva < (base + size); ) { + pde = pmap_pde(kernel_pmap, tmpva); + if (*pde == 0) + return (EINVAL); + if (*pde & PG_PS) { + /* Handle 2MB pages that are completely contained. */ + if (size >= NBPDR) { + tmpva += NBPDR; + continue; + } + return (EINVAL); + } + pte = vtopte(va); + if (*pte == 0) + return (EINVAL); + tmpva += PAGE_SIZE; + } + + /* + * Ok, all the pages exist, so run through them updating their + * cache mode. + */ + for (tmpva = base; size > 0; ) { + pde = pmap_pde(kernel_pmap, tmpva); + if (*pde & PG_PS) { + pmap_pde_attr(tmpva, mode); + tmpva += NBPDR; + size -= NBPDR; + } else { + pmap_pte_attr(tmpva, mode); + tmpva += PAGE_SIZE; + size -= PAGE_SIZE; + } + } + + /* + * Flush CPU caches to make sure any data isn't cached that shouldn't + * be, etc. + */ + pmap_invalidate_range(kernel_pmap, base, tmpva); + pmap_invalidate_cache(); + return (0); +} + /* * perform the pmap work for mincore */ ==== //depot/projects/smpng/sys/amd64/amd64/trap.c#53 (text+ko) ==== @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.307 2006/07/28 20:22:57 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.308 2006/08/08 04:01:29 alc Exp $"); /* * AMD64 Trap and System call handling @@ -566,8 +566,14 @@ map = &vm->vm_map; } + /* + * PGEX_I is defined only if the execute disable bit capability is + * supported and enabled; otherwise, that bit is reserved, i.e., zero. + */ if (frame->tf_err & PGEX_W) ftype = VM_PROT_WRITE; + else if (frame->tf_err & PGEX_I) + ftype = VM_PROT_EXECUTE; else ftype = VM_PROT_READ; ==== //depot/projects/smpng/sys/amd64/include/pmap.h#24 (text+ko) ==== @@ -39,7 +39,7 @@ * * from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90 * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 - * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.133 2006/08/02 16:24:23 alc Exp $ + * $FreeBSD: src/sys/amd64/include/pmap.h,v 1.134 2006/08/11 19:22:56 jhb Exp $ */ #ifndef _MACHINE_PMAP_H_ @@ -302,14 +302,19 @@ extern vm_offset_t virtual_end; #define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list)) +#define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz)) void pmap_bootstrap(vm_paddr_t *); +int pmap_change_attr(vm_offset_t, vm_size_t, int); void pmap_init_pat(void); void pmap_kenter(vm_offset_t va, vm_paddr_t pa); +void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode); void *pmap_kenter_temporary(vm_paddr_t pa, int i); vm_paddr_t pmap_kextract(vm_offset_t); void pmap_kremove(vm_offset_t); +void *pmap_mapbios(vm_paddr_t, vm_size_t); void *pmap_mapdev(vm_paddr_t, vm_size_t); +void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, int); void pmap_unmapdev(vm_offset_t, vm_size_t); void pmap_invalidate_page(pmap_t, vm_offset_t); void pmap_invalidate_range(pmap_t, vm_offset_t, vm_offset_t); ==== //depot/projects/smpng/sys/amd64/linux32/linux32_sysvec.c#17 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.18 2006/05/06 17:26:45 ambrisko Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/linux32/linux32_sysvec.c,v 1.19 2006/08/10 22:05:25 netchild Exp $"); #include "opt_compat.h" #ifndef COMPAT_IA32 @@ -121,6 +121,10 @@ /* * Linux syscalls return negative errno's, we do positive and map them + * Reference: + * FreeBSD: src/sys/sys/errno.h + * Linux: linux-2.6.17.8/include/asm-generic/errno-base.h + * linux-2.6.17.8/include/asm-generic/errno.h */ static int bsd_to_linux_errno[ELAST + 1] = { -0, -1, -2, -3, -4, -5, -6, -7, -8, -9, @@ -131,7 +135,8 @@ -100,-101,-102,-103,-104,-105,-106,-107,-108,-109, -110,-111, -40, -36,-112,-113, -39, -11, -87,-122, -116, -66, -6, -6, -6, -6, -6, -37, -38, -9, - -6, -6, -43, -42, -75, -6, -84 + -6, -6, -43, -42, -75,-125, -84, -95, -16, -74, + -72, -67, -71 }; int bsd_to_linux_signal[LINUX_SIGTBLSZ] = { ==== //depot/projects/smpng/sys/arm/arm/mem.c#3 (text+ko) ==== @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/mem.c,v 1.2 2005/10/03 14:18:21 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/mem.c,v 1.3 2006/08/08 20:59:38 cognet Exp $"); /* * Memory special file @@ -66,11 +66,6 @@ #include "opt_global.h" -#ifdef ARM_USE_SMALL_ALLOC -extern vm_offset_t alloc_curaddr; -extern vm_offset_t alloc_firstaddr; -#endif - /* * Used in /dev/mem drivers and elsewhere */ @@ -127,8 +122,8 @@ uio->uio_rw == UIO_READ ? VM_PROT_READ : VM_PROT_WRITE)) #ifdef ARM_USE_SMALL_ALLOC - if (addr < alloc_firstaddr || addr > - alloc_curaddr) + if (addr <= VM_MAXUSER_ADDRESS || + addr >= KERNBASE) #endif return (EFAULT); error = uiomove((caddr_t)(int)uio->uio_offset, (int)c, uio); ==== //depot/projects/smpng/sys/arm/arm/pmap.c#33 (text+ko) ==== @@ -147,7 +147,7 @@ #include "opt_vm.h" #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.67 2006/08/01 19:06:04 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.68 2006/08/08 20:59:38 cognet Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -1129,7 +1129,7 @@ l2b = pmap_get_l2_bucket(pmap_kernel(), va); ptep = &l2b->l2b_kva[l2pte_index(va)]; pte = *ptep; - + if ((pte & L2_S_CACHE_MASK) != pte_l2_s_cache_mode_pt) { /* * Page tables must have the cache-mode set to @@ -1140,7 +1140,6 @@ cpu_tlb_flushD_SE(va); cpu_cpwait(); } - #ifdef ARM_USE_SMALL_ALLOC } #endif @@ -2384,8 +2383,6 @@ #define PMAP_STATIC_L2_SIZE 16 #ifdef ARM_USE_SMALL_ALLOC extern struct mtx smallalloc_mtx; -extern vm_offset_t alloc_curaddr; -extern vm_offset_t alloc_firstaddr; #endif void @@ -2544,9 +2541,9 @@ #ifdef ARM_USE_SMALL_ALLOC mtx_init(&smallalloc_mtx, "Small alloc page list", NULL, MTX_DEF); - alloc_firstaddr = alloc_curaddr = arm_nocache_startaddr + - ARM_NOCACHE_KVA_SIZE; + arm_init_smallalloc(); #endif + pmap_set_pcb_pagedir(kernel_pmap, thread0.td_pcb); } /*************************************************** @@ -2933,6 +2930,9 @@ vm_offset_t pmap_map(vm_offset_t *virt, vm_offset_t start, vm_offset_t end, int prot) { +#ifdef ARM_USE_SMALL_ALLOC + return (arm_ptovirt(start)); +#else vm_offset_t sva = *virt; vm_offset_t va = sva; @@ -2947,6 +2947,7 @@ } *virt = va; return (sva); +#endif } static void @@ -3488,7 +3489,7 @@ * is current */ PTE_SYNC(ptep); - if (L1_IDX(va) != L1_IDX(vector_page) && + if (L1_IDX(va) != L1_IDX(vector_page) && l2pte_valid(npte)) { /* * This mapping is likely to be accessed as @@ -3999,6 +4000,10 @@ void pmap_zero_page_generic(vm_paddr_t phys, int off, int size) { +#ifdef ARM_USE_SMALL_ALLOC + char *dstpg; +#endif + #ifdef DEBUG struct vm_page *pg = PHYS_TO_VM_PAGE(phys); @@ -4010,6 +4015,16 @@ _arm_bzero((void *)(phys + off), size, IS_PHYSICAL) == 0) return; +#ifdef ARM_USE_SMALL_ALLOC + dstpg = (char *)arm_ptovirt(phys); + if (off || size != PAGE_SIZE) { + bzero(dstpg + off, size); + cpu_dcache_wbinv_range((vm_offset_t)(dstpg + off), size); + } else { + bzero_page((vm_offset_t)dstpg); + cpu_dcache_wbinv_range((vm_offset_t)dstpg, PAGE_SIZE); + } +#else mtx_lock(&cmtx); /* @@ -4021,12 +4036,15 @@ PTE_SYNC(cdst_pte); cpu_tlb_flushD_SE(cdstp); cpu_cpwait(); - if (off || size != PAGE_SIZE) + if (off || size != PAGE_SIZE) { bzero((void *)(cdstp + off), size); - else + cpu_dcache_wbinv_range(cdstp + off, size); + } else { bzero_page(cdstp); + cpu_dcache_wbinv_range(cdstp, PAGE_SIZE); + } mtx_unlock(&cmtx); - cpu_dcache_wbinv_range(cdstp, PAGE_SIZE); +#endif } #endif /* (ARM_MMU_GENERIC + ARM_MMU_SA1) != 0 */ @@ -4034,7 +4052,6 @@ void pmap_zero_page_xscale(vm_paddr_t phys, int off, int size) { - if (_arm_bzero && _arm_bzero((void *)(phys + off), size, IS_PHYSICAL) == 0) return; @@ -4344,12 +4361,23 @@ void pmap_copy_page(vm_page_t src, vm_page_t dst) { +#ifdef ARM_USE_SMALL_ALLOC + vm_offset_t srcpg, dstpg; +#endif + cpu_dcache_wbinv_all(); if (_arm_memcpy && _arm_memcpy((void *)VM_PAGE_TO_PHYS(dst), (void *)VM_PAGE_TO_PHYS(src), PAGE_SIZE, IS_PHYSICAL) == 0) return; +#ifdef ARM_USE_SMALL_ALLOC + srcpg = arm_ptovirt(VM_PAGE_TO_PHYS(src)); + dstpg = arm_ptovirt(VM_PAGE_TO_PHYS(dst)); + bcopy_page(srcpg, dstpg); + cpu_dcache_wbinv_range(dstpg, PAGE_SIZE); +#else pmap_copy_page_func(VM_PAGE_TO_PHYS(src), VM_PAGE_TO_PHYS(dst)); +#endif } ==== //depot/projects/smpng/sys/arm/arm/vm_machdep.c#22 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/vm_machdep.c,v 1.26 2006/07/15 23:15:31 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/vm_machdep.c,v 1.27 2006/08/08 20:59:38 cognet Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -66,6 +66,7 @@ #include <vm/vm_page.h> #include <vm/vm_map.h> #include <vm/vm_param.h> +#include <vm/vm_pageout.h> #include <vm/uma.h> #include <vm/uma_int.h> @@ -73,6 +74,7 @@ #define NSFBUFS (512 + maxusers * 16) #endif +#ifndef ARM_USE_SMALL_ALLOC static void sf_buf_init(void *arg); SYSINIT(sock_sf, SI_SUB_MBUF, SI_ORDER_ANY, sf_buf_init, NULL) @@ -94,6 +96,7 @@ * A lock used to synchronize access to the hash table and free list */ static struct mtx sf_buf_lock; +#endif /* * Finish a fork operation, with process p2 nearly set up. @@ -161,6 +164,7 @@ void sf_buf_free(struct sf_buf *sf) { +#ifndef ARM_USE_SMALL_ALLOC mtx_lock(&sf_buf_lock); sf->ref_count--; if (sf->ref_count == 0) { @@ -170,11 +174,13 @@ wakeup_one(&sf_buf_freelist); } mtx_unlock(&sf_buf_lock); +#endif } +#ifndef ARM_USE_SMALL_ALLOC /* - * * Allocate a pool of sf_bufs (sendfile(2) or "super-fast" if you prefer. :-)) - * */ + * Allocate a pool of sf_bufs (sendfile(2) or "super-fast" if you prefer. :-)) + */ static void sf_buf_init(void *arg) { @@ -197,6 +203,7 @@ sf_buf_alloc_want = 0; mtx_init(&sf_buf_lock, "sf_buf", NULL, MTX_DEF); } +#endif /* * Get an sf_buf from the freelist. Will block if none are available. @@ -204,6 +211,9 @@ struct sf_buf * sf_buf_alloc(struct vm_page *m, int flags) { +#ifdef ARM_USE_SMALL_ALLOC + return ((struct sf_buf *)m); +#else struct sf_head *hash_list; struct sf_buf *sf; int error; @@ -249,7 +259,7 @@ done: mtx_unlock(&sf_buf_lock); return (sf); - +#endif } /* @@ -446,10 +456,55 @@ MALLOC_DEFINE(M_VMSMALLALLOC, "vm_small_alloc", "VM Small alloc data"); -vm_offset_t alloc_curaddr; -vm_offset_t alloc_firstaddr; +static vm_offset_t alloc_firstaddr; + +vm_offset_t +arm_ptovirt(vm_paddr_t pa) +{ + int i; + vm_offset_t addr = alloc_firstaddr; + + KASSERT(alloc_firstaddr != 0, ("arm_ptovirt called to early ?")); + for (i = 0; dump_avail[i]; i += 2) { + if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) + break; + addr += (dump_avail[i + 1] & L1_S_FRAME) + L1_S_SIZE - + (dump_avail[i] & L1_S_FRAME); + } + KASSERT(dump_avail[i] != 0, ("Trying to access invalid physical address")); + return (addr + (pa - (dump_avail[i] & L1_S_FRAME))); +} >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608112047.k7BKlNol022232>