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