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 @@ -127,11 +127,54 @@ ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE); } +ATF_TC_WITHOUT_HEAD(hwregion_ignore_empty); +ATF_TC_BODY(hwregion_ignore_empty, tc) +{ + vm_paddr_t avail[4]; + size_t len; + + /* Add a region. */ + physmem_hardware_region(PAGE_SIZE, 2 * PAGE_SIZE); + + /* Add full zero range (ignored) */ + physmem_hardware_region(0, 0); + + /* Add a zero-sized range (ignored) */ + physmem_hardware_region(4 * PAGE_SIZE, 0); + + len = physmem_avail(avail, nitems(avail)); + ATF_CHECK_EQ(len, 2); + ATF_CHECK_EQ(avail[0], PAGE_SIZE); + ATF_CHECK_EQ(avail[1], 3 * PAGE_SIZE); +} + +ATF_TC_WITHOUT_HEAD(hwregion_ignore_page0); +ATF_TC_BODY(hwregion_ignore_page0, tc) +{ + vm_paddr_t avail[4]; + size_t len; + + /* + * Physical addresses [0, PAGE_SIZE) are unusable in the VM layer. + * + * physmem will truncate this from the beginning of an otherwise valid + * memory range; test that this is the case. + */ + physmem_hardware_region(0, 2 * PAGE_SIZE); + + len = physmem_avail(avail, 4); + ATF_CHECK_EQ(len, 2); + ATF_CHECK_EQ(avail[0], PAGE_SIZE); + ATF_CHECK_EQ(avail[1], 2 * 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); + ATF_TP_ADD_TC(tp, hwregion_ignore_empty); + ATF_TP_ADD_TC(tp, hwregion_ignore_page0); return (atf_no_error()); }