svn commit: r204049 - in user/imp/tbemd: release/scripts sys/amd64/amd64 sys/conf sys/i386/i386 sys/i386/xen sys/kern sys/mips/mips sys/netinet sys/powerpc/aim usr.bin/kdump

Warner Losh imp at FreeBSD.org
Thu Feb 18 17:11:06 UTC 2010


Author: imp
Date: Thu Feb 18 17:11:06 2010
New Revision: 204049
URL: http://svn.freebsd.org/changeset/base/204049

Log:
  Merge to head 204047

Added:
  user/imp/tbemd/release/scripts/make-memstick.sh
     - copied unchanged from r204047, head/release/scripts/make-memstick.sh
Modified:
  user/imp/tbemd/sys/amd64/amd64/pmap.c
  user/imp/tbemd/sys/conf/files.mips
  user/imp/tbemd/sys/conf/kmod.mk
  user/imp/tbemd/sys/i386/i386/pmap.c
  user/imp/tbemd/sys/i386/xen/pmap.c
  user/imp/tbemd/sys/kern/link_elf_obj.c
  user/imp/tbemd/sys/mips/mips/elf_machdep.c
  user/imp/tbemd/sys/netinet/sctp_indata.c
  user/imp/tbemd/sys/powerpc/aim/mmu_oea.c
  user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c
  user/imp/tbemd/usr.bin/kdump/kdump.c
Directory Properties:
  user/imp/tbemd/   (props changed)

