Skip site navigation (1)Skip section navigation (2)
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>