Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F160390695
D31992.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
15 KB
Referenced Files
None
Subscribers
None
D31992.id.diff
View Options
diff --git a/sys/amd64/amd64/minidump_machdep.c b/sys/amd64/amd64/minidump_machdep.c
--- a/sys/amd64/amd64/minidump_machdep.c
+++ b/sys/amd64/amd64/minidump_machdep.c
@@ -211,7 +211,8 @@
pa = pdpe & PG_PS_FRAME;
for (n = 0; n < NPDEPG * NPTEPG; n++) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
pa += PAGE_SIZE;
}
continue;
@@ -229,7 +230,8 @@
pa = pde & PG_PS_FRAME;
for (k = 0; k < NPTEPG; k++) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(
+ state->dump_bitset, pa);
pa += PAGE_SIZE;
}
continue;
@@ -238,7 +240,7 @@
pa = pde & PG_FRAME;
/* set bit for this PTE page */
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset, pa);
/* and for each valid page in this 2MB block */
pt = (uint64_t *)PHYS_TO_DMAP(pde & PG_FRAME);
for (k = 0; k < NPTEPG; k++) {
@@ -247,7 +249,8 @@
continue;
pa = pte & PG_FRAME;
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -258,12 +261,12 @@
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa)) {
dumpsize += PAGE_SIZE;
} else {
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
}
dumpsize += PAGE_SIZE;
@@ -315,7 +318,7 @@
goto fail;
/* Dump bitmap */
- error = blk_write(di, (char *)vm_page_dump, 0,
+ error = blk_write(di, (char *)state->dump_bitset, 0,
round_page(BITSET_SIZE(vm_page_dump_pages)));
if (error)
goto fail;
@@ -373,7 +376,7 @@
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/arm/arm/minidump_machdep.c b/sys/arm/arm/minidump_machdep.c
--- a/sys/arm/arm/minidump_machdep.c
+++ b/sys/arm/arm/minidump_machdep.c
@@ -186,7 +186,7 @@
for (va = KERNBASE; va < kva_end; va += PAGE_SIZE) {
pa = pmap_dump_kextract(va, NULL);
if (pa != 0 && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset, pa);
ptesize += sizeof(pt2_entry_t);
}
@@ -196,12 +196,12 @@
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(nitems(dump_avail) * sizeof(uint64_t));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -255,7 +255,7 @@
goto fail;
/* Dump bitmap */
- error = blk_write(di, (char *)vm_page_dump, 0,
+ error = blk_write(di, (char *)state->dump_bitset, 0,
round_page(BITSET_SIZE(vm_page_dump_pages)));
if (error)
goto fail;
@@ -279,7 +279,7 @@
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
if (!count) {
prev_pa = pa;
count++;
diff --git a/sys/arm64/arm64/minidump_machdep.c b/sys/arm64/arm64/minidump_machdep.c
--- a/sys/arm64/arm64/minidump_machdep.c
+++ b/sys/arm64/arm64/minidump_machdep.c
@@ -187,14 +187,16 @@
for (i = 0; i < Ln_ENTRIES * Ln_ENTRIES;
i++, pa += PAGE_SIZE)
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
pmapsize += (Ln_ENTRIES - 1) * PAGE_SIZE;
va += L1_SIZE - L2_SIZE;
} else if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) {
pa = l2e & ~ATTR_MASK;
for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
} else if ((l2e & ATTR_DESCR_MASK) == L2_TABLE) {
for (i = 0; i < Ln_ENTRIES; i++) {
@@ -202,9 +204,9 @@
if ((l3e & ATTR_DESCR_MASK) != L3_PAGE)
continue;
pa = l3e & ~ATTR_MASK;
- pa = l3e & ~ATTR_MASK;
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -215,11 +217,11 @@
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -270,7 +272,7 @@
goto fail;
/* Dump bitmap */
- error = blk_write(di, (char *)vm_page_dump, 0,
+ error = blk_write(di, (char *)state->dump_bitset, 0,
round_page(BITSET_SIZE(vm_page_dump_pages)));
if (error)
goto fail;
@@ -351,7 +353,7 @@
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/i386/i386/minidump_machdep_base.c b/sys/i386/i386/minidump_machdep_base.c
--- a/sys/i386/i386/minidump_machdep_base.c
+++ b/sys/i386/i386/minidump_machdep_base.c
@@ -191,7 +191,8 @@
pa = pde & PG_PS_FRAME;
for (k = 0; k < NPTEPG; k++) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
pa += PAGE_SIZE;
}
continue;
@@ -204,7 +205,8 @@
if ((pte & PG_V) == PG_V) {
pa = pte & PG_FRAME;
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(
+ state->dump_bitset, pa);
}
}
} else {
@@ -218,12 +220,12 @@
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa)) {
dumpsize += PAGE_SIZE;
} else {
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
}
dumpsize += PAGE_SIZE;
@@ -317,7 +319,7 @@
}
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/mips/mips/minidump_machdep.c b/sys/mips/mips/minidump_machdep.c
--- a/sys/mips/mips/minidump_machdep.c
+++ b/sys/mips/mips/minidump_machdep.c
@@ -134,7 +134,8 @@
if (pte_test(&pte[i], PTE_V)) {
pa = TLBLO_PTE_TO_PA(pte[i]);
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -145,7 +146,7 @@
*/
for (pa = 0; pa < phys_avail[0]; pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset, pa);
}
/* Calculate dump size. */
@@ -154,12 +155,12 @@
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(nitems(dump_avail) * sizeof(uint64_t));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -249,8 +250,8 @@
prev_pte = 0;
}
- /* Dump memory chunks page by page*/
- VM_PAGE_DUMP_FOREACH(pa) {
+ /* Dump memory chunks page by page */
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
dump_va = pmap_kenter_temporary(pa, 0);
error = write_buffer(di, dump_va, PAGE_SIZE);
if (error)
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -443,7 +443,7 @@
volatile const void *uaddr, void **kaddr, size_t ulen, size_t *klen);
static int moea64_decode_kernel_ptr(vm_offset_t addr,
int *is_user, vm_offset_t *decoded_addr);
-static size_t moea64_scan_pmap(void);
+static size_t moea64_scan_pmap(struct bitset *dump_bitset);
static void *moea64_dump_pmap_init(unsigned blkpgs);
#ifdef __powerpc64__
static void moea64_page_array_startup(long);
@@ -3317,7 +3317,7 @@
#ifdef __powerpc64__
static size_t
-moea64_scan_pmap()
+moea64_scan_pmap(struct bitset *dump_bitset)
{
struct pvo_entry *pvo;
vm_paddr_t pa, pa_end;
@@ -3360,11 +3360,11 @@
pa_end = pa + lpsize;
for (; pa < pa_end; pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(dump_bitset, pa);
}
} else {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(dump_bitset, pa);
}
}
PMAP_UNLOCK(kernel_pmap);
@@ -3386,7 +3386,7 @@
#else
static size_t
-moea64_scan_pmap()
+moea64_scan_pmap(struct bitset *dump_bitset __unused)
{
return (0);
}
diff --git a/sys/powerpc/include/dump.h b/sys/powerpc/include/dump.h
--- a/sys/powerpc/include/dump.h
+++ b/sys/powerpc/include/dump.h
@@ -40,7 +40,7 @@
void dumpsys_pa_init(void);
void dumpsys_unmap_chunk(vm_paddr_t, size_t, void *);
-size_t dumpsys_scan_pmap(void);
+size_t dumpsys_scan_pmap(struct bitset *);
void *dumpsys_dump_pmap_init(unsigned blkpgs);
void *dumpsys_dump_pmap(void *ctx, void *buf, u_long *nbytes);
diff --git a/sys/powerpc/include/mmuvar.h b/sys/powerpc/include/mmuvar.h
--- a/sys/powerpc/include/mmuvar.h
+++ b/sys/powerpc/include/mmuvar.h
@@ -96,7 +96,7 @@
typedef void (*pmap_dumpsys_map_chunk_t)(vm_paddr_t, size_t, void **);
typedef void (*pmap_dumpsys_unmap_chunk_t)(vm_paddr_t, size_t, void *);
typedef void (*pmap_dumpsys_pa_init_t)(void);
-typedef size_t (*pmap_dumpsys_scan_pmap_t)(void);
+typedef size_t (*pmap_dumpsys_scan_pmap_t)(struct bitset *dump_bitset);
typedef void *(*pmap_dumpsys_dump_pmap_init_t)(unsigned);
typedef void *(*pmap_dumpsys_dump_pmap_t)(void *, void *, u_long *);
typedef vm_offset_t (*pmap_quick_enter_page_t)(vm_page_t);
diff --git a/sys/powerpc/powerpc/minidump_machdep.c b/sys/powerpc/powerpc/minidump_machdep.c
--- a/sys/powerpc/powerpc/minidump_machdep.c
+++ b/sys/powerpc/powerpc/minidump_machdep.c
@@ -204,7 +204,7 @@
DBG(total = dumptotal = 0;)
/* Build set of dumpable pages from kernel pmap */
- pmapsize = dumpsys_scan_pmap();
+ pmapsize = dumpsys_scan_pmap(state->dump_bitset);
if (pmapsize % PAGE_SIZE != 0) {
printf("pmapsize not page aligned: 0x%x\n", pmapsize);
return (EINVAL);
@@ -217,12 +217,12 @@
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
dumpsize += pmapsize;
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsys_pb_init(dumpsize);
@@ -289,7 +289,7 @@
dump_total("pmap", pmapsize);
/* Dump memory chunks */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/powerpc/powerpc/pmap_dispatch.c b/sys/powerpc/powerpc/pmap_dispatch.c
--- a/sys/powerpc/powerpc/pmap_dispatch.c
+++ b/sys/powerpc/powerpc/pmap_dispatch.c
@@ -188,7 +188,7 @@
DEFINE_DUMPSYS_IFUNC(void, map_chunk, (vm_paddr_t, size_t, void **));
DEFINE_DUMPSYS_IFUNC(void, unmap_chunk, (vm_paddr_t, size_t, void *));
DEFINE_DUMPSYS_IFUNC(void, pa_init, (void));
-DEFINE_DUMPSYS_IFUNC(size_t, scan_pmap, (void));
+DEFINE_DUMPSYS_IFUNC(size_t, scan_pmap, (struct bitset *));
DEFINE_DUMPSYS_IFUNC(void *, dump_pmap_init, (unsigned));
DEFINE_DUMPSYS_IFUNC(void *, dump_pmap, (void *, void *, u_long *));
diff --git a/sys/riscv/riscv/minidump_machdep.c b/sys/riscv/riscv/minidump_machdep.c
--- a/sys/riscv/riscv/minidump_machdep.c
+++ b/sys/riscv/riscv/minidump_machdep.c
@@ -197,7 +197,8 @@
pa = (l2e >> PTE_PPN1_S) << L2_SHIFT;
for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) {
if (vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
} else {
for (i = 0; i < Ln_ENTRIES; i++) {
@@ -206,7 +207,8 @@
continue;
pa = (l3e >> PTE_PPN0_S) * PAGE_SIZE;
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
- dump_add_page(pa);
+ vm_page_dump_add(state->dump_bitset,
+ pa);
}
}
}
@@ -217,12 +219,12 @@
dumpsize += round_page(mbp->msg_size);
dumpsize += round_page(sizeof(dump_avail));
dumpsize += round_page(BITSET_SIZE(vm_page_dump_pages));
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
/* Clear out undumpable pages now if needed */
if (PHYS_IN_DMAP(pa) && vm_phys_is_dumpable(pa))
dumpsize += PAGE_SIZE;
else
- dump_drop_page(pa);
+ vm_page_dump_drop(state->dump_bitset, pa);
}
dumpsize += PAGE_SIZE;
@@ -327,7 +329,7 @@
/* Dump memory chunks */
/* XXX cluster it up and use blk_dump() */
- VM_PAGE_DUMP_FOREACH(pa) {
+ VM_PAGE_DUMP_FOREACH(state->dump_bitset, pa) {
error = blk_write(di, 0, pa, PAGE_SIZE);
if (error)
goto fail;
diff --git a/sys/vm/vm_dumpset.h b/sys/vm/vm_dumpset.h
--- a/sys/vm/vm_dumpset.h
+++ b/sys/vm/vm_dumpset.h
@@ -37,8 +37,12 @@
extern long vm_page_dump_pages;
extern vm_paddr_t dump_avail[PHYS_AVAIL_COUNT];
+/* For the common case: add/remove a page from the minidump bitset. */
+#define dump_add_page(pa) vm_page_dump_add(vm_page_dump, pa)
+#define dump_drop_page(pa) vm_page_dump_drop(vm_page_dump, pa)
+
static inline void
-dump_add_page(vm_paddr_t pa)
+vm_page_dump_add(struct bitset *bitset, vm_paddr_t pa)
{
vm_pindex_t adj;
int i;
@@ -48,7 +52,7 @@
if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) {
BIT_SET_ATOMIC(vm_page_dump_pages,
(pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) +
- adj, vm_page_dump);
+ adj, bitset);
return;
}
adj += howmany(dump_avail[i + 1], PAGE_SIZE) -
@@ -57,7 +61,7 @@
}
static inline void
-dump_drop_page(vm_paddr_t pa)
+vm_page_dump_drop(struct bitset *bitset, vm_paddr_t pa)
{
vm_pindex_t adj;
int i;
@@ -67,7 +71,7 @@
if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) {
BIT_CLR_ATOMIC(vm_page_dump_pages,
(pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) +
- adj, vm_page_dump);
+ adj, bitset);
return;
}
adj += howmany(dump_avail[i + 1], PAGE_SIZE) -
@@ -91,9 +95,9 @@
return ((vm_paddr_t)NULL);
}
-#define VM_PAGE_DUMP_FOREACH(pa) \
- for (vm_pindex_t __b = BIT_FFS(vm_page_dump_pages, vm_page_dump); \
- (pa) = vm_page_dump_index_to_pa(__b - 1), __b != 0; \
- __b = BIT_FFS_AT(vm_page_dump_pages, vm_page_dump, __b))
+#define VM_PAGE_DUMP_FOREACH(bitset, pa) \
+ for (vm_pindex_t __b = BIT_FFS(vm_page_dump_pages, bitset); \
+ (pa) = vm_page_dump_index_to_pa(__b - 1), __b != 0; \
+ __b = BIT_FFS_AT(vm_page_dump_pages, bitset, __b))
#endif /* _SYS_DUMPSET_H_ */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jun 25, 1:14 AM (12 h, 18 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34298487
Default Alt Text
D31992.id.diff (15 KB)
Attached To
Mode
D31992: minidump: Use the provided dump bitset
Attached
Detach File
Event Timeline
Log In to Comment