Copied: user/imp/tbemd/release/scripts/make-memstick.sh (from r204047, head/release/scripts/make-memstick.sh)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/imp/tbemd/release/scripts/make-memstick.sh	Thu Feb 18 17:11:06 2010	(r204049, copy of r204047, head/release/scripts/make-memstick.sh)
@@ -0,0 +1,83 @@
+#!/bin/sh
+#
+# This script generates a "memstick image" (image that can be copied to a
+# USB memory stick) from a directory tree.  Note that the script does not
+# clean up after itself very well for error conditions on purpose so the
+# problem can be diagnosed (full filesystem most likely but ...).
+#
+# Usage: make-memstick.sh <directory tree> <image filename>
+#
+# $FreeBSD$
+#
+
+PATH=/bin:/usr/bin:/sbin:/usr/sbin
+export PATH
+
+BLOCKSIZE=10240
+
+if [ $# -ne 2 ]; then
+  echo "make-memstick.sh /path/to/directory /path/to/image/file"
+  exit 1
+fi
+
+tempfile="${2}.$$"
+
+if [ ! -d ${1} ]; then
+  echo "${1} must be a directory"
+  exit 1
+fi
+
+if [ -e ${2} ]; then
+  echo "won't overwrite ${2}"
+  exit 1
+fi
+
+rm -f ${tempfile}
+makefs ${tempfile} ${1}
+if [ $? -ne 0 ]; then
+  echo "makefs failed"
+  exit 1
+fi
+
+#
+# Use $BLOCKSIZE for transfers to improve efficiency.  When calculating
+# how many blocks to transfer "+ 2" is to account for truncation in the
+# division and to provide space for the label.
+#
+
+filesize=`stat -f "%z" ${tempfile}`
+blocks=$(($filesize / ${BLOCKSIZE} + 2))
+dd if=/dev/zero of=${2} bs=${BLOCKSIZE} count=${blocks}
+if [ $? -ne 0 ]; then
+  echo "creation of image file failed"
+  exit 1
+fi
+
+unit=`mdconfig -a -t vnode -f ${2}`
+if [ $? -ne 0 ]; then
+  echo "mdconfig failed"
+  exit 1
+fi
+
+fdisk -BIq /dev/${unit}
+if [ $? -ne 0 ]; then
+  echo "fdisk failed"
+  exit 1
+fi
+
+bsdlabel -B -w /dev/${unit}
+if [ $? -ne 0 ]; then
+  echo "bsdlabel failed"
+  exit 1
+fi
+
+dd if=${tempfile} of=/dev/${unit}a bs=$BLOCKSIZE conv=sync
+if [ $? -ne 0 ]; then
+  echo "copying filesystem into image file failed"
+  exit 1
+fi
+
+mdconfig -d -u ${unit}
+
+rm -f ${tempfile}
+

Modified: user/imp/tbemd/sys/amd64/amd64/pmap.c
==============================================================================
--- user/imp/tbemd/sys/amd64/amd64/pmap.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/amd64/amd64/pmap.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -151,7 +151,11 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #if !defined(DIAGNOSTIC)
+#ifdef __GNUC_GNU_INLINE__
+#define PMAP_INLINE	inline
+#else
 #define PMAP_INLINE	extern inline
+#endif
 #else
 #define PMAP_INLINE
 #endif

Modified: user/imp/tbemd/sys/conf/files.mips
==============================================================================
--- user/imp/tbemd/sys/conf/files.mips	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/conf/files.mips	Thu Feb 18 17:11:06 2010	(r204049)
@@ -89,6 +89,8 @@ libkern/umoddi3.c		optional	isa_mips32
 #libkern/mips/strcmp.S		standard
 #libkern/mips/strncmp.S		standard
 
+kern/link_elf_obj.c		standard
+
 dev/cfe/cfe_api.c		optional	cfe
 dev/cfe/cfe_console.c		optional	cfe_console
 dev/cfe/cfe_env.c		optional	cfe_env

Modified: user/imp/tbemd/sys/conf/kmod.mk
==============================================================================
--- user/imp/tbemd/sys/conf/kmod.mk	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/conf/kmod.mk	Thu Feb 18 17:11:06 2010	(r204049)
@@ -128,6 +128,10 @@ CFLAGS+=	-fno-omit-frame-pointer
 CFLAGS+=	-mlongcall -fno-omit-frame-pointer
 .endif
 
+.if ${MACHINE_ARCH} == "mips"
+CFLAGS+=	-G0 -fno-pic -mno-abicalls -mlong-calls
+.endif
+
 .if defined(FIRMWS)
 .if !exists(@)
 ${KMOD:S/$/.c/}: @
@@ -174,7 +178,7 @@ ${PROG}.symbols: ${FULLPROG}
 	${OBJCOPY} --only-keep-debug ${FULLPROG} ${.TARGET}
 .endif
 
-.if ${MACHINE_CPUARCH} != amd64
+.if ${MACHINE_CPUARCH} != amd64 && ${MACHINE_ARCH} != mips
 ${FULLPROG}: ${KMOD}.kld
 	${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} ${KMOD}.kld
 .if !defined(DEBUG_FLAGS)
@@ -187,7 +191,7 @@ EXPORT_SYMS?=	NO
 CLEANFILES+=	export_syms
 .endif
 
-.if ${MACHINE_CPUARCH} != amd64
+.if ${MACHINE_CPUARCH} != amd64 && ${MACHINE_CPUARCH} != mips
 ${KMOD}.kld: ${OBJS}
 .else
 ${FULLPROG}: ${OBJS}
@@ -206,7 +210,8 @@ ${FULLPROG}: ${OBJS}
 	    export_syms | xargs -J% ${OBJCOPY} % ${.TARGET}
 .endif
 .endif
-.if !defined(DEBUG_FLAGS) && ${MACHINE_CPUARCH} == amd64
+.if !defined(DEBUG_FLAGS) && \
+    (${MACHINE_CPUARCH} == amd64 || ${MACHINE_CPUARCH} == mips)
 	${OBJCOPY} --strip-debug ${.TARGET}
 .endif
 

Modified: user/imp/tbemd/sys/i386/i386/pmap.c
==============================================================================
--- user/imp/tbemd/sys/i386/i386/pmap.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/i386/i386/pmap.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -162,7 +162,11 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #if !defined(DIAGNOSTIC)
+#ifdef __GNUC_GNU_INLINE__
+#define PMAP_INLINE	inline
+#else
 #define PMAP_INLINE	extern inline
+#endif
 #else
 #define PMAP_INLINE
 #endif

Modified: user/imp/tbemd/sys/i386/xen/pmap.c
==============================================================================
--- user/imp/tbemd/sys/i386/xen/pmap.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/i386/xen/pmap.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -173,7 +173,11 @@ __FBSDID("$FreeBSD$");
 #endif
 
 #if !defined(PMAP_DIAGNOSTIC)
+#ifdef __GNUC_GNU_INLINE__
+#define PMAP_INLINE	inline
+#else
 #define PMAP_INLINE	extern inline
+#endif
 #else
 #define PMAP_INLINE
 #endif

Modified: user/imp/tbemd/sys/kern/link_elf_obj.c
==============================================================================
--- user/imp/tbemd/sys/kern/link_elf_obj.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/kern/link_elf_obj.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -853,8 +853,8 @@ link_elf_load_file(linker_class_t cls, c
 		panic("lost relatab");
 	if (mapbase != (vm_offset_t)ef->address + mapsize)
 		panic("mapbase 0x%lx != address %p + mapsize 0x%lx (0x%lx)\n",
-		    mapbase, ef->address, mapsize,
-		    (vm_offset_t)ef->address + mapsize);
+		    (u_long)mapbase, ef->address, (u_long)mapsize,
+		    (u_long)(vm_offset_t)ef->address + mapsize);
 
 	/* Local intra-module relocations */
 	link_elf_reloc_local(lf);

Modified: user/imp/tbemd/sys/mips/mips/elf_machdep.c
==============================================================================
--- user/imp/tbemd/sys/mips/mips/elf_machdep.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/mips/mips/elf_machdep.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 
 #include <machine/elf.h>
 #include <machine/md_var.h>
+#include <machine/cache.h>
 
 #ifdef __mips_n64
 struct sysentvec elf64_freebsd_sysvec = {
@@ -163,7 +164,12 @@ elf_reloc_internal(linker_file_t lf, Elf
 	Elf_Addr addend = (Elf_Addr)0;
 	Elf_Word rtype = (Elf_Word)0, symidx;
 	const Elf_Rel *rel;
-	const Elf_Rela *rela;
+
+	/*
+	 * Stash R_MIPS_HI16 info so we can use it when processing R_MIPS_LO16
+	 */
+	static Elf_Addr ahl;
+	static Elf_Addr *where_hi16;
 
 	switch (type) {
 	case ELF_RELOC_REL:
@@ -173,108 +179,63 @@ elf_reloc_internal(linker_file_t lf, Elf
 		rtype = ELF_R_TYPE(rel->r_info);
 		symidx = ELF_R_SYM(rel->r_info);
 		break;
-	case ELF_RELOC_RELA:
-		rela = (const Elf_Rela *)data;
-		where = (Elf_Addr *) (relocbase + rela->r_offset);
-		addend = rela->r_addend;
-		rtype = ELF_R_TYPE(rela->r_info);
-		symidx = ELF_R_SYM(rela->r_info);
-		break;
 	default:
 		panic("unknown reloc type %d\n", type);
 	}
 
-	if (local) {
-#if 0 /* TBD  */
-		if (rtype == R_386_RELATIVE) {	/* A + B */
-			addr = elf_relocaddr(lf, relocbase + addend);
-			if (*where != addr)
-				*where = addr;
-		}
-		return (0);
-#endif
-	}
-
 	switch (rtype) {
+	case R_MIPS_NONE:	/* none */
+		break;
 
-		case R_MIPS_NONE:	/* none */
-			break;
+	case R_MIPS_32:		/* S + A */
+		addr = lookup(lf, symidx, 1);
+		if (addr == 0)
+			return (-1);
+		addr += addend;
+		if (*where != addr)
+			*where = addr;
+		break;
 
-		case R_MIPS_16:	    /* S + sign-extend(A) */
-			/*
-			 * There shouldn't be R_MIPS_16 relocs in kernel objects.
-			 */
-			printf("kldload: unexpected R_MIPS_16 relocation\n");
-			return -1;
-			break;
-
-		case R_MIPS_32: /* S + A - P */
-			addr = lookup(lf, symidx, 1);
-			if (addr == 0)
-				return -1;
-			addr += addend;
-			if (*where != addr)
-				*where = addr;
-			break;
-
-		case R_MIPS_REL32:		/* A - EA + S */
-			/*
-			 * There shouldn't be R_MIPS_REL32 relocs in kernel objects?
-			 */
-			printf("kldload: unexpected R_MIPS_REL32 relocation\n");
-			return -1;
-			break;
-
-		case R_MIPS_26:	     /* ((A << 2) | (P & 0xf0000000) + S) >> 2 */
-			break;
-
-		case R_MIPS_HI16:
-			/* extern/local: ((AHL + S) - ((short)(AHL + S)) >> 16 */
-			/* _gp_disp: ((AHL + GP - P) - (short)(AHL + GP - P)) >> 16 */
-			break;
-
-		case R_MIPS_LO16:
-			/* extern/local: AHL + S */
-			/* _gp_disp: AHL + GP - P + 4 */
-			break;
-
-		case R_MIPS_GPREL16:
-			/* extern/local: ((AHL + S) - ((short)(AHL + S)) >> 16 */
-			/* _gp_disp: ((AHL + GP - P) - (short)(AHL + GP - P)) >> 16 */
-			break;
-
-		case R_MIPS_LITERAL: /* sign-extend(A) + L */
-			break;
-
-		case R_MIPS_GOT16: /* external: G */
-			/* local: tbd */
-			break;
-
-		case R_MIPS_PC16: /* sign-extend(A) + S - P */
-			break;
-
-		case R_MIPS_CALL16: /* G */
-			break;
-
-		case R_MIPS_GPREL32: /* A + S + GP0 - GP */
-			break;
-
-		case R_MIPS_GOTHI16: /* (G - (short)G) >> 16 + A */
-			break;
-
-		case R_MIPS_GOTLO16: /* G & 0xffff */
-			break;
-
-		case R_MIPS_CALLHI16: /* (G - (short)G) >> 16 + A */
-			break;
-
-		case R_MIPS_CALLLO16: /* G & 0xffff */
-			break;
-
-		default:
-			printf("kldload: unexpected relocation type %d\n",
-			    rtype);
+	case R_MIPS_26:		/* ((A << 2) | (P & 0xf0000000) + S) >> 2 */
+		addr = lookup(lf, symidx, 1);
+		if (addr == 0)
 			return (-1);
+
+		addend &= 0x03ffffff;
+		addend <<= 2;
+
+		addr += ((Elf_Addr)where & 0xf0000000) | addend;
+		addr >>= 2;
+
+		*where &= ~0x03ffffff;
+		*where |= addr & 0x03ffffff;
+		break;
+
+	case R_MIPS_HI16:	/* ((AHL + S) - ((short)(AHL + S)) >> 16 */
+		ahl = addend << 16;
+		where_hi16 = where;
+		break;
+
+	case R_MIPS_LO16:	/* AHL + S */
+		ahl += (int16_t)addend;
+		addr = lookup(lf, symidx, 1);
+		if (addr == 0)
+			return (-1);
+
+		addend &= 0xffff0000;
+		addend |= (uint16_t)(ahl + addr);
+		*where = addend;
+
+		addend = *where_hi16;
+		addend &= 0xffff0000;
+		addend |= ((ahl + addr) - (int16_t)(ahl + addr)) >> 16;
+		*where_hi16 = addend;
+		break;
+
+	default:
+		printf("kldload: unexpected relocation type %d\n",
+			rtype);
+		return (-1);
 	}
 	return(0);
 }
@@ -299,6 +260,11 @@ int
 elf_cpu_load_file(linker_file_t lf __unused)
 {
 
+	/*
+	 * Sync the I and D caches to make sure our relocations are visible.
+	 */
+	mips_icache_sync_all();
+
 	return (0);
 }
 

Modified: user/imp/tbemd/sys/netinet/sctp_indata.c
==============================================================================
--- user/imp/tbemd/sys/netinet/sctp_indata.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/netinet/sctp_indata.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -3513,7 +3513,7 @@ sctp_handle_segments(struct mbuf *m, int
 static void
 sctp_check_for_revoked(struct sctp_tcb *stcb,
     struct sctp_association *asoc, uint32_t cumack,
-    u_long biggest_tsn_acked)
+    uint32_t biggest_tsn_acked)
 {
 	struct sctp_tmit_chunk *tp1;
 	int tot_revoked = 0;
@@ -3595,7 +3595,7 @@ sctp_check_for_revoked(struct sctp_tcb *
 
 static void
 sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
-    u_long biggest_tsn_acked, u_long biggest_tsn_newly_acked, u_long this_sack_lowest_newack, int accum_moved)
+    uint32_t biggest_tsn_acked, uint32_t biggest_tsn_newly_acked, uint32_t this_sack_lowest_newack, int accum_moved)
 {
 	struct sctp_tmit_chunk *tp1;
 	int strike_flag = 0;
@@ -4781,7 +4781,7 @@ again:
 static void
 sctp_check_for_nr_revoked(struct sctp_tcb *stcb,
     struct sctp_association *asoc, uint32_t cumack,
-    u_long biggest_tsn_acked)
+    uint32_t biggest_tsn_acked)
 {
 	struct sctp_tmit_chunk *tp1;
 

Modified: user/imp/tbemd/sys/powerpc/aim/mmu_oea.c
==============================================================================
--- user/imp/tbemd/sys/powerpc/aim/mmu_oea.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/powerpc/aim/mmu_oea.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -1729,6 +1729,10 @@ moea_remove_all(mmu_t mmu, vm_page_t m)
 		moea_pvo_remove(pvo, -1);
 		PMAP_UNLOCK(pmap);
 	}
+	if ((m->flags & PG_WRITEABLE) && moea_is_modified(mmu, m)) {
+		moea_attr_clear(m, LPTE_CHG);
+		vm_page_dirty(m);
+	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
 }
 
@@ -2203,10 +2207,8 @@ moea_query_bit(vm_page_t m, int ptebit)
 	struct	pvo_entry *pvo;
 	struct	pte *pt;
 
-#if 0
 	if (moea_attr_fetch(m) & ptebit)
 		return (TRUE);
-#endif
 
 	LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
 		MOEA_PVO_CHECK(pvo);	/* sanity check */

Modified: user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -172,6 +172,7 @@ va_to_vsid(pmap_t pm, vm_offset_t va)
 	return ((pm->pm_sr[(uintptr_t)va >> ADDR_SR_SHFT]) & SR_VSID_MASK);
 }
 
+#define	PTESYNC()	__asm __volatile("ptesync");
 #define	TLBSYNC()	__asm __volatile("tlbsync; ptesync");
 #define	SYNC()		__asm __volatile("sync");
 #define	EIEIO()		__asm __volatile("eieio");
@@ -194,6 +195,7 @@ TLBIE(pmap_t pmap, vm_offset_t va) {
 	vpn = (uint64_t)(va & ADDR_PIDX);
 	if (pmap != NULL)
 		vpn |= (va_to_vsid(pmap,va) << 28);
+	vpn &= ~(0xffffULL << 48);
 
 	vpn_hi = (uint32_t)(vpn >> 32);
 	vpn_lo = (uint32_t)vpn;
@@ -201,8 +203,7 @@ TLBIE(pmap_t pmap, vm_offset_t va) {
 	mtx_lock_spin(&tlbie_mutex);
 	__asm __volatile("\
 	    mfmsr %0; \
-	    clrldi %1,%0,49; \
-	    mtmsr %1; \
+	    mr %1, %0; \
 	    insrdi %1,%5,1,0; \
 	    mtmsrd %1; \
 	    ptesync; \
@@ -215,7 +216,8 @@ TLBIE(pmap_t pmap, vm_offset_t va) {
 	    eieio; \
 	    tlbsync; \
 	    ptesync;" 
-	: "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32), "r"(1));
+	: "=r"(msr), "=r"(scratch) : "r"(vpn_hi), "r"(vpn_lo), "r"(32), "r"(1)
+	    : "memory");
 	mtx_unlock_spin(&tlbie_mutex);
 }
 
@@ -226,13 +228,13 @@ TLBIE(pmap_t pmap, vm_offset_t va) {
 #define	VSID_TO_SR(vsid)	((vsid) & 0xf)
 #define	VSID_TO_HASH(vsid)	(((vsid) >> 4) & 0xfffff)
 
-#define	PVO_PTEGIDX_MASK	0x007		/* which PTEG slot */
-#define	PVO_PTEGIDX_VALID	0x008		/* slot is valid */
-#define	PVO_WIRED		0x010		/* PVO entry is wired */
-#define	PVO_MANAGED		0x020		/* PVO entry is managed */
-#define	PVO_BOOTSTRAP		0x080		/* PVO entry allocated during
+#define	PVO_PTEGIDX_MASK	0x007UL		/* which PTEG slot */
+#define	PVO_PTEGIDX_VALID	0x008UL		/* slot is valid */
+#define	PVO_WIRED		0x010UL		/* PVO entry is wired */
+#define	PVO_MANAGED		0x020UL		/* PVO entry is managed */
+#define	PVO_BOOTSTRAP		0x080UL		/* PVO entry allocated during
 						   bootstrap */
-#define PVO_FAKE		0x100		/* fictitious phys page */
+#define PVO_FAKE		0x100UL		/* fictitious phys page */
 #define	PVO_VADDR(pvo)		((pvo)->pvo_vaddr & ~ADDR_POFF)
 #define PVO_ISFAKE(pvo)		((pvo)->pvo_vaddr & PVO_FAKE)
 #define	PVO_PTEGIDX_GET(pvo)	((pvo)->pvo_vaddr & PVO_PTEGIDX_MASK)
@@ -512,23 +514,6 @@ moea64_attr_save(vm_page_t m, u_int64_t 
 	m->md.mdpg_attrs |= ptebit;
 }
 
-static __inline int
-moea64_pte_compare(const struct lpte *pt, const struct lpte *pvo_pt)
-{
-	if (pt->pte_hi == pvo_pt->pte_hi)
-		return (1);
-
-	return (0);
-}
-
-static __inline int
-moea64_pte_match(struct lpte *pt, uint64_t vsid, vm_offset_t va, int which)
-{
-	return (pt->pte_hi & ~LPTE_VALID) ==
-	    ((vsid << LPTE_VSID_SHIFT) |
-	    ((uint64_t)(va >> ADDR_API_SHFT64) & LPTE_API) | which);
-}
-
 static __inline void
 moea64_pte_create(struct lpte *pt, uint64_t vsid, vm_offset_t va, 
     uint64_t pte_lo)
@@ -583,7 +568,7 @@ moea64_pte_set(struct lpte *pt, struct l
 	pt->pte_lo = pvo_pt->pte_lo;
 	EIEIO();
 	pt->pte_hi = pvo_pt->pte_hi;
-	SYNC();
+	PTESYNC();
 	moea64_pte_valid++;
 }
 
@@ -602,7 +587,6 @@ moea64_pte_unset(struct lpte *pt, struct
 	 * Invalidate the pte.
 	 */
 	pt->pte_hi &= ~LPTE_VALID;
-
 	TLBIE(pmap,va);
 
 	/*
@@ -621,6 +605,8 @@ moea64_pte_change(struct lpte *pt, struc
 	 */
 	moea64_pte_unset(pt, pvo_pt, pmap, va);
 	moea64_pte_set(pt, pvo_pt);
+	if (pmap == kernel_pmap)
+		isync();
 }
 
 static __inline uint64_t
@@ -701,7 +687,7 @@ moea64_bridge_cpu_bootstrap(mmu_t mmup, 
 	for (i = 0; i < 16; i++) {
 		mtsrin(i << ADDR_SR_SHFT, kernel_pmap->pm_sr[i]);
 	}
-	__asm __volatile ("sync; mtsdr1 %0; isync"
+	__asm __volatile ("ptesync; mtsdr1 %0; isync"
 	    :: "r"((u_int)moea64_pteg_table 
 		     | (32 - cntlzw(moea64_pteg_mask >> 11))));
 	tlbia();
@@ -1135,7 +1121,7 @@ void moea64_set_scratchpage_pa(int which
 	EIEIO();
 
 	moea64_scratchpage_pte[which]->pte_hi |= LPTE_VALID;
-	TLBIE(kernel_pmap, moea64_scratchpage_va[which]);
+	PTESYNC(); isync();
 }
 
 void
@@ -1155,8 +1141,6 @@ moea64_copy_page(mmu_t mmu, vm_page_t ms
 	kcopy((void *)moea64_scratchpage_va[0], 
 	    (void *)moea64_scratchpage_va[1], PAGE_SIZE);
 
-	__syncicache((void *)moea64_scratchpage_va[1],PAGE_SIZE);
-
 	mtx_unlock(&moea64_scratchpage_mtx);
 }
 
@@ -1174,8 +1158,6 @@ moea64_zero_page_area(mmu_t mmu, vm_page
 
 	moea64_set_scratchpage_pa(0,pa);
 	bzero((caddr_t)moea64_scratchpage_va[0] + off, size);
-	__syncicache((void *)moea64_scratchpage_va[0],PAGE_SIZE);
-
 	mtx_unlock(&moea64_scratchpage_mtx);
 }
 
@@ -1266,9 +1248,6 @@ moea64_enter_locked(pmap_t pmap, vm_offs
 	error = moea64_pvo_enter(pmap, zone, pvo_head, va, VM_PAGE_TO_PHYS(m),
 	    pte_lo, pvo_flags);
 
-	if (pmap == kernel_pmap)
-		TLBIE(pmap, va);
-
 	/*
 	 * Flush the page from the instruction cache if this page is
 	 * mapped executable and cacheable.
@@ -1281,6 +1260,7 @@ moea64_enter_locked(pmap_t pmap, vm_offs
 static void
 moea64_syncicache(pmap_t pmap, vm_offset_t va, vm_offset_t pa, vm_size_t sz)
 {
+
 	/*
 	 * This is much trickier than on older systems because
 	 * we can't sync the icache on physical addresses directly
@@ -1303,8 +1283,9 @@ moea64_syncicache(pmap_t pmap, vm_offset
 
 		mtx_lock(&moea64_scratchpage_mtx);
 
-		moea64_set_scratchpage_pa(1,pa);
-		__syncicache((void *)moea64_scratchpage_va[1], sz);
+		moea64_set_scratchpage_pa(1,pa & ~ADDR_POFF);
+		__syncicache((void *)(moea64_scratchpage_va[1] + 
+		    (va & ADDR_POFF)), sz);
 
 		mtx_unlock(&moea64_scratchpage_mtx);
 	}
@@ -1441,8 +1422,6 @@ moea64_uma_page_alloc(uma_zone_t zone, i
 	    &moea64_pvo_kunmanaged, va,  VM_PAGE_TO_PHYS(m), LPTE_M, 
 	    PVO_WIRED | PVO_BOOTSTRAP);
 
-	TLBIE(kernel_pmap, va);
-
 	if (needed_lock)
 		PMAP_UNLOCK(kernel_pmap);
 	
@@ -1531,7 +1510,7 @@ moea64_remove_write(mmu_t mmu, vm_page_t
 				lo |= pvo->pvo_pte.lpte.pte_lo;
 				pvo->pvo_pte.lpte.pte_lo &= ~LPTE_CHG;
 				moea64_pte_change(pt, &pvo->pvo_pte.lpte,
-				    pvo->pvo_pmap, pvo->pvo_vaddr);
+				    pvo->pvo_pmap, PVO_VADDR(pvo));
 			}
 			UNLOCK_TABLE();
 		}
@@ -1590,8 +1569,6 @@ moea64_kenter(mmu_t mmu, vm_offset_t va,
 	    &moea64_pvo_kunmanaged, va, pa, pte_lo, 
 	    PVO_WIRED | VM_PROT_EXECUTE);
 
-	TLBIE(kernel_pmap, va);
-
 	if (error != 0 && error != ENOENT)
 		panic("moea64_kenter: failed to enter va %#x pa %#x: %d", va,
 		    pa, error);
@@ -1823,7 +1800,7 @@ moea64_protect(mmu_t mmu, pmap_t pm, vm_
 		 */
 		if (pt != NULL) {
 			moea64_pte_change(pt, &pvo->pvo_pte.lpte, 
-			    pvo->pvo_pmap, pvo->pvo_vaddr);
+			    pvo->pvo_pmap, PVO_VADDR(pvo));
 			if ((pvo->pvo_pte.lpte.pte_lo & 
 			    (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) {
 				moea64_syncicache(pm, sva,
@@ -1927,6 +1904,10 @@ moea64_remove_all(mmu_t mmu, vm_page_t m
 		moea64_pvo_remove(pvo, -1);
 		PMAP_UNLOCK(pmap);
 	}
+	if ((m->flags & PG_WRITEABLE) && moea64_is_modified(mmu, m)) {
+		moea64_attr_clear(m, LPTE_CHG);
+		vm_page_dirty(m);
+	}
 	vm_page_flag_clear(m, PG_WRITEABLE);
 }
 
@@ -2107,7 +2088,7 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t z
 		first = 1;
 	LIST_INSERT_HEAD(pvo_head, pvo, pvo_vlink);
 
-	if (pvo->pvo_pte.lpte.pte_lo & PVO_WIRED)
+	if (pvo->pvo_vaddr & PVO_WIRED)
 		pm->pm_stats.wired_count++;
 	pm->pm_stats.resident_count++;
 
@@ -2122,6 +2103,9 @@ moea64_pvo_enter(pmap_t pm, uma_zone_t z
 		moea64_pte_overflow++;
 	}
 
+	if (pm == kernel_pmap)
+		isync();
+
 	UNLOCK_TABLE();
 
 	return (first ? ENOENT : 0);
@@ -2140,7 +2124,7 @@ moea64_pvo_remove(struct pvo_entry *pvo,
 	pt = moea64_pvo_to_pte(pvo, pteidx);
 	if (pt != NULL) {
 		moea64_pte_unset(pt, &pvo->pvo_pte.lpte, pvo->pvo_pmap,
-		    pvo->pvo_vaddr);
+		    PVO_VADDR(pvo));
 		PVO_PTEGIDX_CLR(pvo);
 	} else {
 		moea64_pte_overflow--;
@@ -2151,7 +2135,7 @@ moea64_pvo_remove(struct pvo_entry *pvo,
 	 * Update our statistics.
 	 */
 	pvo->pvo_pmap->pm_stats.resident_count--;
-	if (pvo->pvo_pte.lpte.pte_lo & PVO_WIRED)
+	if (pvo->pvo_vaddr & PVO_WIRED)
 		pvo->pvo_pmap->pm_stats.wired_count--;
 
 	/*
@@ -2178,7 +2162,7 @@ moea64_pvo_remove(struct pvo_entry *pvo,
 	 */
 	LIST_REMOVE(pvo, pvo_olink);
 	if (!(pvo->pvo_vaddr & PVO_BOOTSTRAP))
-		uma_zfree(pvo->pvo_vaddr & PVO_MANAGED ? moea64_mpvo_zone :
+		uma_zfree((pvo->pvo_vaddr & PVO_MANAGED) ? moea64_mpvo_zone :
 		    moea64_upvo_zone, pvo);
 	moea64_pvo_entries--;
 	moea64_pvo_remove_calls++;
@@ -2237,8 +2221,8 @@ moea64_pvo_to_pte(const struct pvo_entry
 		int		ptegidx;
 		uint64_t	vsid;
 
-		vsid = va_to_vsid(pvo->pvo_pmap, pvo->pvo_vaddr);
-		ptegidx = va_to_pteg(vsid, pvo->pvo_vaddr);
+		vsid = va_to_vsid(pvo->pvo_pmap, PVO_VADDR(pvo));
+		ptegidx = va_to_pteg(vsid, PVO_VADDR(pvo));
 		pteidx = moea64_pvo_pte_index(pvo, ptegidx);
 	}
 
@@ -2325,10 +2309,8 @@ moea64_query_bit(vm_page_t m, u_int64_t 
 	struct	pvo_entry *pvo;
 	struct	lpte *pt;
 
-#if 0
 	if (moea64_attr_fetch(m) & ptebit)
 		return (TRUE);
-#endif
 
 	LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
 		MOEA_PVO_CHECK(pvo);	/* sanity check */

Modified: user/imp/tbemd/usr.bin/kdump/kdump.c
==============================================================================
--- user/imp/tbemd/usr.bin/kdump/kdump.c	Thu Feb 18 16:52:49 2010	(r204048)
+++ user/imp/tbemd/usr.bin/kdump/kdump.c	Thu Feb 18 17:11:06 2010	(r204049)
@@ -1328,6 +1328,8 @@ ktrstruct(char *buf, size_t buflen)
 	char *name, *data;
 	size_t namelen, datalen;
 	int i;
+	struct stat sb;
+	struct sockaddr_storage ss;
 
 	for (name = buf, namelen = 0;
 	     namelen < buflen && name[namelen] != '\0';
@@ -1348,12 +1350,16 @@ ktrstruct(char *buf, size_t buflen)
 	if (strcmp(name, "stat") == 0) {
 		if (datalen != sizeof(struct stat))
 			goto invalid;
-		ktrstat((struct stat *)data);
+		memcpy(&sb, data, datalen);
+		ktrstat(&sb);
 	} else if (strcmp(name, "sockaddr") == 0) {
+		if (datalen > sizeof(ss))
+			goto invalid;
+		memcpy(&ss, data, datalen);
 		if (datalen < sizeof(struct sockaddr) ||
-		    datalen != ((struct sockaddr *)(data))->sa_len)
+		    datalen != ss.ss_len)
 			goto invalid;
-		ktrsockaddr((struct sockaddr *)data);
+		ktrsockaddr((struct sockaddr *)&ss);
 	} else {
 		printf("unknown structure\n");
 	}


More information about the svn-src-user mailing list