PERFORCE change 103661 for review
John Baldwin
jhb at FreeBSD.org
Fri Aug 11 20:47:35 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=103661
Change 103661 by jhb at 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) <<<
More information about the p4-projects
mailing list