Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F108238910
D34659.id104158.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
7 KB
Referenced Files
None
Subscribers
None
D34659.id104158.diff
View Options
Index: sys/arm64/arm64/pmap.c
===================================================================
--- sys/arm64/arm64/pmap.c
+++ sys/arm64/arm64/pmap.c
@@ -105,6 +105,7 @@
* and to when physical maps must be made correct.
*/
+#include "opt_ddb.h"
#include "opt_vm.h"
#include <sys/param.h>
@@ -149,6 +150,7 @@
#include <machine/machdep.h>
#include <machine/md_var.h>
#include <machine/pcb.h>
+#include <machine/stdarg.h>
#define PMAP_ASSERT_STAGE1(pmap) MPASS((pmap)->pm_stage == PM_STAGE1)
#define PMAP_ASSERT_STAGE2(pmap) MPASS((pmap)->pm_stage == PM_STAGE2)
@@ -7021,9 +7023,11 @@
int l1blocks;
};
+typedef void (*kmaps_printf)(void *, const char *, ...);
+
static void
-sysctl_kmaps_dump(struct sbuf *sb, struct pmap_kernel_map_range *range,
- vm_offset_t eva)
+kmaps_dump(kmaps_printf kmaps_printf, void *arg,
+ struct pmap_kernel_map_range *range, vm_offset_t eva)
{
const char *mode;
int index;
@@ -7053,7 +7057,7 @@
break;
}
- sbuf_printf(sb, "0x%016lx-0x%016lx r%c%c%c%c %3s %d %d %d %d\n",
+ kmaps_printf(arg, "0x%016lx-0x%016lx r%c%c%c%c %3s %d %d %d %d\n",
range->sva, eva,
(range->attrs & ATTR_S1_AP_RW_BIT) == ATTR_S1_AP_RW ? 'w' : '-',
(range->attrs & ATTR_S1_PXN) != 0 ? '-' : 'x',
@@ -7071,14 +7075,14 @@
* being tracked by the current range.
*/
static bool
-sysctl_kmaps_match(struct pmap_kernel_map_range *range, pt_entry_t attrs)
+kmaps_match(struct pmap_kernel_map_range *range, pt_entry_t attrs)
{
return (range->attrs == attrs);
}
static void
-sysctl_kmaps_reinit(struct pmap_kernel_map_range *range, vm_offset_t va,
+kmaps_reinit(struct pmap_kernel_map_range *range, vm_offset_t va,
pt_entry_t attrs)
{
@@ -7089,7 +7093,7 @@
/* Get the block/page attributes that correspond to the table attributes */
static pt_entry_t
-sysctl_kmaps_table_attrs(pd_entry_t table)
+kmaps_table_attrs(pd_entry_t table)
{
pt_entry_t attrs;
@@ -7106,7 +7110,7 @@
/* Read the block/page attributes we care about */
static pt_entry_t
-sysctl_kmaps_block_attrs(pt_entry_t block)
+kmaps_block_attrs(pt_entry_t block)
{
return (block & (ATTR_S1_AP_MASK | ATTR_S1_XN | ATTR_S1_IDX_MASK));
}
@@ -7117,50 +7121,43 @@
* begin a new run.
*/
static void
-sysctl_kmaps_check(struct sbuf *sb, struct pmap_kernel_map_range *range,
- vm_offset_t va, pd_entry_t l0e, pd_entry_t l1e, pd_entry_t l2e,
- pt_entry_t l3e)
+kmaps_check(kmaps_printf kmaps_printf, void *arg,
+ struct pmap_kernel_map_range *range, vm_offset_t va, pd_entry_t l0e,
+ pd_entry_t l1e, pd_entry_t l2e, pt_entry_t l3e)
{
pt_entry_t attrs;
- attrs = sysctl_kmaps_table_attrs(l0e);
+ attrs = kmaps_table_attrs(l0e);
if ((l1e & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) {
- attrs |= sysctl_kmaps_block_attrs(l1e);
+ attrs |= kmaps_block_attrs(l1e);
goto done;
}
- attrs |= sysctl_kmaps_table_attrs(l1e);
+ attrs |= kmaps_table_attrs(l1e);
if ((l2e & ATTR_DESCR_TYPE_MASK) == ATTR_DESCR_TYPE_BLOCK) {
- attrs |= sysctl_kmaps_block_attrs(l2e);
+ attrs |= kmaps_block_attrs(l2e);
goto done;
}
- attrs |= sysctl_kmaps_table_attrs(l2e);
- attrs |= sysctl_kmaps_block_attrs(l3e);
+ attrs |= kmaps_table_attrs(l2e);
+ attrs |= kmaps_block_attrs(l3e);
done:
- if (range->sva > va || !sysctl_kmaps_match(range, attrs)) {
- sysctl_kmaps_dump(sb, range, va);
- sysctl_kmaps_reinit(range, va, attrs);
+ if (range->sva > va || !kmaps_match(range, attrs)) {
+ kmaps_dump(kmaps_printf, arg, range, va);
+ kmaps_reinit(range, va, attrs);
}
}
-static int
-sysctl_kmaps(SYSCTL_HANDLER_ARGS)
+static void
+kmaps_dump_all(kmaps_printf kmaps_printf, void *arg)
{
struct pmap_kernel_map_range range;
- struct sbuf sbuf, *sb;
pd_entry_t l0e, *l1, l1e, *l2, l2e;
pt_entry_t *l3, l3e;
vm_offset_t sva;
vm_paddr_t pa;
- int error, i, j, k, l;
-
- error = sysctl_wire_old_buffer(req, 0);
- if (error != 0)
- return (error);
- sb = &sbuf;
- sbuf_new_for_sysctl(sb, NULL, PAGE_SIZE, req);
+ int i, j, k, l;
/* Sentinel value. */
range.sva = 0xfffffffffffffffful;
@@ -7173,13 +7170,13 @@
for (sva = 0xffff000000000000ul, i = pmap_l0_index(sva); i < Ln_ENTRIES;
i++) {
if (i == pmap_l0_index(DMAP_MIN_ADDRESS))
- sbuf_printf(sb, "\nDirect map:\n");
+ kmaps_printf(arg, "\nDirect map:\n");
else if (i == pmap_l0_index(VM_MIN_KERNEL_ADDRESS))
- sbuf_printf(sb, "\nKernel map:\n");
+ kmaps_printf(arg, "\nKernel map:\n");
l0e = kernel_pmap->pm_l0[i];
if ((l0e & ATTR_DESCR_VALID) == 0) {
- sysctl_kmaps_dump(sb, &range, sva);
+ kmaps_dump(kmaps_printf, arg, &range, sva);
sva += L0_SIZE;
continue;
}
@@ -7189,13 +7186,13 @@
for (j = pmap_l1_index(sva); j < Ln_ENTRIES; j++) {
l1e = l1[j];
if ((l1e & ATTR_DESCR_VALID) == 0) {
- sysctl_kmaps_dump(sb, &range, sva);
+ kmaps_dump(kmaps_printf, arg, &range, sva);
sva += L1_SIZE;
continue;
}
if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK) {
- sysctl_kmaps_check(sb, &range, sva, l0e, l1e,
- 0, 0);
+ kmaps_check(kmaps_printf, arg, &range, sva,
+ l0e, l1e, 0, 0);
range.l1blocks++;
sva += L1_SIZE;
continue;
@@ -7206,13 +7203,14 @@
for (k = pmap_l2_index(sva); k < Ln_ENTRIES; k++) {
l2e = l2[k];
if ((l2e & ATTR_DESCR_VALID) == 0) {
- sysctl_kmaps_dump(sb, &range, sva);
+ kmaps_dump(kmaps_printf, arg, &range,
+ sva);
sva += L2_SIZE;
continue;
}
if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) {
- sysctl_kmaps_check(sb, &range, sva,
- l0e, l1e, l2e, 0);
+ kmaps_check(kmaps_printf, arg, &range,
+ sva, l0e, l1e, l2e, 0);
range.l2blocks++;
sva += L2_SIZE;
continue;
@@ -7224,12 +7222,12 @@
l++, sva += L3_SIZE) {
l3e = l3[l];
if ((l3e & ATTR_DESCR_VALID) == 0) {
- sysctl_kmaps_dump(sb, &range,
- sva);
+ kmaps_dump(kmaps_printf, arg,
+ &range, sva);
continue;
}
- sysctl_kmaps_check(sb, &range, sva,
- l0e, l1e, l2e, l3e);
+ kmaps_check(kmaps_printf, arg, &range,
+ sva, l0e, l1e, l2e, l3e);
if ((l3e & ATTR_CONTIGUOUS) != 0)
range.l3contig += l % 16 == 0 ?
1 : 0;
@@ -7239,6 +7237,33 @@
}
}
}
+}
+
+static void
+sysctl_kmaps_printf(void *arg, const char *fmt, ...)
+{
+ struct sbuf *sb;
+ va_list va;
+
+ sb = arg;
+ va_start(va, fmt);
+ sbuf_vprintf(sb, fmt, va);
+ va_end(va);
+}
+
+static int
+sysctl_kmaps(SYSCTL_HANDLER_ARGS)
+{
+ struct sbuf sbuf, *sb;
+ int error;
+
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error != 0)
+ return (error);
+ sb = &sbuf;
+ sbuf_new_for_sysctl(sb, NULL, PAGE_SIZE, req);
+
+ kmaps_dump_all(sysctl_kmaps_printf, sb);
error = sbuf_finish(sb);
sbuf_delete(sb);
@@ -7248,3 +7273,22 @@
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_SKIP,
NULL, 0, sysctl_kmaps, "A",
"Dump kernel address layout");
+
+#ifdef DDB
+#include <ddb/ddb.h>
+
+static void
+db_kmaps_printf(void *arg __unused, const char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ db_vprintf(fmt, va);
+ va_end(va);
+}
+
+DB_SHOW_COMMAND(kernel_maps, db_show_kmaps)
+{
+ kmaps_dump_all(db_kmaps_printf, NULL);
+}
+#endif
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jan 24, 12:01 AM (2 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16068306
Default Alt Text
D34659.id104158.diff (7 KB)
Attached To
Mode
D34659: Add show kernel_maps to ddb on arm64
Attached
Detach File
Event Timeline
Log In to Comment