Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F153220103
D34694.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D34694.id.diff
View Options
diff --git a/sys/kern/subr_physmem.c b/sys/kern/subr_physmem.c
--- a/sys/kern/subr_physmem.c
+++ b/sys/kern/subr_physmem.c
@@ -180,7 +180,7 @@
uint64_t maxphyssz, long *pavail, long *prealmem)
{
size_t acnt, exi, hwi;
- uint64_t end, start, xend, xstart;
+ uint64_t adj, end, start, xend, xstart;
long availmem, totalmem;
const struct region *exp, *hwp;
uint64_t availsz;
@@ -190,8 +190,9 @@
availsz = 0;
acnt = 0;
for (hwi = 0, hwp = hwregions; hwi < hwcnt; ++hwi, ++hwp) {
- start = hwp->addr;
- end = hwp->size + start;
+ adj = round_page(hwp->addr) - hwp->addr;
+ start = round_page(hwp->addr);
+ end = trunc_page(hwp->size + adj) + start;
totalmem += atop((vm_offset_t)(end - start));
for (exi = 0, exp = exregions; exi < excnt; ++exi, ++exp) {
/*
@@ -417,8 +418,6 @@
void
physmem_hardware_region(uint64_t pa, uint64_t sz)
{
- vm_offset_t adj;
-
/*
* Filter out the page at PA 0x00000000. The VM can't handle it, as
* pmap_extract() == 0 means failure.
@@ -451,14 +450,6 @@
sz -= 1024 * 1024;
}
- /*
- * Round the starting address up to a page boundary, and truncate the
- * ending page down to a page boundary.
- */
- adj = round_page(pa) - pa;
- pa = round_page(pa);
- sz = trunc_page(sz - adj);
-
if (sz > 0 && hwcnt < nitems(hwregions))
hwcnt = insert_region(hwregions, hwcnt, pa, sz, 0);
}
diff --git a/tests/sys/kern/subr_physmem_test.c b/tests/sys/kern/subr_physmem_test.c
--- a/tests/sys/kern/subr_physmem_test.c
+++ b/tests/sys/kern/subr_physmem_test.c
@@ -76,14 +76,12 @@
ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
ATF_CHECK_EQ(avail[1], 6 * PAGE_SIZE);
-#ifdef notyet /* This doesn't currently work */
/* Add the remaining part of the page */
physmem_hardware_region(6 * PAGE_SIZE + PAGE_SIZE / 2, PAGE_SIZE / 2);
len = physmem_avail(avail, 4);
ATF_CHECK_EQ(len, 2);
ATF_CHECK_EQ(avail[0], 2 * PAGE_SIZE);
ATF_CHECK_EQ(avail[1], 7 * PAGE_SIZE);
-#endif
}
ATF_TC_WITHOUT_HEAD(hwregion_exclude);
@@ -113,10 +111,30 @@
ATF_CHECK_EQ(avail[3], 7 * PAGE_SIZE);
}
+ATF_TC_WITHOUT_HEAD(hwregion_unordered);
+ATF_TC_BODY(hwregion_unordered, tc)
+{
+ vm_paddr_t avail[4];
+ size_t len;
+
+ /* Add a partial page */
+ physmem_hardware_region(PAGE_SIZE, PAGE_SIZE / 2);
+ /* Add a full page not touching the previous */
+ physmem_hardware_region( 2 * PAGE_SIZE, PAGE_SIZE);
+ /* Add the remainder of the first page */
+ physmem_hardware_region(PAGE_SIZE + PAGE_SIZE / 2, PAGE_SIZE / 2);
+
+ len = physmem_avail(avail, 4);
+ ATF_CHECK_EQ(len, 2);
+ ATF_CHECK_EQ(avail[0], PAGE_SIZE);
+ ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE);
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, hwregion);
ATF_TP_ADD_TC(tp, hwregion_exclude);
+ ATF_TP_ADD_TC(tp, hwregion_unordered);
return (atf_no_error());
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Apr 20, 9:30 PM (2 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31847418
Default Alt Text
D34694.id.diff (2 KB)
Attached To
Mode
D34694: Handle non-page aligned/sized memory in physmem
Attached
Detach File
Event Timeline
Log In to Comment