xref: /netbsd-src/tests/sys/uvm/t_uvm_physseg.c (revision 4fe346050d83b28995a75e4ac11804eed8d54e7a)
1*4fe34605Sandvar /* $NetBSD: t_uvm_physseg.c,v 1.11 2022/07/26 19:49:32 andvar Exp $ */
207acf3c0Scherry 
307acf3c0Scherry /*-
407acf3c0Scherry  * Copyright (c) 2015, 2016 The NetBSD Foundation, Inc.
507acf3c0Scherry  * All rights reserved.
607acf3c0Scherry  *
707acf3c0Scherry  * This code is derived from software contributed to The NetBSD Foundation
807acf3c0Scherry  * by Santhosh N. Raju <santhosh.raju@gmail.com> and
907acf3c0Scherry  * by Cherry G. Mathew
1007acf3c0Scherry  *
1107acf3c0Scherry  * Redistribution and use in source and binary forms, with or without
1207acf3c0Scherry  * modification, are permitted provided that the following conditions
1307acf3c0Scherry  * are met:
1407acf3c0Scherry  * 1. Redistributions of source code must retain the above copyright
1507acf3c0Scherry  *    notice, this list of conditions and the following disclaimer.
1607acf3c0Scherry  * 2. Redistributions in binary form must reproduce the above copyright
1707acf3c0Scherry  *    notice, this list of conditions and the following disclaimer in the
1807acf3c0Scherry  *    documentation and/or other materials provided with the distribution.
1907acf3c0Scherry  *
2007acf3c0Scherry  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2107acf3c0Scherry  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2207acf3c0Scherry  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2307acf3c0Scherry  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2407acf3c0Scherry  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2507acf3c0Scherry  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2607acf3c0Scherry  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2707acf3c0Scherry  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2807acf3c0Scherry  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2907acf3c0Scherry  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3007acf3c0Scherry  * POSSIBILITY OF SUCH DAMAGE.
3107acf3c0Scherry  */
3207acf3c0Scherry 
3307acf3c0Scherry #include <sys/cdefs.h>
34*4fe34605Sandvar __RCSID("$NetBSD: t_uvm_physseg.c,v 1.11 2022/07/26 19:49:32 andvar Exp $");
35e6ff351eScherry 
36e6ff351eScherry /*
37e6ff351eScherry  * If this line is commented out tests related to uvm_physseg_get_pmseg()
38e6ff351eScherry  * wont run.
39e6ff351eScherry  *
40e6ff351eScherry  * Have a look at machine/uvm_physseg.h for more details.
41e6ff351eScherry  */
42e6ff351eScherry #define __HAVE_PMAP_PHYSSEG
43e6ff351eScherry 
44e6ff351eScherry /*
45e6ff351eScherry  * This is a dummy struct used for testing purposes
46e6ff351eScherry  *
47e6ff351eScherry  * In reality this struct would exist in the MD part of the code residing in
48e6ff351eScherry  * machines/vmparam.h
49e6ff351eScherry  */
50e6ff351eScherry 
51e6ff351eScherry #ifdef __HAVE_PMAP_PHYSSEG
52e6ff351eScherry struct pmap_physseg {
53e6ff351eScherry 	int dummy_variable;		/* Dummy variable use for testing */
54e6ff351eScherry };
55e6ff351eScherry #endif
5607acf3c0Scherry 
5707acf3c0Scherry /* Testing API - assumes userland */
5807acf3c0Scherry /* Provide Kernel API equivalents */
5907acf3c0Scherry #include <assert.h>
6007acf3c0Scherry #include <errno.h>
6107acf3c0Scherry #include <stdbool.h>
6207acf3c0Scherry #include <string.h> /* memset(3) et. al */
6307acf3c0Scherry #include <stdio.h> /* printf(3) */
6407acf3c0Scherry #include <stdlib.h> /* malloc(3) */
6507acf3c0Scherry #include <stdarg.h>
6607acf3c0Scherry #include <stddef.h>
6707acf3c0Scherry 
6807acf3c0Scherry #define	PRIxPADDR	"lx"
6907acf3c0Scherry #define	PRIxPSIZE	"lx"
7007acf3c0Scherry #define	PRIuPSIZE	"lu"
7107acf3c0Scherry #define	PRIxVADDR	"lx"
7207acf3c0Scherry #define	PRIxVSIZE	"lx"
7307acf3c0Scherry #define	PRIuVSIZE	"lu"
7407acf3c0Scherry 
7507acf3c0Scherry #define UVM_HOTPLUG /* Enable hotplug with rbtree. */
7607acf3c0Scherry #define PMAP_STEAL_MEMORY
7707acf3c0Scherry #define DEBUG /* Enable debug functionality. */
7807acf3c0Scherry 
7907acf3c0Scherry typedef unsigned long vaddr_t;
8007acf3c0Scherry typedef unsigned long paddr_t;
8107acf3c0Scherry typedef unsigned long psize_t;
8207acf3c0Scherry typedef unsigned long vsize_t;
8307acf3c0Scherry 
8407acf3c0Scherry #include <uvm/uvm_physseg.h>
85e6ff351eScherry #include <uvm/uvm_page.h>
8607acf3c0Scherry 
8707acf3c0Scherry #ifndef DIAGNOSTIC
8807acf3c0Scherry #define	KASSERTMSG(e, msg, ...)	/* NOTHING */
8907acf3c0Scherry #define	KASSERT(e)		/* NOTHING */
9007acf3c0Scherry #else
9107acf3c0Scherry #define	KASSERT(a)		assert(a)
9207acf3c0Scherry #define KASSERTMSG(exp, ...)    printf(__VA_ARGS__); assert((exp))
9307acf3c0Scherry #endif
9407acf3c0Scherry 
9507acf3c0Scherry #define VM_PHYSSEG_STRAT VM_PSTRAT_BSEARCH
9607acf3c0Scherry 
9707acf3c0Scherry #define VM_NFREELIST            4
9807acf3c0Scherry #define VM_FREELIST_DEFAULT     0
9907acf3c0Scherry #define VM_FREELIST_FIRST16     3
10007acf3c0Scherry #define VM_FREELIST_FIRST1G     2
10107acf3c0Scherry #define VM_FREELIST_FIRST4G     1
10207acf3c0Scherry 
10307acf3c0Scherry /*
10407acf3c0Scherry  * Used in tests when Array implementation is tested
10507acf3c0Scherry  */
10607acf3c0Scherry #if !defined(VM_PHYSSEG_MAX)
10707acf3c0Scherry #define VM_PHYSSEG_MAX          1
10807acf3c0Scherry #endif
10907acf3c0Scherry 
11007acf3c0Scherry #define PAGE_SHIFT              12
11107acf3c0Scherry #define PAGE_SIZE               (1 << PAGE_SHIFT)
11207acf3c0Scherry #define	PAGE_MASK	(PAGE_SIZE - 1)
11307acf3c0Scherry #define atop(x)         (((paddr_t)(x)) >> PAGE_SHIFT)
11407acf3c0Scherry #define ptoa(x)         (((paddr_t)(x)) << PAGE_SHIFT)
11507acf3c0Scherry 
11607acf3c0Scherry #define	mutex_enter(l)
11707acf3c0Scherry #define	mutex_exit(l)
11807acf3c0Scherry 
11907acf3c0Scherry psize_t physmem;
12007acf3c0Scherry 
12107acf3c0Scherry struct uvmexp uvmexp;        /* decl */
12207acf3c0Scherry 
12307acf3c0Scherry /*
12407acf3c0Scherry  * uvm structure borrowed from uvm.h
12507acf3c0Scherry  *
12607acf3c0Scherry  * Remember this is a dummy structure used within the ATF Tests and
12707acf3c0Scherry  * uses only necessary fields from the original uvm struct.
12807acf3c0Scherry  * See uvm/uvm.h for the full struct.
12907acf3c0Scherry  */
13007acf3c0Scherry 
13107acf3c0Scherry struct uvm {
13207acf3c0Scherry 	/* vm_page related parameters */
13307acf3c0Scherry 
13407acf3c0Scherry 	bool page_init_done;		/* TRUE if uvm_page_init() finished */
13507acf3c0Scherry } uvm;
13607acf3c0Scherry 
13707acf3c0Scherry #include <sys/kmem.h>
13807acf3c0Scherry 
13907acf3c0Scherry void *
kmem_alloc(size_t size,km_flag_t flags)14007acf3c0Scherry kmem_alloc(size_t size, km_flag_t flags)
14107acf3c0Scherry {
14207acf3c0Scherry 	return malloc(size);
14307acf3c0Scherry }
14407acf3c0Scherry 
14507acf3c0Scherry void *
kmem_zalloc(size_t size,km_flag_t flags)14607acf3c0Scherry kmem_zalloc(size_t size, km_flag_t flags)
14707acf3c0Scherry {
14807acf3c0Scherry 	void *ptr;
14907acf3c0Scherry 	ptr = malloc(size);
15007acf3c0Scherry 
15107acf3c0Scherry 	memset(ptr, 0, size);
15207acf3c0Scherry 
15307acf3c0Scherry 	return ptr;
15407acf3c0Scherry }
15507acf3c0Scherry 
15607acf3c0Scherry void
kmem_free(void * mem,size_t size)15707acf3c0Scherry kmem_free(void *mem, size_t size)
15807acf3c0Scherry {
15907acf3c0Scherry 	free(mem);
16007acf3c0Scherry }
16107acf3c0Scherry 
16207acf3c0Scherry static void
panic(const char * fmt,...)16307acf3c0Scherry panic(const char *fmt, ...)
16407acf3c0Scherry {
16507acf3c0Scherry 	va_list ap;
16607acf3c0Scherry 
16707acf3c0Scherry 	va_start(ap, fmt);
16807acf3c0Scherry 	vprintf(fmt, ap);
16907acf3c0Scherry 	printf("\n");
17007acf3c0Scherry 	va_end(ap);
17107acf3c0Scherry 	KASSERT(false);
17207acf3c0Scherry 
17307acf3c0Scherry 	/*NOTREACHED*/
17407acf3c0Scherry }
17507acf3c0Scherry 
17607acf3c0Scherry static void
uvm_pagefree(struct vm_page * pg)17707acf3c0Scherry uvm_pagefree(struct vm_page *pg)
17807acf3c0Scherry {
17907acf3c0Scherry 	return;
18007acf3c0Scherry }
18107acf3c0Scherry 
18207acf3c0Scherry #if defined(UVM_HOTPLUG)
18307acf3c0Scherry static void
uvmpdpol_reinit(void)18407acf3c0Scherry uvmpdpol_reinit(void)
18507acf3c0Scherry {
18607acf3c0Scherry 	return;
18707acf3c0Scherry }
18807acf3c0Scherry #endif /* UVM_HOTPLUG */
18907acf3c0Scherry 
19007acf3c0Scherry /* end - Provide Kernel API equivalents */
19107acf3c0Scherry 
19207acf3c0Scherry 
19307acf3c0Scherry #include "uvm/uvm_physseg.c"
19407acf3c0Scherry 
19507acf3c0Scherry #include <atf-c.h>
19607acf3c0Scherry 
19707acf3c0Scherry #define SIXTYFOUR_KILO (64 * 1024)
19807acf3c0Scherry #define ONETWENTYEIGHT_KILO (128 * 1024)
19907acf3c0Scherry #define TWOFIFTYSIX_KILO (256 * 1024)
20007acf3c0Scherry #define FIVEONETWO_KILO (512 * 1024)
20107acf3c0Scherry #define ONE_MEGABYTE (1024 * 1024)
20207acf3c0Scherry #define TWO_MEGABYTE (2 * 1024 * 1024)
20307acf3c0Scherry 
20407acf3c0Scherry /* Sample Page Frame Numbers */
20507acf3c0Scherry #define VALID_START_PFN_1 atop(0)
20607acf3c0Scherry #define VALID_END_PFN_1 atop(ONE_MEGABYTE)
20707acf3c0Scherry #define VALID_AVAIL_START_PFN_1 atop(0)
20807acf3c0Scherry #define VALID_AVAIL_END_PFN_1 atop(ONE_MEGABYTE)
20907acf3c0Scherry 
21007acf3c0Scherry #define VALID_START_PFN_2 atop(ONE_MEGABYTE + 1)
21107acf3c0Scherry #define VALID_END_PFN_2 atop(ONE_MEGABYTE * 2)
21207acf3c0Scherry #define VALID_AVAIL_START_PFN_2 atop(ONE_MEGABYTE + 1)
21307acf3c0Scherry #define VALID_AVAIL_END_PFN_2 atop(ONE_MEGABYTE * 2)
21407acf3c0Scherry 
21507acf3c0Scherry #define VALID_START_PFN_3 atop((ONE_MEGABYTE * 2) + 1)
21607acf3c0Scherry #define VALID_END_PFN_3 atop(ONE_MEGABYTE * 3)
21707acf3c0Scherry #define VALID_AVAIL_START_PFN_3 atop((ONE_MEGABYTE * 2) + 1)
21807acf3c0Scherry #define VALID_AVAIL_END_PFN_3 atop(ONE_MEGABYTE * 3)
21907acf3c0Scherry 
22007acf3c0Scherry #define VALID_START_PFN_4 atop((ONE_MEGABYTE * 3) + 1)
22107acf3c0Scherry #define VALID_END_PFN_4 atop(ONE_MEGABYTE * 4)
22207acf3c0Scherry #define VALID_AVAIL_START_PFN_4 atop((ONE_MEGABYTE * 3) + 1)
22307acf3c0Scherry #define VALID_AVAIL_END_PFN_4 atop(ONE_MEGABYTE * 4)
22407acf3c0Scherry 
22507acf3c0Scherry /*
22607acf3c0Scherry  * Total number of pages (of 4K size each) should be 256 for 1MB of memory.
22707acf3c0Scherry  */
22807acf3c0Scherry #define PAGE_COUNT_1M      256
22907acf3c0Scherry 
23007acf3c0Scherry /*
231*4fe34605Sandvar  * A debug function to print the content of upm.
23207acf3c0Scherry  */
23307acf3c0Scherry 	static inline void
uvm_physseg_dump_seg(uvm_physseg_t upm)23407acf3c0Scherry 	uvm_physseg_dump_seg(uvm_physseg_t upm)
23507acf3c0Scherry 	{
23607acf3c0Scherry #if defined(DEBUG)
23707acf3c0Scherry 		printf("%s: seg->start == %ld\n", __func__,
23807acf3c0Scherry 		    uvm_physseg_get_start(upm));
23907acf3c0Scherry 		printf("%s: seg->end == %ld\n", __func__,
24007acf3c0Scherry 		    uvm_physseg_get_end(upm));
24107acf3c0Scherry 		printf("%s: seg->avail_start == %ld\n", __func__,
24207acf3c0Scherry 		    uvm_physseg_get_avail_start(upm));
24307acf3c0Scherry 		printf("%s: seg->avail_end == %ld\n", __func__,
24407acf3c0Scherry 		    uvm_physseg_get_avail_end(upm));
24507acf3c0Scherry 
24607acf3c0Scherry 		printf("====\n\n");
24707acf3c0Scherry #else
24807acf3c0Scherry 		return;
24907acf3c0Scherry #endif /* DEBUG */
25007acf3c0Scherry 	}
25107acf3c0Scherry 
25207acf3c0Scherry /*
25307acf3c0Scherry  * Private accessor that gets the value of uvm_physseg_graph.nentries
25407acf3c0Scherry  */
25507acf3c0Scherry static int
uvm_physseg_get_entries(void)25607acf3c0Scherry uvm_physseg_get_entries(void)
25707acf3c0Scherry {
25807acf3c0Scherry #if defined(UVM_HOTPLUG)
25907acf3c0Scherry 	return uvm_physseg_graph.nentries;
26007acf3c0Scherry #else
26107acf3c0Scherry 	return vm_nphysmem;
26207acf3c0Scherry #endif /* UVM_HOTPLUG */
26307acf3c0Scherry }
26407acf3c0Scherry 
26507acf3c0Scherry #if !defined(UVM_HOTPLUG)
26607acf3c0Scherry static void *
uvm_physseg_alloc(size_t sz)26707acf3c0Scherry uvm_physseg_alloc(size_t sz)
26807acf3c0Scherry {
26907acf3c0Scherry 	return &vm_physmem[vm_nphysseg++];
27007acf3c0Scherry }
27107acf3c0Scherry #endif
27207acf3c0Scherry 
27307acf3c0Scherry /*
274a85205fcSfox  * This macro was added to convert uvmexp.npages from int to psize_t
275a85205fcSfox  */
276a85205fcSfox #define INT_TO_PSIZE_T(X) (psize_t)X
277a85205fcSfox 
278a85205fcSfox /*
27907acf3c0Scherry  * Test Fixture SetUp().
28007acf3c0Scherry  */
28107acf3c0Scherry static void
setup(void)28207acf3c0Scherry setup(void)
28307acf3c0Scherry {
28407acf3c0Scherry 	/* Prerequisites for running certain calls in uvm_physseg */
28507acf3c0Scherry 	uvmexp.pagesize = PAGE_SIZE;
28607acf3c0Scherry 	uvmexp.npages = 0;
28707acf3c0Scherry 	uvm.page_init_done = false;
28807acf3c0Scherry 	uvm_physseg_init();
28907acf3c0Scherry }
29007acf3c0Scherry 
29107acf3c0Scherry 
29207acf3c0Scherry /* <---- Tests for Internal functions ----> */
29307acf3c0Scherry #if defined(UVM_HOTPLUG)
29407acf3c0Scherry ATF_TC(uvm_physseg_alloc_atboot_mismatch);
ATF_TC_HEAD(uvm_physseg_alloc_atboot_mismatch,tc)29507acf3c0Scherry ATF_TC_HEAD(uvm_physseg_alloc_atboot_mismatch, tc)
29607acf3c0Scherry {
29707acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "boot time uvm_physseg_alloc() sanity"
29807acf3c0Scherry 	    "size mismatch alloc() test.");
29907acf3c0Scherry }
30007acf3c0Scherry 
ATF_TC_BODY(uvm_physseg_alloc_atboot_mismatch,tc)30107acf3c0Scherry ATF_TC_BODY(uvm_physseg_alloc_atboot_mismatch, tc)
30207acf3c0Scherry {
30307acf3c0Scherry 	uvm.page_init_done = false;
30407acf3c0Scherry 
30507acf3c0Scherry 	atf_tc_expect_signal(SIGABRT, "size mismatch alloc()");
30607acf3c0Scherry 
30707acf3c0Scherry 	uvm_physseg_alloc(sizeof(struct uvm_physseg) - 1);
30807acf3c0Scherry }
30907acf3c0Scherry 
31007acf3c0Scherry ATF_TC(uvm_physseg_alloc_atboot_overrun);
ATF_TC_HEAD(uvm_physseg_alloc_atboot_overrun,tc)31107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_alloc_atboot_overrun, tc)
31207acf3c0Scherry {
31307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "boot time uvm_physseg_alloc() sanity"
31407acf3c0Scherry 	    "array overrun alloc() test.");
31507acf3c0Scherry }
31607acf3c0Scherry 
ATF_TC_BODY(uvm_physseg_alloc_atboot_overrun,tc)31707acf3c0Scherry ATF_TC_BODY(uvm_physseg_alloc_atboot_overrun, tc)
31807acf3c0Scherry {
31907acf3c0Scherry 	uvm.page_init_done = false;
32007acf3c0Scherry 
32107acf3c0Scherry 	atf_tc_expect_signal(SIGABRT, "array overrun alloc()");
32207acf3c0Scherry 
32307acf3c0Scherry 	uvm_physseg_alloc((VM_PHYSSEG_MAX + 1) * sizeof(struct uvm_physseg));
32407acf3c0Scherry 
32507acf3c0Scherry }
32607acf3c0Scherry 
32707acf3c0Scherry ATF_TC(uvm_physseg_alloc_sanity);
ATF_TC_HEAD(uvm_physseg_alloc_sanity,tc)32807acf3c0Scherry ATF_TC_HEAD(uvm_physseg_alloc_sanity, tc)
32907acf3c0Scherry {
33007acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "further uvm_physseg_alloc() sanity checks");
33107acf3c0Scherry }
33207acf3c0Scherry 
ATF_TC_BODY(uvm_physseg_alloc_sanity,tc)33307acf3c0Scherry ATF_TC_BODY(uvm_physseg_alloc_sanity, tc)
33407acf3c0Scherry {
33507acf3c0Scherry 
33607acf3c0Scherry 	/* At boot time */
33707acf3c0Scherry 	uvm.page_init_done = false;
33807acf3c0Scherry 
33907acf3c0Scherry 	/* Correct alloc */
34007acf3c0Scherry 	ATF_REQUIRE(uvm_physseg_alloc(VM_PHYSSEG_MAX * sizeof(struct uvm_physseg)));
34107acf3c0Scherry 
34207acf3c0Scherry 	/* Retry static alloc()s as dynamic - we expect them to pass */
34307acf3c0Scherry 	uvm.page_init_done = true;
34407acf3c0Scherry 	ATF_REQUIRE(uvm_physseg_alloc(sizeof(struct uvm_physseg) - 1));
34507acf3c0Scherry 	ATF_REQUIRE(uvm_physseg_alloc(2 * VM_PHYSSEG_MAX * sizeof(struct uvm_physseg)));
34607acf3c0Scherry }
34707acf3c0Scherry 
34807acf3c0Scherry ATF_TC(uvm_physseg_free_atboot_mismatch);
ATF_TC_HEAD(uvm_physseg_free_atboot_mismatch,tc)34907acf3c0Scherry ATF_TC_HEAD(uvm_physseg_free_atboot_mismatch, tc)
35007acf3c0Scherry {
35107acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "boot time uvm_physseg_free() sanity"
35207acf3c0Scherry 	    "size mismatch free() test.");
35307acf3c0Scherry }
35407acf3c0Scherry 
ATF_TC_BODY(uvm_physseg_free_atboot_mismatch,tc)35507acf3c0Scherry ATF_TC_BODY(uvm_physseg_free_atboot_mismatch, tc)
35607acf3c0Scherry {
35707acf3c0Scherry 	uvm.page_init_done = false;
35807acf3c0Scherry 
35907acf3c0Scherry 	atf_tc_expect_signal(SIGABRT, "size mismatch free()");
36007acf3c0Scherry 
36107acf3c0Scherry 	uvm_physseg_free(&uvm_physseg[0], sizeof(struct uvm_physseg) - 1);
36207acf3c0Scherry }
36307acf3c0Scherry 
36407acf3c0Scherry ATF_TC(uvm_physseg_free_sanity);
ATF_TC_HEAD(uvm_physseg_free_sanity,tc)36507acf3c0Scherry ATF_TC_HEAD(uvm_physseg_free_sanity, tc)
36607acf3c0Scherry {
36707acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "further uvm_physseg_free() sanity checks");
36807acf3c0Scherry }
36907acf3c0Scherry 
ATF_TC_BODY(uvm_physseg_free_sanity,tc)37007acf3c0Scherry ATF_TC_BODY(uvm_physseg_free_sanity, tc)
37107acf3c0Scherry {
37207acf3c0Scherry 
37307acf3c0Scherry 	/* At boot time */
37407acf3c0Scherry 	uvm.page_init_done = false;
37507acf3c0Scherry 
37607acf3c0Scherry 	struct uvm_physseg *seg;
37707acf3c0Scherry 
37807acf3c0Scherry #if VM_PHYSSEG_MAX > 1
37907acf3c0Scherry 	/*
38007acf3c0Scherry 	 * Note: free()ing the entire array is considered to be an
38107acf3c0Scherry 	 * error. Thus VM_PHYSSEG_MAX - 1.
38207acf3c0Scherry 	 */
38307acf3c0Scherry 
38407acf3c0Scherry 	seg = uvm_physseg_alloc((VM_PHYSSEG_MAX - 1) * sizeof(*seg));
38507acf3c0Scherry 	uvm_physseg_free(seg, (VM_PHYSSEG_MAX - 1) * sizeof(struct uvm_physseg));
38607acf3c0Scherry #endif
38707acf3c0Scherry 
38807acf3c0Scherry 	/* Retry static alloc()s as dynamic - we expect them to pass */
38907acf3c0Scherry 	uvm.page_init_done = true;
39007acf3c0Scherry 
39107acf3c0Scherry 	seg = uvm_physseg_alloc(sizeof(struct uvm_physseg) - 1);
39207acf3c0Scherry 	uvm_physseg_free(seg, sizeof(struct uvm_physseg) - 1);
39307acf3c0Scherry 
39407acf3c0Scherry 	seg = uvm_physseg_alloc(2 * VM_PHYSSEG_MAX * sizeof(struct uvm_physseg));
39507acf3c0Scherry 
39607acf3c0Scherry 	uvm_physseg_free(seg, 2 * VM_PHYSSEG_MAX * sizeof(struct uvm_physseg));
39707acf3c0Scherry }
39807acf3c0Scherry 
39907acf3c0Scherry #if VM_PHYSSEG_MAX > 1
40007acf3c0Scherry ATF_TC(uvm_physseg_atboot_free_leak);
ATF_TC_HEAD(uvm_physseg_atboot_free_leak,tc)40107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_atboot_free_leak, tc)
40207acf3c0Scherry {
40307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr",
40466ea64ecSfox 	    "does free() leak at boot ?"
40507acf3c0Scherry 	    "This test needs VM_PHYSSEG_MAX > 1)");
40607acf3c0Scherry }
40707acf3c0Scherry 
ATF_TC_BODY(uvm_physseg_atboot_free_leak,tc)40807acf3c0Scherry ATF_TC_BODY(uvm_physseg_atboot_free_leak, tc)
40907acf3c0Scherry {
41007acf3c0Scherry 
41107acf3c0Scherry 	/* At boot time */
41207acf3c0Scherry 	uvm.page_init_done = false;
41307acf3c0Scherry 
41407acf3c0Scherry 	/* alloc to array size */
41507acf3c0Scherry 	struct uvm_physseg *seg;
41607acf3c0Scherry 	seg = uvm_physseg_alloc(VM_PHYSSEG_MAX * sizeof(*seg));
41707acf3c0Scherry 
41807acf3c0Scherry 	uvm_physseg_free(seg, sizeof(*seg));
41907acf3c0Scherry 
42007acf3c0Scherry 	atf_tc_expect_signal(SIGABRT, "array overrun on alloc() after leak");
42107acf3c0Scherry 
42207acf3c0Scherry 	ATF_REQUIRE(uvm_physseg_alloc(sizeof(struct uvm_physseg)));
42307acf3c0Scherry }
42407acf3c0Scherry #endif /* VM_PHYSSEG_MAX */
42507acf3c0Scherry #endif /* UVM_HOTPLUG */
42607acf3c0Scherry 
42707acf3c0Scherry /*
42807acf3c0Scherry  * Note: This function replicates verbatim what happens in
42907acf3c0Scherry  * uvm_page.c:uvm_page_init().
43007acf3c0Scherry  *
43107acf3c0Scherry  * Please track any changes that happen there.
43207acf3c0Scherry  */
43307acf3c0Scherry static void
uvm_page_init_fake(struct vm_page * pagearray,psize_t pagecount)43407acf3c0Scherry uvm_page_init_fake(struct vm_page *pagearray, psize_t pagecount)
43507acf3c0Scherry {
43607acf3c0Scherry 	uvm_physseg_t bank;
43707acf3c0Scherry 	size_t n;
43807acf3c0Scherry 
43907acf3c0Scherry 	for (bank = uvm_physseg_get_first(),
44007acf3c0Scherry 		 uvm_physseg_seg_chomp_slab(bank, pagearray, pagecount);
441e6ff351eScherry 	     uvm_physseg_valid_p(bank);
44207acf3c0Scherry 	     bank = uvm_physseg_get_next(bank)) {
44307acf3c0Scherry 
44407acf3c0Scherry 		n = uvm_physseg_get_end(bank) - uvm_physseg_get_start(bank);
44507acf3c0Scherry 		uvm_physseg_seg_alloc_from_slab(bank, n);
44607acf3c0Scherry 		uvm_physseg_init_seg(bank, pagearray);
44707acf3c0Scherry 
44807acf3c0Scherry 		/* set up page array pointers */
44907acf3c0Scherry 		pagearray += n;
45007acf3c0Scherry 		pagecount -= n;
45107acf3c0Scherry 	}
45207acf3c0Scherry 
45307acf3c0Scherry 	uvm.page_init_done = true;
45407acf3c0Scherry }
45507acf3c0Scherry 
45607acf3c0Scherry ATF_TC(uvm_physseg_plug);
ATF_TC_HEAD(uvm_physseg_plug,tc)45707acf3c0Scherry ATF_TC_HEAD(uvm_physseg_plug, tc)
45807acf3c0Scherry {
45907acf3c0Scherry 	atf_tc_set_md_var(tc, "descr",
46007acf3c0Scherry 	    "Test plug functionality.");
46107acf3c0Scherry }
46207acf3c0Scherry /* Note: We only do the second boot time plug if VM_PHYSSEG_MAX > 1 */
ATF_TC_BODY(uvm_physseg_plug,tc)46307acf3c0Scherry ATF_TC_BODY(uvm_physseg_plug, tc)
46407acf3c0Scherry {
46507acf3c0Scherry 	int nentries = 0; /* Count of entries via plug done so far */
46607acf3c0Scherry 	uvm_physseg_t upm1;
46707acf3c0Scherry #if VM_PHYSSEG_MAX > 2
46807acf3c0Scherry 	uvm_physseg_t upm2;
46907acf3c0Scherry #endif
47007acf3c0Scherry 
47107acf3c0Scherry #if VM_PHYSSEG_MAX > 1
47207acf3c0Scherry 	uvm_physseg_t upm3;
47307acf3c0Scherry #endif
47407acf3c0Scherry 	uvm_physseg_t upm4;
47507acf3c0Scherry 	psize_t npages1 = (VALID_END_PFN_1 - VALID_START_PFN_1);
47607acf3c0Scherry 	psize_t npages2 = (VALID_END_PFN_2 - VALID_START_PFN_2);
47707acf3c0Scherry 	psize_t npages3 = (VALID_END_PFN_3 - VALID_START_PFN_3);
47807acf3c0Scherry 	psize_t npages4 = (VALID_END_PFN_4 - VALID_START_PFN_4);
47907acf3c0Scherry 	struct vm_page *pgs, *slab = malloc(sizeof(struct vm_page) * (npages1
48007acf3c0Scherry #if VM_PHYSSEG_MAX > 2
48107acf3c0Scherry 		+ npages2
48207acf3c0Scherry #endif
48307acf3c0Scherry 		+ npages3));
48407acf3c0Scherry 
48507acf3c0Scherry 	/* Fake early boot */
48607acf3c0Scherry 
48707acf3c0Scherry 	setup();
48807acf3c0Scherry 
48907acf3c0Scherry 	/* Vanilla plug x 2 */
49007acf3c0Scherry 	ATF_REQUIRE_EQ(uvm_physseg_plug(VALID_START_PFN_1, npages1, &upm1), true);
49107acf3c0Scherry 	ATF_REQUIRE_EQ(++nentries, uvm_physseg_get_entries());
49207acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
49307acf3c0Scherry 
49407acf3c0Scherry #if VM_PHYSSEG_MAX > 2
49507acf3c0Scherry 	ATF_REQUIRE_EQ(uvm_physseg_plug(VALID_START_PFN_2, npages2, &upm2), true);
49607acf3c0Scherry 	ATF_REQUIRE_EQ(++nentries, uvm_physseg_get_entries());
49707acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
49807acf3c0Scherry #endif
49907acf3c0Scherry 	/* Post boot: Fake all segments and pages accounted for. */
50007acf3c0Scherry 	uvm_page_init_fake(slab, npages1 + npages2 + npages3);
50107acf3c0Scherry 
50207acf3c0Scherry 	ATF_CHECK_EQ(npages1
50307acf3c0Scherry #if VM_PHYSSEG_MAX > 2
50407acf3c0Scherry 	    + npages2
50507acf3c0Scherry #endif
506a85205fcSfox 	    , INT_TO_PSIZE_T(uvmexp.npages));
50707acf3c0Scherry #if VM_PHYSSEG_MAX > 1
50807acf3c0Scherry 	/* Scavenge plug - goes into the same slab */
50907acf3c0Scherry 	ATF_REQUIRE_EQ(uvm_physseg_plug(VALID_START_PFN_3, npages3, &upm3), true);
51007acf3c0Scherry 	ATF_REQUIRE_EQ(++nentries, uvm_physseg_get_entries());
51107acf3c0Scherry 	ATF_REQUIRE_EQ(npages1
51207acf3c0Scherry #if VM_PHYSSEG_MAX > 2
51307acf3c0Scherry 	    + npages2
51407acf3c0Scherry #endif
515497a8f2bSfox 	    + npages3, INT_TO_PSIZE_T(uvmexp.npages));
51607acf3c0Scherry 
51707acf3c0Scherry 	/* Scavenge plug should fit right in the slab */
51807acf3c0Scherry 	pgs = uvm_physseg_get_pg(upm3, 0);
51907acf3c0Scherry 	ATF_REQUIRE(pgs > slab && pgs < (slab + npages1 + npages2 + npages3));
52007acf3c0Scherry #endif
52107acf3c0Scherry 	/* Hot plug - goes into a brand new slab */
52207acf3c0Scherry 	ATF_REQUIRE_EQ(uvm_physseg_plug(VALID_START_PFN_4, npages4, &upm4), true);
52307acf3c0Scherry 	/* The hot plug slab should have nothing to do with the original slab */
52407acf3c0Scherry 	pgs = uvm_physseg_get_pg(upm4, 0);
525ff43743aSfox 	ATF_REQUIRE(pgs < slab || pgs >= (slab + npages1
52607acf3c0Scherry #if VM_PHYSSEG_MAX > 2
52707acf3c0Scherry 		+ npages2
52807acf3c0Scherry #endif
52907acf3c0Scherry 		+ npages3));
53007acf3c0Scherry 
53107acf3c0Scherry }
53207acf3c0Scherry ATF_TC(uvm_physseg_unplug);
ATF_TC_HEAD(uvm_physseg_unplug,tc)53307acf3c0Scherry ATF_TC_HEAD(uvm_physseg_unplug, tc)
53407acf3c0Scherry {
53507acf3c0Scherry 	atf_tc_set_md_var(tc, "descr",
53607acf3c0Scherry 	    "Test unplug functionality.");
53707acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_unplug,tc)53807acf3c0Scherry ATF_TC_BODY(uvm_physseg_unplug, tc)
53907acf3c0Scherry {
54007acf3c0Scherry 	paddr_t pa = 0;
54107acf3c0Scherry 
54207acf3c0Scherry 	psize_t npages1 = (VALID_END_PFN_1 - VALID_START_PFN_1);
54307acf3c0Scherry 	psize_t npages2 = (VALID_END_PFN_2 - VALID_START_PFN_2);
54407acf3c0Scherry 	psize_t npages3 = (VALID_END_PFN_3 - VALID_START_PFN_3);
54507acf3c0Scherry 
54607acf3c0Scherry 	struct vm_page *slab = malloc(sizeof(struct vm_page) * (npages1 + npages2 + npages3));
54707acf3c0Scherry 
54807acf3c0Scherry 	uvm_physseg_t upm;
54907acf3c0Scherry 
55007acf3c0Scherry 	/* Boot time */
55107acf3c0Scherry 	setup();
55207acf3c0Scherry 
55307acf3c0Scherry 	/* We start with zero segments */
55407acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm_physseg_plug(atop(0), atop(ONE_MEGABYTE), NULL));
55507acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
55607acf3c0Scherry 	/* Do we have an arbitrary offset in there ? */
55707acf3c0Scherry 	uvm_physseg_find(atop(TWOFIFTYSIX_KILO), &pa);
55807acf3c0Scherry 	ATF_REQUIRE_EQ(pa, atop(TWOFIFTYSIX_KILO));
55907acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages); /* Boot time sanity */
56007acf3c0Scherry 
56107acf3c0Scherry #if VM_PHYSSEG_MAX == 1
56207acf3c0Scherry 	/*
56307acf3c0Scherry 	 * This is the curious case at boot time, of having one
56407acf3c0Scherry 	 * extent(9) static entry per segment, which means that a
56507acf3c0Scherry 	 * fragmenting unplug will fail.
56607acf3c0Scherry 	 */
56707acf3c0Scherry 	atf_tc_expect_signal(SIGABRT, "fragmenting unplug for single segment");
56807acf3c0Scherry 
56907acf3c0Scherry 	/*
57007acf3c0Scherry 	 * In order to test the fragmenting cases, please set
57107acf3c0Scherry 	 * VM_PHYSSEG_MAX > 1
57207acf3c0Scherry 	 */
57307acf3c0Scherry #endif
57407acf3c0Scherry 	/* Now let's unplug from the middle */
57507acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm_physseg_unplug(atop(TWOFIFTYSIX_KILO), atop(FIVEONETWO_KILO)));
57607acf3c0Scherry 	/* verify that a gap exists at TWOFIFTYSIX_KILO */
57707acf3c0Scherry 	pa = 0; /* reset */
57807acf3c0Scherry 	uvm_physseg_find(atop(TWOFIFTYSIX_KILO), &pa);
57907acf3c0Scherry 	ATF_REQUIRE_EQ(pa, 0);
58007acf3c0Scherry 
58107acf3c0Scherry 	/* Post boot: Fake all segments and pages accounted for. */
58207acf3c0Scherry 	uvm_page_init_fake(slab, npages1 + npages2 + npages3);
58307acf3c0Scherry 	/* Account for the unplug */
58407acf3c0Scherry 	ATF_CHECK_EQ(atop(FIVEONETWO_KILO), uvmexp.npages);
58507acf3c0Scherry 
58607acf3c0Scherry 	/* Original entry should fragment into two */
58707acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
58807acf3c0Scherry 
58907acf3c0Scherry 	upm = uvm_physseg_find(atop(TWOFIFTYSIX_KILO + FIVEONETWO_KILO), NULL);
59007acf3c0Scherry 
591e6ff351eScherry 	ATF_REQUIRE(uvm_physseg_valid_p(upm));
59207acf3c0Scherry 
59307acf3c0Scherry 	/* Now unplug the tail fragment - should swallow the complete entry */
59407acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm_physseg_unplug(atop(TWOFIFTYSIX_KILO + FIVEONETWO_KILO), atop(TWOFIFTYSIX_KILO)));
59507acf3c0Scherry 
59607acf3c0Scherry 	/* The "swallow" above should have invalidated the handle */
597e6ff351eScherry 	ATF_REQUIRE_EQ(false, uvm_physseg_valid_p(upm));
59807acf3c0Scherry 
59907acf3c0Scherry 	/* Only the first one is left now */
60007acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
60107acf3c0Scherry 
60207acf3c0Scherry 	/* Unplug from the back */
60307acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm_physseg_unplug(atop(ONETWENTYEIGHT_KILO), atop(ONETWENTYEIGHT_KILO)));
60407acf3c0Scherry 	/* Shouldn't change the number of segments */
60507acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
60607acf3c0Scherry 
60707acf3c0Scherry 	/* Unplug from the front */
60807acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm_physseg_unplug(0, atop(SIXTYFOUR_KILO)));
60907acf3c0Scherry 	/* Shouldn't change the number of segments */
61007acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
61107acf3c0Scherry 
61207acf3c0Scherry 	/* Unplugging the final fragment should fail */
61307acf3c0Scherry 	atf_tc_expect_signal(SIGABRT, "Unplugging the last segment");
61407acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm_physseg_unplug(atop(SIXTYFOUR_KILO), atop(SIXTYFOUR_KILO)));
61507acf3c0Scherry }
61607acf3c0Scherry 
61707acf3c0Scherry 
61807acf3c0Scherry /* <---- end Tests for Internal functions ----> */
61907acf3c0Scherry 
62007acf3c0Scherry /* Tests for functions exported via uvm_physseg.h */
62107acf3c0Scherry ATF_TC(uvm_physseg_init);
ATF_TC_HEAD(uvm_physseg_init,tc)62207acf3c0Scherry ATF_TC_HEAD(uvm_physseg_init, tc)
62307acf3c0Scherry {
62407acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic uvm_page_init() call\
62507acf3c0Scherry 	    initializes the vm_physmem struct which holds the rb_tree.");
62607acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_init,tc)62707acf3c0Scherry ATF_TC_BODY(uvm_physseg_init, tc)
62807acf3c0Scherry {
62907acf3c0Scherry 	uvm_physseg_init();
63007acf3c0Scherry 
63107acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvm_physseg_get_entries());
63207acf3c0Scherry }
63307acf3c0Scherry 
63407acf3c0Scherry ATF_TC(uvm_page_physload_preload);
ATF_TC_HEAD(uvm_page_physload_preload,tc)63507acf3c0Scherry ATF_TC_HEAD(uvm_page_physload_preload, tc)
63607acf3c0Scherry {
63707acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic uvm_page_physload() \
63807acf3c0Scherry 	    call works without a panic() in a preload scenario.");
63907acf3c0Scherry }
ATF_TC_BODY(uvm_page_physload_preload,tc)64007acf3c0Scherry ATF_TC_BODY(uvm_page_physload_preload, tc)
64107acf3c0Scherry {
64207acf3c0Scherry 	uvm_physseg_t upm;
64307acf3c0Scherry 
64407acf3c0Scherry 	setup();
64507acf3c0Scherry 
64607acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
64707acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
64807acf3c0Scherry 
64907acf3c0Scherry 	/* Should return a valid handle */
650e6ff351eScherry 	ATF_REQUIRE(uvm_physseg_valid_p(upm));
65107acf3c0Scherry 
65207acf3c0Scherry 	/* No pages should be allocated yet */
65307acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
65407acf3c0Scherry 
65507acf3c0Scherry 	/* After the first call one segment should exist */
65607acf3c0Scherry 	ATF_CHECK_EQ(1, uvm_physseg_get_entries());
65707acf3c0Scherry 
65807acf3c0Scherry 	/* Insert more than one segment iff VM_PHYSSEG_MAX > 1 */
65907acf3c0Scherry #if VM_PHYSSEG_MAX > 1
66007acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
66107acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
66207acf3c0Scherry 
66307acf3c0Scherry 	/* Should return a valid handle */
664e6ff351eScherry 	ATF_REQUIRE(uvm_physseg_valid_p(upm));
66507acf3c0Scherry 
66607acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
66707acf3c0Scherry 
66807acf3c0Scherry 	/* After the second call two segments should exist */
66907acf3c0Scherry 	ATF_CHECK_EQ(2, uvm_physseg_get_entries());
67007acf3c0Scherry #endif
67107acf3c0Scherry }
67207acf3c0Scherry 
67307acf3c0Scherry ATF_TC(uvm_page_physload_postboot);
ATF_TC_HEAD(uvm_page_physload_postboot,tc)67407acf3c0Scherry ATF_TC_HEAD(uvm_page_physload_postboot, tc)
67507acf3c0Scherry {
67607acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic uvm_page_physload() \
67707acf3c0Scherry 	     panic()s in a post boot scenario.");
67807acf3c0Scherry }
ATF_TC_BODY(uvm_page_physload_postboot,tc)67907acf3c0Scherry ATF_TC_BODY(uvm_page_physload_postboot, tc)
68007acf3c0Scherry {
68107acf3c0Scherry 	uvm_physseg_t upm;
68207acf3c0Scherry 
68307acf3c0Scherry 	psize_t npages1 = (VALID_END_PFN_1 - VALID_START_PFN_1);
68407acf3c0Scherry 	psize_t npages2 = (VALID_END_PFN_2 - VALID_START_PFN_2);
68507acf3c0Scherry 
68607acf3c0Scherry 	struct vm_page *slab = malloc(sizeof(struct vm_page) * (npages1 + npages2));
68707acf3c0Scherry 
68807acf3c0Scherry 	setup();
68907acf3c0Scherry 
69007acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
69107acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
69207acf3c0Scherry 
69307acf3c0Scherry 	/* Should return a valid handle */
694e6ff351eScherry 	ATF_REQUIRE(uvm_physseg_valid_p(upm));
69507acf3c0Scherry 
69607acf3c0Scherry 	/* No pages should be allocated yet */
69707acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
69807acf3c0Scherry 
69907acf3c0Scherry 	/* After the first call one segment should exist */
70007acf3c0Scherry 	ATF_CHECK_EQ(1, uvm_physseg_get_entries());
70107acf3c0Scherry 
70207acf3c0Scherry 	/* Post boot: Fake all segments and pages accounted for. */
70307acf3c0Scherry 	uvm_page_init_fake(slab, npages1 + npages2);
70407acf3c0Scherry 
70507acf3c0Scherry 	atf_tc_expect_signal(SIGABRT,
70607acf3c0Scherry 	    "uvm_page_physload() called post boot");
70707acf3c0Scherry 
70807acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
70907acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
71007acf3c0Scherry 
71107acf3c0Scherry 	/* Should return a valid handle */
712e6ff351eScherry 	ATF_REQUIRE(uvm_physseg_valid_p(upm));
71307acf3c0Scherry 
714a85205fcSfox 	ATF_REQUIRE_EQ(npages1 + npages2, INT_TO_PSIZE_T(uvmexp.npages));
71507acf3c0Scherry 
71607acf3c0Scherry 	/* After the second call two segments should exist */
71707acf3c0Scherry 	ATF_CHECK_EQ(2, uvm_physseg_get_entries());
71807acf3c0Scherry }
71907acf3c0Scherry 
72007acf3c0Scherry ATF_TC(uvm_physseg_handle_immutable);
ATF_TC_HEAD(uvm_physseg_handle_immutable,tc)72107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_handle_immutable, tc)
72207acf3c0Scherry {
72307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the uvm_physseg_t handle is \
72407acf3c0Scherry 	    immutable.");
72507acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_handle_immutable,tc)72607acf3c0Scherry ATF_TC_BODY(uvm_physseg_handle_immutable, tc)
72707acf3c0Scherry {
72807acf3c0Scherry 	uvm_physseg_t upm;
72907acf3c0Scherry 
73007acf3c0Scherry 	/* We insert the segments in out of order */
73107acf3c0Scherry 
73207acf3c0Scherry 	setup();
73307acf3c0Scherry 
73407acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
73507acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
73607acf3c0Scherry 
73707acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
73807acf3c0Scherry 
73907acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
74007acf3c0Scherry 
74107acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID_EMPTY, uvm_physseg_get_prev(upm));
74207acf3c0Scherry 
74307acf3c0Scherry 	/* Insert more than one segment iff VM_PHYSSEG_MAX > 1 */
74407acf3c0Scherry #if VM_PHYSSEG_MAX > 1
74507acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
74607acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
74707acf3c0Scherry 
74807acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
74907acf3c0Scherry 
75007acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
75107acf3c0Scherry 
75207acf3c0Scherry 	/* Fetch Previous, we inserted a lower value */
75307acf3c0Scherry 	upm = uvm_physseg_get_prev(upm);
75407acf3c0Scherry 
75507acf3c0Scherry #if !defined(UVM_HOTPLUG)
75607acf3c0Scherry 	/*
75707acf3c0Scherry 	 * This test is going to fail for the Array Implementation but is
75807acf3c0Scherry 	 * expected to pass in the RB Tree implementation.
75907acf3c0Scherry 	 */
76007acf3c0Scherry 	/* Failure can be expected iff there are more than one handles */
76107acf3c0Scherry 	atf_tc_expect_fail("Mutable handle in static array impl.");
76207acf3c0Scherry #endif
76307acf3c0Scherry 	ATF_CHECK(UVM_PHYSSEG_TYPE_INVALID_EMPTY != upm);
76407acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_1, uvm_physseg_get_start(upm));
76507acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_1, uvm_physseg_get_end(upm));
76607acf3c0Scherry #endif
76707acf3c0Scherry }
76807acf3c0Scherry 
76907acf3c0Scherry ATF_TC(uvm_physseg_seg_chomp_slab);
ATF_TC_HEAD(uvm_physseg_seg_chomp_slab,tc)77007acf3c0Scherry ATF_TC_HEAD(uvm_physseg_seg_chomp_slab, tc)
77107acf3c0Scherry {
77207acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "The slab import code.()");
77307acf3c0Scherry 
77407acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_seg_chomp_slab,tc)77507acf3c0Scherry ATF_TC_BODY(uvm_physseg_seg_chomp_slab, tc)
77607acf3c0Scherry {
77707acf3c0Scherry 	int err;
77807acf3c0Scherry 	size_t i;
77907acf3c0Scherry 	struct uvm_physseg *seg;
78007acf3c0Scherry 	struct vm_page *slab, *pgs;
78107acf3c0Scherry 	const size_t npages = UVM_PHYSSEG_BOOT_UNPLUG_MAX; /* Number of pages */
78207acf3c0Scherry 
78307acf3c0Scherry 	setup();
78407acf3c0Scherry 
78507acf3c0Scherry 	/* This is boot time */
78607acf3c0Scherry 	slab = malloc(sizeof(struct vm_page) * npages * 2);
78707acf3c0Scherry 
78807acf3c0Scherry 	seg = uvm_physseg_alloc(sizeof(struct uvm_physseg));
78907acf3c0Scherry 
79007acf3c0Scherry 	uvm_physseg_seg_chomp_slab(PHYSSEG_NODE_TO_HANDLE(seg), slab, npages * 2);
79107acf3c0Scherry 
79207acf3c0Scherry 	/* Should be able to allocate two 128 * sizeof(*slab) */
79307acf3c0Scherry 	ATF_REQUIRE_EQ(0, extent_alloc(seg->ext, sizeof(*slab), 1, 0, EX_BOUNDZERO, (void *)&pgs));
79407acf3c0Scherry 	err = extent_free(seg->ext, (u_long) pgs, sizeof(*slab), EX_BOUNDZERO);
79507acf3c0Scherry 
79607acf3c0Scherry #if VM_PHYSSEG_MAX == 1
79707acf3c0Scherry 	/*
79807acf3c0Scherry 	 * free() needs an extra region descriptor, but we only have
79907acf3c0Scherry 	 * one! The classic alloc() at free() problem
80007acf3c0Scherry 	 */
80107acf3c0Scherry 
80207acf3c0Scherry 	ATF_REQUIRE_EQ(ENOMEM, err);
80307acf3c0Scherry #else
80407acf3c0Scherry 	/* Try alloc/free at static time */
80507acf3c0Scherry 	for (i = 0; i < npages; i++) {
80607acf3c0Scherry 		ATF_REQUIRE_EQ(0, extent_alloc(seg->ext, sizeof(*slab), 1, 0, EX_BOUNDZERO, (void *)&pgs));
80707acf3c0Scherry 		err = extent_free(seg->ext, (u_long) pgs, sizeof(*slab), EX_BOUNDZERO);
80807acf3c0Scherry 		ATF_REQUIRE_EQ(0, err);
80907acf3c0Scherry 	}
81007acf3c0Scherry #endif
81107acf3c0Scherry 
81207acf3c0Scherry 	/* Now setup post boot */
81307acf3c0Scherry 	uvm.page_init_done = true;
81407acf3c0Scherry 
81507acf3c0Scherry 	uvm_physseg_seg_chomp_slab(PHYSSEG_NODE_TO_HANDLE(seg), slab, npages * 2);
81607acf3c0Scherry 
81707acf3c0Scherry 	/* Try alloc/free after uvm_page.c:uvm_page_init() as well */
81807acf3c0Scherry 	for (i = 0; i < npages; i++) {
81907acf3c0Scherry 		ATF_REQUIRE_EQ(0, extent_alloc(seg->ext, sizeof(*slab), 1, 0, EX_BOUNDZERO, (void *)&pgs));
82007acf3c0Scherry 		err = extent_free(seg->ext, (u_long) pgs, sizeof(*slab), EX_BOUNDZERO);
82107acf3c0Scherry 		ATF_REQUIRE_EQ(0, err);
82207acf3c0Scherry 	}
82307acf3c0Scherry 
82407acf3c0Scherry }
82507acf3c0Scherry 
82607acf3c0Scherry ATF_TC(uvm_physseg_alloc_from_slab);
ATF_TC_HEAD(uvm_physseg_alloc_from_slab,tc)82707acf3c0Scherry ATF_TC_HEAD(uvm_physseg_alloc_from_slab, tc)
82807acf3c0Scherry {
82907acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "The slab alloc code.()");
83007acf3c0Scherry 
83107acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_alloc_from_slab,tc)83207acf3c0Scherry ATF_TC_BODY(uvm_physseg_alloc_from_slab, tc)
83307acf3c0Scherry {
83407acf3c0Scherry 	struct uvm_physseg *seg;
83507acf3c0Scherry 	struct vm_page *slab, *pgs;
83607acf3c0Scherry 	const size_t npages = UVM_PHYSSEG_BOOT_UNPLUG_MAX; /* Number of pages */
83707acf3c0Scherry 
83807acf3c0Scherry 	setup();
83907acf3c0Scherry 
84007acf3c0Scherry 	/* This is boot time */
84107acf3c0Scherry 	slab = malloc(sizeof(struct vm_page) * npages * 2);
84207acf3c0Scherry 
84307acf3c0Scherry 	seg = uvm_physseg_alloc(sizeof(struct uvm_physseg));
84407acf3c0Scherry 
84507acf3c0Scherry 	uvm_physseg_seg_chomp_slab(PHYSSEG_NODE_TO_HANDLE(seg), slab, npages * 2);
84607acf3c0Scherry 
84707acf3c0Scherry 	pgs = uvm_physseg_seg_alloc_from_slab(PHYSSEG_NODE_TO_HANDLE(seg), npages);
84807acf3c0Scherry 
84907acf3c0Scherry 	ATF_REQUIRE(pgs != NULL);
85007acf3c0Scherry 
85107acf3c0Scherry 	/* Now setup post boot */
85207acf3c0Scherry 	uvm.page_init_done = true;
85307acf3c0Scherry 
85407acf3c0Scherry #if VM_PHYSSEG_MAX > 1
85507acf3c0Scherry 	pgs = uvm_physseg_seg_alloc_from_slab(PHYSSEG_NODE_TO_HANDLE(seg), npages);
85607acf3c0Scherry 	ATF_REQUIRE(pgs != NULL);
85707acf3c0Scherry #endif
85807acf3c0Scherry 	atf_tc_expect_fail("alloc beyond extent");
85907acf3c0Scherry 
86007acf3c0Scherry 	pgs = uvm_physseg_seg_alloc_from_slab(PHYSSEG_NODE_TO_HANDLE(seg), npages);
86107acf3c0Scherry 	ATF_REQUIRE(pgs != NULL);
86207acf3c0Scherry }
86307acf3c0Scherry 
86407acf3c0Scherry ATF_TC(uvm_physseg_init_seg);
ATF_TC_HEAD(uvm_physseg_init_seg,tc)86507acf3c0Scherry ATF_TC_HEAD(uvm_physseg_init_seg, tc)
86607acf3c0Scherry {
86707acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if uvm_physseg_init_seg adds pages to"
86807acf3c0Scherry 	    "uvmexp.npages");
86907acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_init_seg,tc)87007acf3c0Scherry ATF_TC_BODY(uvm_physseg_init_seg, tc)
87107acf3c0Scherry {
87207acf3c0Scherry 	struct uvm_physseg *seg;
87307acf3c0Scherry 	struct vm_page *slab, *pgs;
87407acf3c0Scherry 	const size_t npages = UVM_PHYSSEG_BOOT_UNPLUG_MAX; /* Number of pages */
87507acf3c0Scherry 
87607acf3c0Scherry 	setup();
87707acf3c0Scherry 
87807acf3c0Scherry 	/* This is boot time */
87907acf3c0Scherry 	slab = malloc(sizeof(struct vm_page) * npages * 2);
88007acf3c0Scherry 
88107acf3c0Scherry 	seg = uvm_physseg_alloc(sizeof(struct uvm_physseg));
88207acf3c0Scherry 
88307acf3c0Scherry 	uvm_physseg_seg_chomp_slab(PHYSSEG_NODE_TO_HANDLE(seg), slab, npages * 2);
88407acf3c0Scherry 
88507acf3c0Scherry 	pgs = uvm_physseg_seg_alloc_from_slab(PHYSSEG_NODE_TO_HANDLE(seg), npages);
88607acf3c0Scherry 
88707acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
88807acf3c0Scherry 
88907acf3c0Scherry 	seg->start = 0;
89007acf3c0Scherry 	seg->end = npages;
89107acf3c0Scherry 
89207acf3c0Scherry 	seg->avail_start = 0;
89307acf3c0Scherry 	seg->avail_end = npages;
89407acf3c0Scherry 
89507acf3c0Scherry 	uvm_physseg_init_seg(PHYSSEG_NODE_TO_HANDLE(seg), pgs);
89607acf3c0Scherry 
897a85205fcSfox 	ATF_REQUIRE_EQ(npages, INT_TO_PSIZE_T(uvmexp.npages));
89807acf3c0Scherry }
89907acf3c0Scherry 
90007acf3c0Scherry #if 0
90107acf3c0Scherry ATF_TC(uvm_physseg_init_seg);
90207acf3c0Scherry ATF_TC_HEAD(uvm_physseg_init_seg, tc)
90307acf3c0Scherry {
90407acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic uvm_page_physload() \
90507acf3c0Scherry 	    call works without a panic() after Segment is inited.");
90607acf3c0Scherry }
90707acf3c0Scherry ATF_TC_BODY(uvm_physseg_init_seg, tc)
90807acf3c0Scherry {
90907acf3c0Scherry 	uvm_physseg_t upm;
91007acf3c0Scherry 	psize_t npages = (VALID_END_PFN_1 - VALID_START_PFN_1);
91107acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
91207acf3c0Scherry 
91307acf3c0Scherry 	setup();
91407acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
91507acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
91607acf3c0Scherry 
91707acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
91807acf3c0Scherry 
91907acf3c0Scherry 	ATF_CHECK_EQ(0, uvmexp.npages);
92007acf3c0Scherry 
92107acf3c0Scherry 	/*
92207acf3c0Scherry 	 * Boot time physplug needs explicit external init,
92307acf3c0Scherry 	 * Duplicate what uvm_page.c:uvm_page_init() does.
92407acf3c0Scherry 	 * Note: not everything uvm_page_init() does gets done here.
92507acf3c0Scherry 	 * Read the source.
92607acf3c0Scherry 	 */
92707acf3c0Scherry 	/* suck in backing slab, initialise extent. */
92807acf3c0Scherry 	uvm_physseg_seg_chomp_slab(upm, pgs, npages);
92907acf3c0Scherry 
93007acf3c0Scherry 	/*
93107acf3c0Scherry 	 * Actual pgs[] allocation, from extent.
93207acf3c0Scherry 	 */
93307acf3c0Scherry 	uvm_physseg_alloc_from_slab(upm, npages);
93407acf3c0Scherry 
93507acf3c0Scherry 	/* Now we initialize the segment */
93607acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
93707acf3c0Scherry 
93807acf3c0Scherry 	/* Done with boot simulation */
93907acf3c0Scherry 	extent_init();
94007acf3c0Scherry 	uvm.page_init_done = true;
94107acf3c0Scherry 
94207acf3c0Scherry 	/* We have total memory of 1MB */
94307acf3c0Scherry 	ATF_CHECK_EQ(PAGE_COUNT_1M, uvmexp.npages);
94407acf3c0Scherry 
94507acf3c0Scherry 	upm =uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
94607acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
94707acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
94807acf3c0Scherry 
94907acf3c0Scherry 	/* We added another 1MB so PAGE_COUNT_1M + PAGE_COUNT_1M */
95007acf3c0Scherry 	ATF_CHECK_EQ(PAGE_COUNT_1M + PAGE_COUNT_1M, uvmexp.npages);
95107acf3c0Scherry 
95207acf3c0Scherry }
95307acf3c0Scherry #endif
95407acf3c0Scherry 
95507acf3c0Scherry ATF_TC(uvm_physseg_get_start);
ATF_TC_HEAD(uvm_physseg_get_start,tc)95607acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_start, tc)
95707acf3c0Scherry {
95807acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the start PFN is returned \
95907acf3c0Scherry 	    correctly from a segment created via uvm_page_physload().");
96007acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_start,tc)96107acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_start, tc)
96207acf3c0Scherry {
96307acf3c0Scherry 	uvm_physseg_t upm;
96407acf3c0Scherry 
96507acf3c0Scherry 	/* Fake early boot */
96607acf3c0Scherry 	setup();
96707acf3c0Scherry 
96807acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
96907acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
97007acf3c0Scherry 
97107acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
97207acf3c0Scherry 
97307acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
97407acf3c0Scherry 
97507acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_1, uvm_physseg_get_start(upm));
97607acf3c0Scherry 
97707acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
97807acf3c0Scherry #if VM_PHYSSEG_MAX > 1
97907acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
98007acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
98107acf3c0Scherry 
98207acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
98307acf3c0Scherry 
98407acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
98507acf3c0Scherry 
98607acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
98707acf3c0Scherry #endif
98807acf3c0Scherry }
98907acf3c0Scherry 
99007acf3c0Scherry ATF_TC(uvm_physseg_get_start_invalid);
ATF_TC_HEAD(uvm_physseg_get_start_invalid,tc)99107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_start_invalid, tc)
99207acf3c0Scherry {
99307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the invalid / error conditions \
99407acf3c0Scherry 	    correctly when uvm_physseg_get_start() is called with invalid \
99507acf3c0Scherry 	    parameter values.");
99607acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_start_invalid,tc)99707acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_start_invalid, tc)
99807acf3c0Scherry {
99907acf3c0Scherry 	/* Check for pgs == NULL */
100007acf3c0Scherry 	setup();
100107acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
100207acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
100307acf3c0Scherry 
100407acf3c0Scherry 	/* Force other check conditions */
100507acf3c0Scherry 	uvm.page_init_done = true;
100607acf3c0Scherry 
100707acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
100807acf3c0Scherry 
100907acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
101007acf3c0Scherry 
101107acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm.page_init_done);
101207acf3c0Scherry 
101307acf3c0Scherry 	/* Invalid uvm_physseg_t */
101407acf3c0Scherry 	ATF_CHECK_EQ((paddr_t) -1,
101507acf3c0Scherry 	    uvm_physseg_get_start(UVM_PHYSSEG_TYPE_INVALID));
101607acf3c0Scherry }
101707acf3c0Scherry 
101807acf3c0Scherry ATF_TC(uvm_physseg_get_end);
ATF_TC_HEAD(uvm_physseg_get_end,tc)101907acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_end, tc)
102007acf3c0Scherry {
102107acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the end PFN is returned \
102207acf3c0Scherry 	    correctly from a segment created via uvm_page_physload().");
102307acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_end,tc)102407acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_end, tc)
102507acf3c0Scherry {
102607acf3c0Scherry 	uvm_physseg_t upm;
102707acf3c0Scherry 
102807acf3c0Scherry 	setup();
102907acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
103007acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
103107acf3c0Scherry 
103207acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
103307acf3c0Scherry 
103407acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
103507acf3c0Scherry 
103607acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_1, uvm_physseg_get_end(upm));
103707acf3c0Scherry 
103807acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
103907acf3c0Scherry #if VM_PHYSSEG_MAX > 1
104007acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
104107acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
104207acf3c0Scherry 
104307acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
104407acf3c0Scherry 
104507acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
104607acf3c0Scherry 
104707acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
104807acf3c0Scherry #endif
104907acf3c0Scherry }
105007acf3c0Scherry 
105107acf3c0Scherry ATF_TC(uvm_physseg_get_end_invalid);
ATF_TC_HEAD(uvm_physseg_get_end_invalid,tc)105207acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_end_invalid, tc)
105307acf3c0Scherry {
105407acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the invalid / error conditions \
105507acf3c0Scherry 	    correctly when uvm_physseg_get_end() is called with invalid \
105607acf3c0Scherry 	    parameter values.");
105707acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_end_invalid,tc)105807acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_end_invalid, tc)
105907acf3c0Scherry {
106007acf3c0Scherry 	/* Check for pgs == NULL */
106107acf3c0Scherry 	setup();
106207acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
106307acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
106407acf3c0Scherry 
106507acf3c0Scherry 	/* Force other check conditions */
106607acf3c0Scherry 	uvm.page_init_done = true;
106707acf3c0Scherry 
106807acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
106907acf3c0Scherry 
107007acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
107107acf3c0Scherry 
107207acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm.page_init_done);
107307acf3c0Scherry 
107407acf3c0Scherry 	/* Invalid uvm_physseg_t */
107507acf3c0Scherry 	ATF_CHECK_EQ((paddr_t) -1,
107607acf3c0Scherry 	    uvm_physseg_get_end(UVM_PHYSSEG_TYPE_INVALID));
107707acf3c0Scherry }
107807acf3c0Scherry 
107907acf3c0Scherry ATF_TC(uvm_physseg_get_avail_start);
ATF_TC_HEAD(uvm_physseg_get_avail_start,tc)108007acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_avail_start, tc)
108107acf3c0Scherry {
108207acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the avail_start PFN is \
108307acf3c0Scherry 	    returned correctly from a segment created via uvm_page_physload().");
108407acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_avail_start,tc)108507acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_avail_start, tc)
108607acf3c0Scherry {
108707acf3c0Scherry 	uvm_physseg_t upm;
108807acf3c0Scherry 
108907acf3c0Scherry 	setup();
109007acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
109107acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
109207acf3c0Scherry 
109307acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
109407acf3c0Scherry 
109507acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
109607acf3c0Scherry 
109707acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_1, uvm_physseg_get_avail_start(upm));
109807acf3c0Scherry 
109907acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
110007acf3c0Scherry #if VM_PHYSSEG_MAX > 1
110107acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
110207acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
110307acf3c0Scherry 
110407acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
110507acf3c0Scherry 
110607acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
110707acf3c0Scherry 
110807acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2, uvm_physseg_get_avail_start(upm));
110907acf3c0Scherry #endif
111007acf3c0Scherry }
111107acf3c0Scherry 
111207acf3c0Scherry ATF_TC(uvm_physseg_get_avail_start_invalid);
ATF_TC_HEAD(uvm_physseg_get_avail_start_invalid,tc)111307acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_avail_start_invalid, tc)
111407acf3c0Scherry {
111507acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the invalid / error conditions \
111607acf3c0Scherry 	    correctly when uvm_physseg_get_avail_start() is called with invalid\
111707acf3c0Scherry 	    parameter values.");
111807acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_avail_start_invalid,tc)111907acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_avail_start_invalid, tc)
112007acf3c0Scherry {
112107acf3c0Scherry 	/* Check for pgs == NULL */
112207acf3c0Scherry 	setup();
112307acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
112407acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
112507acf3c0Scherry 
112607acf3c0Scherry 	/* Force other check conditions */
112707acf3c0Scherry 	uvm.page_init_done = true;
112807acf3c0Scherry 
112907acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
113007acf3c0Scherry 
113107acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
113207acf3c0Scherry 
113307acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm.page_init_done);
113407acf3c0Scherry 
113507acf3c0Scherry 	/* Invalid uvm_physseg_t */
113607acf3c0Scherry 	ATF_CHECK_EQ((paddr_t) -1,
113707acf3c0Scherry 	    uvm_physseg_get_avail_start(UVM_PHYSSEG_TYPE_INVALID));
113807acf3c0Scherry }
113907acf3c0Scherry 
114007acf3c0Scherry ATF_TC(uvm_physseg_get_avail_end);
ATF_TC_HEAD(uvm_physseg_get_avail_end,tc)114107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_avail_end, tc)
114207acf3c0Scherry {
114307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the avail_end PFN is \
114407acf3c0Scherry 	    returned correctly from a segment created via uvm_page_physload().");
114507acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_avail_end,tc)114607acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_avail_end, tc)
114707acf3c0Scherry {
114807acf3c0Scherry 	uvm_physseg_t upm;
114907acf3c0Scherry 
115007acf3c0Scherry 	setup();
115107acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
115207acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
115307acf3c0Scherry 
115407acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
115507acf3c0Scherry 
115607acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
115707acf3c0Scherry 
115807acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_1, uvm_physseg_get_avail_end(upm));
115907acf3c0Scherry 
116007acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
116107acf3c0Scherry #if VM_PHYSSEG_MAX > 1
116207acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
116307acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
116407acf3c0Scherry 
116507acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
116607acf3c0Scherry 
116707acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
116807acf3c0Scherry 
116907acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2, uvm_physseg_get_avail_end(upm));
117007acf3c0Scherry #endif
117107acf3c0Scherry }
117207acf3c0Scherry 
117307acf3c0Scherry ATF_TC(uvm_physseg_get_avail_end_invalid);
ATF_TC_HEAD(uvm_physseg_get_avail_end_invalid,tc)117407acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_avail_end_invalid, tc)
117507acf3c0Scherry {
117607acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the invalid / error conditions \
117707acf3c0Scherry 	    correctly when uvm_physseg_get_avail_end() is called with invalid\
117807acf3c0Scherry 	    parameter values.");
117907acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_avail_end_invalid,tc)118007acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_avail_end_invalid, tc)
118107acf3c0Scherry {
118207acf3c0Scherry 	/* Check for pgs == NULL */
118307acf3c0Scherry 	setup();
118407acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
118507acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
118607acf3c0Scherry 
118707acf3c0Scherry 	/* Force other check conditions */
118807acf3c0Scherry 	uvm.page_init_done = true;
118907acf3c0Scherry 
119007acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
119107acf3c0Scherry 
119207acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
119307acf3c0Scherry 
119407acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm.page_init_done);
119507acf3c0Scherry 
119607acf3c0Scherry 	/* Invalid uvm_physseg_t */
119707acf3c0Scherry 	ATF_CHECK_EQ((paddr_t) -1,
119807acf3c0Scherry 	    uvm_physseg_get_avail_end(UVM_PHYSSEG_TYPE_INVALID));
119907acf3c0Scherry }
120007acf3c0Scherry 
120107acf3c0Scherry ATF_TC(uvm_physseg_get_next);
ATF_TC_HEAD(uvm_physseg_get_next,tc)120207acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_next, tc)
120307acf3c0Scherry {
120407acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the pointer values for next \
120507acf3c0Scherry 	    segment using the uvm_physseg_get_next() call.");
120607acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_next,tc)120707acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_next, tc)
120807acf3c0Scherry {
120907acf3c0Scherry 	uvm_physseg_t upm;
121007acf3c0Scherry #if VM_PHYSSEG_MAX > 1
121107acf3c0Scherry 	uvm_physseg_t upm_next;
121207acf3c0Scherry #endif
121307acf3c0Scherry 
121407acf3c0Scherry 	/* We insert the segments in ascending order */
121507acf3c0Scherry 
121607acf3c0Scherry 	setup();
121707acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
121807acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
121907acf3c0Scherry 
122007acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
122107acf3c0Scherry 
122207acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
122307acf3c0Scherry 
122407acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID_OVERFLOW,
122507acf3c0Scherry 	    uvm_physseg_get_next(upm));
122607acf3c0Scherry 
122707acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
122807acf3c0Scherry #if VM_PHYSSEG_MAX > 1
122907acf3c0Scherry 	upm_next = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
123007acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
123107acf3c0Scherry 
123207acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
123307acf3c0Scherry 
123407acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
123507acf3c0Scherry 
123607acf3c0Scherry 	upm = uvm_physseg_get_next(upm); /* Fetch Next */
123707acf3c0Scherry 
123807acf3c0Scherry 	ATF_CHECK_EQ(upm_next, upm);
123907acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
124007acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
124107acf3c0Scherry #endif
124207acf3c0Scherry 
124307acf3c0Scherry 	/* This test will be triggered only if there are 3 or more segments. */
124407acf3c0Scherry #if VM_PHYSSEG_MAX > 2
124507acf3c0Scherry 	upm_next = uvm_page_physload(VALID_START_PFN_3, VALID_END_PFN_3,
124607acf3c0Scherry 	    VALID_AVAIL_START_PFN_3, VALID_AVAIL_END_PFN_3, VM_FREELIST_DEFAULT);
124707acf3c0Scherry 
124807acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
124907acf3c0Scherry 
125007acf3c0Scherry 	ATF_REQUIRE_EQ(3, uvm_physseg_get_entries());
125107acf3c0Scherry 
125207acf3c0Scherry 	upm = uvm_physseg_get_next(upm); /* Fetch Next */
125307acf3c0Scherry 
125407acf3c0Scherry 	ATF_CHECK_EQ(upm_next, upm);
125507acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_3, uvm_physseg_get_start(upm));
125607acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_3, uvm_physseg_get_end(upm));
125707acf3c0Scherry #endif
125807acf3c0Scherry }
125907acf3c0Scherry 
126007acf3c0Scherry ATF_TC(uvm_physseg_get_next_invalid);
ATF_TC_HEAD(uvm_physseg_get_next_invalid,tc)126107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_next_invalid, tc)
126207acf3c0Scherry {
126307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the invalid / error conditions \
126407acf3c0Scherry 	    correctly when uvm_physseg_get_next() is called with invalid \
126507acf3c0Scherry 	    parameter values.");
126607acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_next_invalid,tc)126707acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_next_invalid, tc)
126807acf3c0Scherry {
126907acf3c0Scherry 	uvm_physseg_t upm = UVM_PHYSSEG_TYPE_INVALID;
127007acf3c0Scherry 
127107acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID, uvm_physseg_get_next(upm));
127207acf3c0Scherry }
127307acf3c0Scherry 
127407acf3c0Scherry ATF_TC(uvm_physseg_get_prev);
ATF_TC_HEAD(uvm_physseg_get_prev,tc)127507acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_prev, tc)
127607acf3c0Scherry {
127707acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the pointer values for previous \
127807acf3c0Scherry 	    segment using the uvm_physseg_get_prev() call.");
127907acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_prev,tc)128007acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_prev, tc)
128107acf3c0Scherry {
128207acf3c0Scherry #if VM_PHYSSEG_MAX > 1
128307acf3c0Scherry 	uvm_physseg_t upm;
128407acf3c0Scherry #endif
128507acf3c0Scherry 	uvm_physseg_t upm_prev;
128607acf3c0Scherry 
128707acf3c0Scherry 
128807acf3c0Scherry 	setup();
128907acf3c0Scherry 	upm_prev = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
129007acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
129107acf3c0Scherry 
129207acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
129307acf3c0Scherry 
129407acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
129507acf3c0Scherry 
129607acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID_EMPTY,
129707acf3c0Scherry 	    uvm_physseg_get_prev(upm_prev));
129807acf3c0Scherry 
129907acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
130007acf3c0Scherry #if VM_PHYSSEG_MAX > 1
130107acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
130207acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
130307acf3c0Scherry 
130407acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
130507acf3c0Scherry 
130607acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
130707acf3c0Scherry 
130807acf3c0Scherry 	/* Fetch Previous, we inserted a lower value */
130907acf3c0Scherry 	upm = uvm_physseg_get_prev(upm);
131007acf3c0Scherry 
131107acf3c0Scherry 	ATF_CHECK_EQ(upm_prev, upm);
131207acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_1, uvm_physseg_get_start(upm));
131307acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_1, uvm_physseg_get_end(upm));
131407acf3c0Scherry #endif
131507acf3c0Scherry 
131607acf3c0Scherry 	/* This test will be triggered only if there are 3 or more segments. */
131707acf3c0Scherry #if VM_PHYSSEG_MAX > 2
131807acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_3, VALID_END_PFN_3,
131907acf3c0Scherry 	    VALID_AVAIL_START_PFN_3, VALID_AVAIL_END_PFN_3, VM_FREELIST_DEFAULT);
132007acf3c0Scherry 
132107acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
132207acf3c0Scherry 
132307acf3c0Scherry 	ATF_REQUIRE_EQ(3, uvm_physseg_get_entries());
132407acf3c0Scherry 
132507acf3c0Scherry 	/*
132607acf3c0Scherry 	 * This will return a UVM_PHYSSEG_TYPE_INVALID_EMPTY we are at the
132707acf3c0Scherry 	 * lowest
132807acf3c0Scherry 	 */
132907acf3c0Scherry 	upm = uvm_physseg_get_prev(upm);
133007acf3c0Scherry 
133107acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID_EMPTY, upm);
133207acf3c0Scherry #endif
133307acf3c0Scherry }
133407acf3c0Scherry 
133507acf3c0Scherry ATF_TC(uvm_physseg_get_prev_invalid);
ATF_TC_HEAD(uvm_physseg_get_prev_invalid,tc)133607acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_prev_invalid, tc)
133707acf3c0Scherry {
133807acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the invalid / error conditions \
133907acf3c0Scherry 	    correctly when uvm_physseg_get_prev() is called with invalid \
134007acf3c0Scherry 	    parameter values.");
134107acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_prev_invalid,tc)134207acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_prev_invalid, tc)
134307acf3c0Scherry {
134407acf3c0Scherry 	uvm_physseg_t upm = UVM_PHYSSEG_TYPE_INVALID;
134507acf3c0Scherry 
134607acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID, uvm_physseg_get_prev(upm));
134707acf3c0Scherry }
134807acf3c0Scherry 
134907acf3c0Scherry ATF_TC(uvm_physseg_get_first);
ATF_TC_HEAD(uvm_physseg_get_first,tc)135007acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_first, tc)
135107acf3c0Scherry {
135207acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the pointer values for first \
135307acf3c0Scherry 	    segment (lowest node) using the uvm_physseg_get_first() call.");
135407acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_first,tc)135507acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_first, tc)
135607acf3c0Scherry {
135707acf3c0Scherry 	uvm_physseg_t upm = UVM_PHYSSEG_TYPE_INVALID_EMPTY;
135807acf3c0Scherry 	uvm_physseg_t upm_first;
135907acf3c0Scherry 
136007acf3c0Scherry 	/* Fake early boot */
136107acf3c0Scherry 	setup();
136207acf3c0Scherry 
136307acf3c0Scherry 	/* No nodes exist */
136407acf3c0Scherry 	ATF_CHECK_EQ(upm, uvm_physseg_get_first());
136507acf3c0Scherry 
136607acf3c0Scherry 	upm_first = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
136707acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
136807acf3c0Scherry 
136907acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
137007acf3c0Scherry 
137107acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
137207acf3c0Scherry 
137307acf3c0Scherry 	/* Pointer to first should be the least valued node */
137407acf3c0Scherry 	upm = uvm_physseg_get_first();
137507acf3c0Scherry 	ATF_CHECK_EQ(upm_first, upm);
137607acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
137707acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
137807acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2, uvm_physseg_get_avail_start(upm));
137907acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2, uvm_physseg_get_avail_end(upm));
138007acf3c0Scherry 
138107acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
138207acf3c0Scherry #if VM_PHYSSEG_MAX > 1
138307acf3c0Scherry 	/* Insert a node of lesser value */
138407acf3c0Scherry 	upm_first = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
138507acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
138607acf3c0Scherry 
138707acf3c0Scherry 	ATF_CHECK_EQ(0, uvmexp.npages);
138807acf3c0Scherry 
138907acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
139007acf3c0Scherry 
139107acf3c0Scherry 	/* Pointer to first should be the least valued node */
139207acf3c0Scherry 	upm = uvm_physseg_get_first();
139307acf3c0Scherry 	ATF_CHECK_EQ(upm_first, upm);
139407acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_1, uvm_physseg_get_start(upm));
139507acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_1, uvm_physseg_get_end(upm));
139607acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_1, uvm_physseg_get_avail_start(upm));
139707acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_1, uvm_physseg_get_avail_end(upm));
139807acf3c0Scherry #endif
139907acf3c0Scherry 
140007acf3c0Scherry 	/* This test will be triggered only if there are 3 or more segments. */
140107acf3c0Scherry #if VM_PHYSSEG_MAX > 2
140207acf3c0Scherry 	/* Insert a node of higher value */
140307acf3c0Scherry 	upm_first =uvm_page_physload(VALID_START_PFN_3, VALID_END_PFN_3,
140407acf3c0Scherry 	    VALID_AVAIL_START_PFN_3, VALID_AVAIL_END_PFN_3, VM_FREELIST_DEFAULT);
140507acf3c0Scherry 
140607acf3c0Scherry 	ATF_CHECK_EQ(0, uvmexp.npages);
140707acf3c0Scherry 
140807acf3c0Scherry 	ATF_REQUIRE_EQ(3, uvm_physseg_get_entries());
140907acf3c0Scherry 
141007acf3c0Scherry 	/* Pointer to first should be the least valued node */
141107acf3c0Scherry 	upm = uvm_physseg_get_first();
141207acf3c0Scherry 	ATF_CHECK(upm_first != upm);
141307acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_1, uvm_physseg_get_start(upm));
141407acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_1, uvm_physseg_get_end(upm));
141507acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_1, uvm_physseg_get_avail_start(upm));
141607acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_1, uvm_physseg_get_avail_end(upm));
141707acf3c0Scherry #endif
141807acf3c0Scherry }
141907acf3c0Scherry 
142007acf3c0Scherry ATF_TC(uvm_physseg_get_last);
ATF_TC_HEAD(uvm_physseg_get_last,tc)142107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_last, tc)
142207acf3c0Scherry {
142307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the pointer values for last \
142407acf3c0Scherry 	    segment using the uvm_physseg_get_last() call.");
142507acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_last,tc)142607acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_last, tc)
142707acf3c0Scherry {
142807acf3c0Scherry 	uvm_physseg_t upm = UVM_PHYSSEG_TYPE_INVALID_EMPTY;
142907acf3c0Scherry 	uvm_physseg_t upm_last;
143007acf3c0Scherry 
143107acf3c0Scherry 	setup();
143207acf3c0Scherry 
143307acf3c0Scherry 	/* No nodes exist */
143407acf3c0Scherry 	ATF_CHECK_EQ(upm, uvm_physseg_get_last());
143507acf3c0Scherry 
143607acf3c0Scherry 	upm_last = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
143707acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
143807acf3c0Scherry 
143907acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
144007acf3c0Scherry 
144107acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
144207acf3c0Scherry 
144307acf3c0Scherry 	/* Pointer to last should be the most valued node */
144407acf3c0Scherry 	upm = uvm_physseg_get_last();
144507acf3c0Scherry 	ATF_CHECK_EQ(upm_last, upm);
144607acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_1, uvm_physseg_get_start(upm));
144707acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_1, uvm_physseg_get_end(upm));
144807acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_1, uvm_physseg_get_avail_start(upm));
144907acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_1, uvm_physseg_get_avail_end(upm));
145007acf3c0Scherry 
145107acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
145207acf3c0Scherry #if VM_PHYSSEG_MAX > 1
145307acf3c0Scherry 	/* Insert node of greater value */
145407acf3c0Scherry 	upm_last = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
145507acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
145607acf3c0Scherry 
145707acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
145807acf3c0Scherry 
145907acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
146007acf3c0Scherry 
146107acf3c0Scherry 	/* Pointer to last should be the most valued node */
146207acf3c0Scherry 	upm = uvm_physseg_get_last();
146307acf3c0Scherry 	ATF_CHECK_EQ(upm_last, upm);
146407acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
146507acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
146607acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2, uvm_physseg_get_avail_start(upm));
146707acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2, uvm_physseg_get_avail_end(upm));
146807acf3c0Scherry #endif
146907acf3c0Scherry 
147007acf3c0Scherry 	/* This test will be triggered only if there are 3 or more segments. */
147107acf3c0Scherry #if VM_PHYSSEG_MAX > 2
147207acf3c0Scherry 	/* Insert node of greater value */
147307acf3c0Scherry 	upm_last = uvm_page_physload(VALID_START_PFN_3, VALID_END_PFN_3,
147407acf3c0Scherry 	    VALID_AVAIL_START_PFN_3, VALID_AVAIL_END_PFN_3, VM_FREELIST_DEFAULT);
147507acf3c0Scherry 
147607acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
147707acf3c0Scherry 
147807acf3c0Scherry 	ATF_REQUIRE_EQ(3, uvm_physseg_get_entries());
147907acf3c0Scherry 
148007acf3c0Scherry 	/* Pointer to last should be the most valued node */
148107acf3c0Scherry 	upm = uvm_physseg_get_last();
148207acf3c0Scherry 	ATF_CHECK_EQ(upm_last, upm);
148307acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_3, uvm_physseg_get_start(upm));
148407acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_3, uvm_physseg_get_end(upm));
148507acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_3, uvm_physseg_get_avail_start(upm));
148607acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_3, uvm_physseg_get_avail_end(upm));
148707acf3c0Scherry #endif
148807acf3c0Scherry }
148907acf3c0Scherry 
149007acf3c0Scherry ATF_TC(uvm_physseg_valid);
ATF_TC_HEAD(uvm_physseg_valid,tc)149107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_valid, tc)
149207acf3c0Scherry {
149307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the pointer value for current \
1494e6ff351eScherry 	    segment is valid using the uvm_physseg_valid_p() call.");
149507acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_valid,tc)149607acf3c0Scherry ATF_TC_BODY(uvm_physseg_valid, tc)
149707acf3c0Scherry {
149807acf3c0Scherry 	psize_t npages = (VALID_END_PFN_1 - VALID_START_PFN_1);
149907acf3c0Scherry 
150007acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
150107acf3c0Scherry 
150207acf3c0Scherry 	uvm_physseg_t upm;
150307acf3c0Scherry 
150407acf3c0Scherry 	setup();
150507acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
150607acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
150707acf3c0Scherry 
150807acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
150907acf3c0Scherry 
151007acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
151107acf3c0Scherry 
151207acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
151307acf3c0Scherry 
151407acf3c0Scherry 	ATF_REQUIRE_EQ(PAGE_COUNT_1M, uvmexp.npages);
151507acf3c0Scherry 
1516e6ff351eScherry 	ATF_CHECK_EQ(true, uvm_physseg_valid_p(upm));
151707acf3c0Scherry }
151807acf3c0Scherry 
151907acf3c0Scherry ATF_TC(uvm_physseg_valid_invalid);
ATF_TC_HEAD(uvm_physseg_valid_invalid,tc)152007acf3c0Scherry ATF_TC_HEAD(uvm_physseg_valid_invalid, tc)
152107acf3c0Scherry {
152207acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests the pointer value for current \
1523e6ff351eScherry 	    segment is invalid using the uvm_physseg_valid_p() call.");
152407acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_valid_invalid,tc)152507acf3c0Scherry ATF_TC_BODY(uvm_physseg_valid_invalid, tc)
152607acf3c0Scherry {
152707acf3c0Scherry 	uvm_physseg_t upm;
152807acf3c0Scherry 
152907acf3c0Scherry 	setup();
153007acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
153107acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
153207acf3c0Scherry 
153307acf3c0Scherry 	/* Force other check conditions */
153407acf3c0Scherry 	uvm.page_init_done = true;
153507acf3c0Scherry 
153607acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm.page_init_done);
153707acf3c0Scherry 
153807acf3c0Scherry 	/* Invalid uvm_physseg_t */
1539e6ff351eScherry 	ATF_CHECK_EQ(false, uvm_physseg_valid_p(UVM_PHYSSEG_TYPE_INVALID));
154007acf3c0Scherry 
154107acf3c0Scherry 	/*
154207acf3c0Scherry 	 * Without any pages initialized for segment, it is considered
154307acf3c0Scherry 	 * invalid
154407acf3c0Scherry 	 */
1545e6ff351eScherry 	ATF_CHECK_EQ(false, uvm_physseg_valid_p(upm));
154607acf3c0Scherry }
154707acf3c0Scherry 
154807acf3c0Scherry ATF_TC(uvm_physseg_get_highest);
ATF_TC_HEAD(uvm_physseg_get_highest,tc)154907acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_highest, tc)
155007acf3c0Scherry {
155107acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned PFN matches  \
155207acf3c0Scherry 	    the highest PFN in use by the system.");
155307acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_highest,tc)155407acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_highest, tc)
155507acf3c0Scherry {
155607acf3c0Scherry 	setup();
155707acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
155807acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
155907acf3c0Scherry 
156007acf3c0Scherry 	/* Only one segment so highest is the current */
156107acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_1 - 1, uvm_physseg_get_highest_frame());
156207acf3c0Scherry 
156307acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
156407acf3c0Scherry #if VM_PHYSSEG_MAX > 1
156507acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_3, VALID_END_PFN_3,
156607acf3c0Scherry 	    VALID_AVAIL_START_PFN_3, VALID_AVAIL_END_PFN_3, VM_FREELIST_DEFAULT);
156707acf3c0Scherry 
156807acf3c0Scherry 	/* PFN_3 > PFN_1 */
156907acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_3 - 1, uvm_physseg_get_highest_frame());
157007acf3c0Scherry #endif
157107acf3c0Scherry 
157207acf3c0Scherry 	/* This test will be triggered only if there are 3 or more segments. */
157307acf3c0Scherry #if VM_PHYSSEG_MAX > 2
157407acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
157507acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
157607acf3c0Scherry 
157707acf3c0Scherry 	/* PFN_3 > PFN_2 */
157807acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_3 - 1, uvm_physseg_get_highest_frame());
157907acf3c0Scherry #endif
158007acf3c0Scherry }
158107acf3c0Scherry 
158207acf3c0Scherry ATF_TC(uvm_physseg_get_free_list);
ATF_TC_HEAD(uvm_physseg_get_free_list,tc)158307acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_free_list, tc)
158407acf3c0Scherry {
158507acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned Free List type \
158607acf3c0Scherry 	    of a segment matches the one returned from \
158707acf3c0Scherry 	    uvm_physseg_get_free_list() call.");
158807acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_free_list,tc)158907acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_free_list, tc)
159007acf3c0Scherry {
159107acf3c0Scherry 	uvm_physseg_t upm;
159207acf3c0Scherry 
159307acf3c0Scherry 	/* Fake early boot */
159407acf3c0Scherry 	setup();
159507acf3c0Scherry 
159607acf3c0Scherry 	/* Insertions are made in ascending order */
159707acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
159807acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
159907acf3c0Scherry 
160007acf3c0Scherry 	ATF_CHECK_EQ(VM_FREELIST_DEFAULT, uvm_physseg_get_free_list(upm));
160107acf3c0Scherry 
160207acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
160307acf3c0Scherry #if VM_PHYSSEG_MAX > 1
160407acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
160507acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_FIRST16);
160607acf3c0Scherry 
160707acf3c0Scherry 	ATF_CHECK_EQ(VM_FREELIST_FIRST16, uvm_physseg_get_free_list(upm));
160807acf3c0Scherry #endif
160907acf3c0Scherry 
161007acf3c0Scherry 	/* This test will be triggered only if there are 3 or more segments. */
161107acf3c0Scherry #if VM_PHYSSEG_MAX > 2
161207acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_3, VALID_END_PFN_3,
161307acf3c0Scherry 	    VALID_AVAIL_START_PFN_3, VALID_AVAIL_END_PFN_3, VM_FREELIST_FIRST1G);
161407acf3c0Scherry 
161507acf3c0Scherry 	ATF_CHECK_EQ(VM_FREELIST_FIRST1G, uvm_physseg_get_free_list(upm));
161607acf3c0Scherry #endif
161707acf3c0Scherry }
161807acf3c0Scherry 
161907acf3c0Scherry ATF_TC(uvm_physseg_get_start_hint);
ATF_TC_HEAD(uvm_physseg_get_start_hint,tc)162007acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_start_hint, tc)
162107acf3c0Scherry {
162207acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned start_hint value \
162307acf3c0Scherry 	    of a segment matches the one returned from \
162407acf3c0Scherry 	    uvm_physseg_get_start_hint() call.");
162507acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_start_hint,tc)162607acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_start_hint, tc)
162707acf3c0Scherry {
162807acf3c0Scherry 	uvm_physseg_t upm;
162907acf3c0Scherry 
163007acf3c0Scherry 	setup();
163107acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
163207acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
163307acf3c0Scherry 
163407acf3c0Scherry 	/* Will be Zero since no specific value is set during init */
163507acf3c0Scherry 	ATF_CHECK_EQ(0, uvm_physseg_get_start_hint(upm));
163607acf3c0Scherry }
163707acf3c0Scherry 
163807acf3c0Scherry ATF_TC(uvm_physseg_set_start_hint);
ATF_TC_HEAD(uvm_physseg_set_start_hint,tc)163907acf3c0Scherry ATF_TC_HEAD(uvm_physseg_set_start_hint, tc)
164007acf3c0Scherry {
164107acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned start_hint value \
164207acf3c0Scherry 	    of a segment matches the one set by the \
164307acf3c0Scherry 	    uvm_physseg_set_start_hint() call.");
164407acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_set_start_hint,tc)164507acf3c0Scherry ATF_TC_BODY(uvm_physseg_set_start_hint, tc)
164607acf3c0Scherry {
164707acf3c0Scherry 	psize_t npages = (VALID_END_PFN_1 - VALID_START_PFN_1);
164807acf3c0Scherry 
164907acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
165007acf3c0Scherry 
165107acf3c0Scherry 	uvm_physseg_t upm;
165207acf3c0Scherry 
165307acf3c0Scherry 	setup();
165407acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
165507acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
165607acf3c0Scherry 
165707acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
165807acf3c0Scherry 
165907acf3c0Scherry 	ATF_CHECK_EQ(true, uvm_physseg_set_start_hint(upm, atop(128)));
166007acf3c0Scherry 
166107acf3c0Scherry 	/* Will be atop(128) since no specific value is set above */
166207acf3c0Scherry 	ATF_CHECK_EQ(atop(128), uvm_physseg_get_start_hint(upm));
166307acf3c0Scherry }
166407acf3c0Scherry 
166507acf3c0Scherry ATF_TC(uvm_physseg_set_start_hint_invalid);
ATF_TC_HEAD(uvm_physseg_set_start_hint_invalid,tc)166607acf3c0Scherry ATF_TC_HEAD(uvm_physseg_set_start_hint_invalid, tc)
166707acf3c0Scherry {
166807acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned value is false \
166907acf3c0Scherry 	    when an invalid segment matches the one trying to set by the \
167007acf3c0Scherry 	    uvm_physseg_set_start_hint() call.");
167107acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_set_start_hint_invalid,tc)167207acf3c0Scherry ATF_TC_BODY(uvm_physseg_set_start_hint_invalid, tc)
167307acf3c0Scherry {
167407acf3c0Scherry 	uvm_physseg_t upm;
167507acf3c0Scherry 
167607acf3c0Scherry 	setup();
167707acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
167807acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
167907acf3c0Scherry 
168007acf3c0Scherry 	/* Force other check conditions */
168107acf3c0Scherry 	uvm.page_init_done = true;
168207acf3c0Scherry 
168307acf3c0Scherry 	ATF_REQUIRE_EQ(true, uvm.page_init_done);
168407acf3c0Scherry 
168507acf3c0Scherry 	ATF_CHECK_EQ(false, uvm_physseg_set_start_hint(upm, atop(128)));
168607acf3c0Scherry 
168707acf3c0Scherry 	/*
168807acf3c0Scherry 	 * Will be Zero since no specific value is set after the init
168907acf3c0Scherry 	 * due to failure
169007acf3c0Scherry 	 */
169107acf3c0Scherry 	atf_tc_expect_signal(SIGABRT, "invalid uvm_physseg_t handle");
169207acf3c0Scherry 
169307acf3c0Scherry 	ATF_CHECK_EQ(0, uvm_physseg_get_start_hint(upm));
169407acf3c0Scherry }
169507acf3c0Scherry 
169607acf3c0Scherry ATF_TC(uvm_physseg_get_pg);
ATF_TC_HEAD(uvm_physseg_get_pg,tc)169707acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_pg, tc)
169807acf3c0Scherry {
169907acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned vm_page struct \
170007acf3c0Scherry 	    is correct when fetched by uvm_physseg_get_pg() call.");
170107acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_pg,tc)170207acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_pg, tc)
170307acf3c0Scherry {
170407acf3c0Scherry 	psize_t npages = (VALID_END_PFN_1 - VALID_START_PFN_1);
170507acf3c0Scherry 
170607acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
170707acf3c0Scherry 
170807acf3c0Scherry 	struct vm_page *extracted_pg = NULL;
170907acf3c0Scherry 
171007acf3c0Scherry 	uvm_physseg_t upm;
171107acf3c0Scherry 
171207acf3c0Scherry 	setup();
171307acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
171407acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
171507acf3c0Scherry 
171607acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
171707acf3c0Scherry 
171807acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
171907acf3c0Scherry 
172007acf3c0Scherry 	/* Now we initialize the segment */
172107acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
172207acf3c0Scherry 
172307acf3c0Scherry 	ATF_REQUIRE_EQ(PAGE_COUNT_1M, uvmexp.npages);
172407acf3c0Scherry 
172507acf3c0Scherry 	ATF_REQUIRE_EQ(NULL, extracted_pg);
172607acf3c0Scherry 
172707acf3c0Scherry 	/* Try fetching the 5th Page in the Segment */
172807acf3c0Scherry 	extracted_pg = uvm_physseg_get_pg(upm, 5);
172907acf3c0Scherry 
173007acf3c0Scherry 	/* Values of phys_addr is n * PAGE_SIZE where n is the page number */
173107acf3c0Scherry 	ATF_CHECK_EQ(5 * PAGE_SIZE, extracted_pg->phys_addr);
173207acf3c0Scherry 
173307acf3c0Scherry 	/* Try fetching the 113th Page in the Segment */
173407acf3c0Scherry 	extracted_pg = uvm_physseg_get_pg(upm, 113);
173507acf3c0Scherry 
173607acf3c0Scherry 	ATF_CHECK_EQ(113 * PAGE_SIZE, extracted_pg->phys_addr);
173707acf3c0Scherry }
173807acf3c0Scherry 
173907acf3c0Scherry #ifdef __HAVE_PMAP_PHYSSEG
174007acf3c0Scherry ATF_TC(uvm_physseg_get_pmseg);
ATF_TC_HEAD(uvm_physseg_get_pmseg,tc)174107acf3c0Scherry ATF_TC_HEAD(uvm_physseg_get_pmseg, tc)
174207acf3c0Scherry {
174307acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned pmap_physseg \
174407acf3c0Scherry 	    struct is correct when fetched by uvm_physseg_get_pmseg() call.");
174507acf3c0Scherry }
ATF_TC_BODY(uvm_physseg_get_pmseg,tc)174607acf3c0Scherry ATF_TC_BODY(uvm_physseg_get_pmseg, tc)
174707acf3c0Scherry {
174807acf3c0Scherry 	psize_t npages = (VALID_END_PFN_1 - VALID_START_PFN_1);
174907acf3c0Scherry 
175007acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
175107acf3c0Scherry 
175207acf3c0Scherry 	struct pmap_physseg pmseg = { true };
175307acf3c0Scherry 
175407acf3c0Scherry 	struct pmap_physseg *extracted_pmseg = NULL;
175507acf3c0Scherry 
175607acf3c0Scherry 	uvm_physseg_t upm;
175707acf3c0Scherry 
175807acf3c0Scherry 	setup();
175907acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
176007acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
176107acf3c0Scherry 
176207acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
176307acf3c0Scherry 
176407acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
176507acf3c0Scherry 
176607acf3c0Scherry 	/* Now we initialize the segment */
176707acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
176807acf3c0Scherry 
176907acf3c0Scherry 	ATF_REQUIRE_EQ(PAGE_COUNT_1M, uvmexp.npages);
177007acf3c0Scherry 
177107acf3c0Scherry 	ATF_REQUIRE_EQ(NULL, extracted_pmseg);
177207acf3c0Scherry 
177307acf3c0Scherry 	ATF_REQUIRE_EQ(true, pmseg.dummy_variable);
177407acf3c0Scherry 
177507acf3c0Scherry 	/* Extract the current pmseg */
177607acf3c0Scherry 	extracted_pmseg = uvm_physseg_get_pmseg(upm);
177707acf3c0Scherry 
177807acf3c0Scherry 	/*
177907acf3c0Scherry 	 * We can only check if it is not NULL
178007acf3c0Scherry 	 * We do not know the value it contains
178107acf3c0Scherry 	 */
178207acf3c0Scherry 	ATF_CHECK(NULL != extracted_pmseg);
178307acf3c0Scherry 
178407acf3c0Scherry 	extracted_pmseg->dummy_variable = pmseg.dummy_variable;
178507acf3c0Scherry 
178607acf3c0Scherry 	/* Invert value to ensure test integrity */
178707acf3c0Scherry 	pmseg.dummy_variable = false;
178807acf3c0Scherry 
178907acf3c0Scherry 	ATF_REQUIRE_EQ(false, pmseg.dummy_variable);
179007acf3c0Scherry 
179107acf3c0Scherry 	extracted_pmseg = uvm_physseg_get_pmseg(upm);
179207acf3c0Scherry 
179307acf3c0Scherry 	ATF_CHECK(NULL != extracted_pmseg);
179407acf3c0Scherry 
179507acf3c0Scherry 	ATF_CHECK_EQ(true, extracted_pmseg->dummy_variable);
179607acf3c0Scherry }
179707acf3c0Scherry #endif
179807acf3c0Scherry 
179907acf3c0Scherry ATF_TC(vm_physseg_find);
ATF_TC_HEAD(vm_physseg_find,tc)180007acf3c0Scherry ATF_TC_HEAD(vm_physseg_find, tc)
180107acf3c0Scherry {
180207acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned segment number \
180307acf3c0Scherry 	    is correct when an PFN is passed into uvm_physseg_find() call. \
180407acf3c0Scherry 	    In addition	to this the offset of the PFN from the start of \
180507acf3c0Scherry 	    segment is also set if the parameter is passed in as not NULL.");
180607acf3c0Scherry }
ATF_TC_BODY(vm_physseg_find,tc)180707acf3c0Scherry ATF_TC_BODY(vm_physseg_find, tc)
180807acf3c0Scherry {
180907acf3c0Scherry 	psize_t offset = (psize_t) -1;
181007acf3c0Scherry 
181107acf3c0Scherry 	uvm_physseg_t upm_first, result;
181207acf3c0Scherry #if VM_PHYSSEG_MAX > 1
181307acf3c0Scherry 	uvm_physseg_t upm_second;
181407acf3c0Scherry #endif
181507acf3c0Scherry 
181607acf3c0Scherry 	setup();
181707acf3c0Scherry 
181807acf3c0Scherry 	upm_first = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
181907acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
182007acf3c0Scherry 
182107acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
182207acf3c0Scherry 
182307acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
182407acf3c0Scherry 
182507acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
182607acf3c0Scherry #if VM_PHYSSEG_MAX > 1
182707acf3c0Scherry 	upm_second = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
182807acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
182907acf3c0Scherry 
183007acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
183107acf3c0Scherry 
183207acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
183307acf3c0Scherry #endif
183407acf3c0Scherry 
183507acf3c0Scherry 	/* Under ONE_MEGABYTE is segment upm_first */
183607acf3c0Scherry 	result = uvm_physseg_find(atop(ONE_MEGABYTE - 1024), NULL);
183707acf3c0Scherry 	ATF_CHECK_EQ(upm_first, result);
183807acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_start(upm_first),
183907acf3c0Scherry 	    uvm_physseg_get_start(result));
184007acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_end(upm_first),
184107acf3c0Scherry 	    uvm_physseg_get_end(result));
184207acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_avail_start(upm_first),
184307acf3c0Scherry 	    uvm_physseg_get_avail_start(result));
184407acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_avail_end(upm_first),
184507acf3c0Scherry 	    uvm_physseg_get_avail_end(result));
184607acf3c0Scherry 
184707acf3c0Scherry 	ATF_REQUIRE_EQ((psize_t) -1, offset);
184807acf3c0Scherry 
184907acf3c0Scherry 	/* This test will be triggered only if there are 2 or more segments. */
185007acf3c0Scherry #if VM_PHYSSEG_MAX > 1
185107acf3c0Scherry 	/* Over ONE_MEGABYTE is segment upm_second */
185207acf3c0Scherry 	result = uvm_physseg_find(atop(ONE_MEGABYTE + 8192), &offset);
185307acf3c0Scherry 	ATF_CHECK_EQ(upm_second, result);
185407acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_start(upm_second),
185507acf3c0Scherry 	    uvm_physseg_get_start(result));
185607acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_end(upm_second),
185707acf3c0Scherry 	    uvm_physseg_get_end(result));
185807acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_avail_start(upm_second),
185907acf3c0Scherry 	    uvm_physseg_get_avail_start(result));
186007acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_avail_end(upm_second),
186107acf3c0Scherry 	    uvm_physseg_get_avail_end(result));
186207acf3c0Scherry 
186307acf3c0Scherry 	/* Offset is calculated based on PAGE_SIZE */
186407acf3c0Scherry 	/* atop(ONE_MEGABYTE + (2 * PAGE_SIZE)) - VALID_START_PFN1  = 2 */
186507acf3c0Scherry 	ATF_CHECK_EQ(2, offset);
186607acf3c0Scherry #else
186707acf3c0Scherry 	/* Under ONE_MEGABYTE is segment upm_first */
186807acf3c0Scherry 	result = uvm_physseg_find(atop(ONE_MEGABYTE - 12288), &offset);
186907acf3c0Scherry 	ATF_CHECK_EQ(upm_first, result);
187007acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_start(upm_first),
187107acf3c0Scherry 	    uvm_physseg_get_start(result));
187207acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_end(upm_first),
187307acf3c0Scherry 	    uvm_physseg_get_end(result));
187407acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_avail_start(upm_first),
187507acf3c0Scherry 	    uvm_physseg_get_avail_start(result));
187607acf3c0Scherry 	ATF_CHECK_EQ(uvm_physseg_get_avail_end(upm_first),
187707acf3c0Scherry 	    uvm_physseg_get_avail_end(result));
187807acf3c0Scherry 
187907acf3c0Scherry 	/* Offset is calculated based on PAGE_SIZE */
188007acf3c0Scherry 	/* atop(ONE_MEGABYTE - (3 * PAGE_SIZE)) - VALID_START_PFN1  = 253 */
188107acf3c0Scherry 	ATF_CHECK_EQ(253, offset);
188207acf3c0Scherry #endif
188307acf3c0Scherry }
188407acf3c0Scherry 
188507acf3c0Scherry ATF_TC(vm_physseg_find_invalid);
ATF_TC_HEAD(vm_physseg_find_invalid,tc)188607acf3c0Scherry ATF_TC_HEAD(vm_physseg_find_invalid, tc)
188707acf3c0Scherry {
188807acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the returned segment number \
188911850c9eSandvar 	    is (paddr_t) -1  when a non-existent PFN is passed into \
189007acf3c0Scherry 	    uvm_physseg_find() call.");
189107acf3c0Scherry }
ATF_TC_BODY(vm_physseg_find_invalid,tc)189207acf3c0Scherry ATF_TC_BODY(vm_physseg_find_invalid, tc)
189307acf3c0Scherry {
189407acf3c0Scherry 	psize_t offset = (psize_t) -1;
189507acf3c0Scherry 
189607acf3c0Scherry 	setup();
189707acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
189807acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
189907acf3c0Scherry 
190007acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
190107acf3c0Scherry 
190207acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
190307acf3c0Scherry 
190407acf3c0Scherry 	/* No segments over 3 MB exists at the moment */
190507acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID,
190607acf3c0Scherry 	    uvm_physseg_find(atop(ONE_MEGABYTE * 3), NULL));
190707acf3c0Scherry 
190807acf3c0Scherry 	ATF_REQUIRE_EQ((psize_t) -1, offset);
190907acf3c0Scherry 
191007acf3c0Scherry 	/* No segments over 3 MB exists at the moment */
191107acf3c0Scherry 	ATF_CHECK_EQ(UVM_PHYSSEG_TYPE_INVALID,
191207acf3c0Scherry 	    uvm_physseg_find(atop(ONE_MEGABYTE * 3), &offset));
191307acf3c0Scherry 
191407acf3c0Scherry 	ATF_CHECK_EQ((psize_t) -1, offset);
191507acf3c0Scherry }
191607acf3c0Scherry 
191707acf3c0Scherry ATF_TC(uvm_page_physunload_start);
ATF_TC_HEAD(uvm_page_physunload_start,tc)191807acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_start, tc)
191907acf3c0Scherry {
192007acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic uvm_page_physunload()\
192107acf3c0Scherry 	    call works without a panic(). Unloads from Start of the segment.");
192207acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_start,tc)192307acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_start, tc)
192407acf3c0Scherry {
192507acf3c0Scherry 	/*
192607acf3c0Scherry 	 * Would uvmexp.npages reduce everytime an uvm_page_physunload is called?
192707acf3c0Scherry 	 */
192807acf3c0Scherry 	psize_t npages = (VALID_END_PFN_2 - VALID_START_PFN_2);
192907acf3c0Scherry 
193007acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
193107acf3c0Scherry 
193207acf3c0Scherry 	paddr_t p = 0;
193307acf3c0Scherry 
193407acf3c0Scherry 	uvm_physseg_t upm;
193507acf3c0Scherry 
193607acf3c0Scherry 	setup();
193707acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
193807acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
193907acf3c0Scherry 
194007acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
194107acf3c0Scherry 
194207acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
194307acf3c0Scherry 
194407acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
194507acf3c0Scherry 
194607acf3c0Scherry 	ATF_CHECK_EQ(true, uvm_page_physunload(upm, VM_FREELIST_DEFAULT, &p));
194707acf3c0Scherry 
194807acf3c0Scherry 	/*
194907acf3c0Scherry 	 * When called for first time, uvm_page_physload() removes the first PFN
195007acf3c0Scherry 	 *
195107acf3c0Scherry 	 * New avail start will be VALID_AVAIL_START_PFN_2 + 1
195207acf3c0Scherry 	 */
195307acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, atop(p));
195407acf3c0Scherry 
195507acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2 + 1,
195607acf3c0Scherry 	    uvm_physseg_get_avail_start(upm));
195707acf3c0Scherry 
195807acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2 + 1, uvm_physseg_get_start(upm));
195907acf3c0Scherry 
196007acf3c0Scherry 	/* Rest of the stuff should remain the same */
196107acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
196207acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2, uvm_physseg_get_avail_end(upm));
196307acf3c0Scherry }
196407acf3c0Scherry 
196507acf3c0Scherry ATF_TC(uvm_page_physunload_end);
ATF_TC_HEAD(uvm_page_physunload_end,tc)196607acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_end, tc)
196707acf3c0Scherry {
196807acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic uvm_page_physunload()\
196907acf3c0Scherry 	    call works without a panic(). Unloads from End of the segment.");
197007acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_end,tc)197107acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_end, tc)
197207acf3c0Scherry {
197307acf3c0Scherry 	/*
197407acf3c0Scherry 	 * Would uvmexp.npages reduce everytime an uvm_page_physunload is called?
197507acf3c0Scherry 	 */
197607acf3c0Scherry 	paddr_t p = 0;
197707acf3c0Scherry 
197807acf3c0Scherry 	uvm_physseg_t upm;
197907acf3c0Scherry 
198007acf3c0Scherry 	setup();
198107acf3c0Scherry 	/* Note: start != avail_start to remove from end. */
198207acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
198307acf3c0Scherry 	    VALID_AVAIL_START_PFN_2 + 1, VALID_AVAIL_END_PFN_2,
198407acf3c0Scherry 	    VM_FREELIST_DEFAULT);
198507acf3c0Scherry 
198607acf3c0Scherry 	p = 0;
198707acf3c0Scherry 
198807acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
198907acf3c0Scherry 
199007acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
199107acf3c0Scherry 
199207acf3c0Scherry 	ATF_REQUIRE(
199307acf3c0Scherry 		uvm_physseg_get_avail_start(upm) != uvm_physseg_get_start(upm));
199407acf3c0Scherry 
199507acf3c0Scherry 	ATF_CHECK_EQ(true, uvm_page_physunload(upm, VM_FREELIST_DEFAULT, &p));
199607acf3c0Scherry 
199707acf3c0Scherry 	/*
199807acf3c0Scherry 	 * Remember if X is the upper limit the actual valid pointer is X - 1
199907acf3c0Scherry 	 *
200007acf3c0Scherry 	 * For example if 256 is the upper limit for 1MB memory, last valid
200107acf3c0Scherry 	 * pointer is 256 - 1 = 255
200207acf3c0Scherry 	 */
200307acf3c0Scherry 
200407acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2 - 1, atop(p));
200507acf3c0Scherry 
200607acf3c0Scherry 	/*
200707acf3c0Scherry 	 * When called for second time, uvm_page_physload() removes the last PFN
200807acf3c0Scherry 	 *
200907acf3c0Scherry 	 * New avail end will be VALID_AVAIL_END_PFN_2 - 1
201007acf3c0Scherry 	 * New end will be VALID_AVAIL_PFN_2 - 1
201107acf3c0Scherry 	 */
201207acf3c0Scherry 
201307acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2 - 1, uvm_physseg_get_avail_end(upm));
201407acf3c0Scherry 
201507acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2 - 1, uvm_physseg_get_end(upm));
201607acf3c0Scherry 
201707acf3c0Scherry 	/* Rest of the stuff should remain the same */
201807acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2 + 1,
201907acf3c0Scherry 	    uvm_physseg_get_avail_start(upm));
202007acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
202107acf3c0Scherry }
202207acf3c0Scherry 
202307acf3c0Scherry ATF_TC(uvm_page_physunload_none);
ATF_TC_HEAD(uvm_page_physunload_none,tc)202407acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_none, tc)
202507acf3c0Scherry {
202607acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic uvm_page_physunload()\
202707acf3c0Scherry 	    call works without a panic(). Does not unload from start or end \
202807acf3c0Scherry 	    because of non-aligned start / avail_start and end / avail_end \
202907acf3c0Scherry 	    respectively.");
203007acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_none,tc)203107acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_none, tc)
203207acf3c0Scherry {
203307acf3c0Scherry 	psize_t npages = (VALID_END_PFN_2 - VALID_START_PFN_2);
203407acf3c0Scherry 
203507acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
203607acf3c0Scherry 
203707acf3c0Scherry 	paddr_t p = 0;
203807acf3c0Scherry 
203907acf3c0Scherry 	uvm_physseg_t upm;
204007acf3c0Scherry 
204107acf3c0Scherry 	setup();
204207acf3c0Scherry 	/*
204307acf3c0Scherry 	 * Note: start != avail_start and end != avail_end.
204407acf3c0Scherry 	 *
204532cded6cSdholland 	 * This prevents any unload from occurring.
204607acf3c0Scherry 	 */
204707acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
204807acf3c0Scherry 	    VALID_AVAIL_START_PFN_2 + 1, VALID_AVAIL_END_PFN_2 - 1,
204907acf3c0Scherry 	    VM_FREELIST_DEFAULT);
205007acf3c0Scherry 
205107acf3c0Scherry 	p = 0;
205207acf3c0Scherry 
205307acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
205407acf3c0Scherry 
205507acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
205607acf3c0Scherry 
205707acf3c0Scherry 	ATF_REQUIRE(
205807acf3c0Scherry 		uvm_physseg_get_avail_start(upm) != uvm_physseg_get_start(upm));
205907acf3c0Scherry 
206007acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
206107acf3c0Scherry 
206207acf3c0Scherry 	ATF_CHECK_EQ(false, uvm_page_physunload(upm, VM_FREELIST_DEFAULT, &p));
206307acf3c0Scherry 
206407acf3c0Scherry 	/* uvm_page_physload() will no longer unload memory */
206507acf3c0Scherry 	ATF_CHECK_EQ(0, p);
206607acf3c0Scherry 
206707acf3c0Scherry 	/* Rest of the stuff should remain the same */
206807acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2 + 1,
206907acf3c0Scherry 	    uvm_physseg_get_avail_start(upm));
207007acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2 - 1,
207107acf3c0Scherry 	    uvm_physseg_get_avail_end(upm));
207207acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
207307acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
207407acf3c0Scherry }
207507acf3c0Scherry 
207607acf3c0Scherry ATF_TC(uvm_page_physunload_delete_start);
ATF_TC_HEAD(uvm_page_physunload_delete_start,tc)207707acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_delete_start, tc)
207807acf3c0Scherry {
207907acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the  uvm_page_physunload() \
208007acf3c0Scherry 	    works when the segment gets small enough to be deleted scenario. \
208107acf3c0Scherry 	    NOTE: This one works deletes from start.");
208207acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_delete_start,tc)208307acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_delete_start, tc)
208407acf3c0Scherry {
208507acf3c0Scherry 	/*
208607acf3c0Scherry 	 * Would uvmexp.npages reduce everytime an uvm_page_physunload is called?
208707acf3c0Scherry 	 */
208807acf3c0Scherry 	paddr_t p = 0;
208907acf3c0Scherry 
209007acf3c0Scherry 	uvm_physseg_t upm;
209107acf3c0Scherry 
209207acf3c0Scherry 	setup();
209307acf3c0Scherry 
209407acf3c0Scherry 	/*
209507acf3c0Scherry 	 * Setup the Nuke from Starting point
209607acf3c0Scherry 	 */
209707acf3c0Scherry 
209807acf3c0Scherry 	upm = uvm_page_physload(VALID_END_PFN_1 - 1, VALID_END_PFN_1,
209907acf3c0Scherry 	    VALID_AVAIL_END_PFN_1 - 1, VALID_AVAIL_END_PFN_1,
210007acf3c0Scherry 	    VM_FREELIST_DEFAULT);
210107acf3c0Scherry 
210207acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
210307acf3c0Scherry 
210407acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
210507acf3c0Scherry 
210607acf3c0Scherry 	/* Insert more than one segment iff VM_PHYSSEG_MAX > 1 */
210707acf3c0Scherry #if VM_PHYSSEG_MAX > 1
210807acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
210907acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
211007acf3c0Scherry 
211107acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
211207acf3c0Scherry #endif
211307acf3c0Scherry 
211407acf3c0Scherry #if VM_PHYSSEG_MAX == 1
211507acf3c0Scherry 	atf_tc_expect_signal(SIGABRT,
211607acf3c0Scherry 	    "cannot uvm_page_physunload() the last segment");
211707acf3c0Scherry #endif
211807acf3c0Scherry 
211907acf3c0Scherry 	ATF_CHECK_EQ(true, uvm_page_physunload(upm, VM_FREELIST_DEFAULT, &p));
212007acf3c0Scherry 
212107acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_1 - 1, atop(p));
212207acf3c0Scherry 
212307acf3c0Scherry 	ATF_CHECK_EQ(1, uvm_physseg_get_entries());
212407acf3c0Scherry 
212507acf3c0Scherry 	/* The only node now is the one we inserted second. */
212607acf3c0Scherry 	upm = uvm_physseg_get_first();
212707acf3c0Scherry 
212807acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
212907acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
213007acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2, uvm_physseg_get_avail_start(upm));
213107acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2, uvm_physseg_get_avail_end(upm));
213207acf3c0Scherry }
213307acf3c0Scherry 
213407acf3c0Scherry ATF_TC(uvm_page_physunload_delete_end);
ATF_TC_HEAD(uvm_page_physunload_delete_end,tc)213507acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_delete_end, tc)
213607acf3c0Scherry {
213707acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the  uvm_page_physunload() \
213807acf3c0Scherry 	    works when the segment gets small enough to be deleted scenario. \
213907acf3c0Scherry 	    NOTE: This one works deletes from end.");
214007acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_delete_end,tc)214107acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_delete_end, tc)
214207acf3c0Scherry {
214307acf3c0Scherry 	/*
214407acf3c0Scherry 	 * Would uvmexp.npages reduce everytime an uvm_page_physunload is called?
214507acf3c0Scherry 	 */
214607acf3c0Scherry 
214707acf3c0Scherry 	paddr_t p = 0;
214807acf3c0Scherry 
214907acf3c0Scherry 	uvm_physseg_t upm;
215007acf3c0Scherry 
215107acf3c0Scherry 	setup();
215207acf3c0Scherry 
215307acf3c0Scherry 	/*
215407acf3c0Scherry 	 * Setup the Nuke from Ending point
215507acf3c0Scherry 	 */
215607acf3c0Scherry 
215707acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_START_PFN_1 + 2,
21584bfe81d9Sfox 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_START_PFN_1 + 2,
215907acf3c0Scherry 	    VM_FREELIST_DEFAULT);
216007acf3c0Scherry 
216107acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
216207acf3c0Scherry 
216307acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
216407acf3c0Scherry 
216507acf3c0Scherry 	/* Insert more than one segment iff VM_PHYSSEG_MAX > 1 */
216607acf3c0Scherry #if VM_PHYSSEG_MAX > 1
216707acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
216807acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
216907acf3c0Scherry 
217007acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
217107acf3c0Scherry #endif
217207acf3c0Scherry 
217307acf3c0Scherry #if VM_PHYSSEG_MAX == 1
217407acf3c0Scherry 	atf_tc_expect_signal(SIGABRT,
217507acf3c0Scherry 	    "cannot uvm_page_physunload() the last segment");
217607acf3c0Scherry #endif
217707acf3c0Scherry 
217807acf3c0Scherry 	ATF_CHECK_EQ(true, uvm_page_physunload(upm, VM_FREELIST_DEFAULT, &p));
217907acf3c0Scherry 
21804bfe81d9Sfox 	ATF_CHECK_EQ(VALID_START_PFN_1, atop(p));
21814bfe81d9Sfox 
218207acf3c0Scherry 	p = 0;
218307acf3c0Scherry 
218407acf3c0Scherry 	ATF_CHECK_EQ(true, uvm_page_physunload(upm, VM_FREELIST_DEFAULT, &p));
218507acf3c0Scherry 
21864bfe81d9Sfox 	ATF_CHECK_EQ(VALID_START_PFN_1 + 1, atop(p));
218707acf3c0Scherry 
218807acf3c0Scherry 	ATF_CHECK_EQ(1, uvm_physseg_get_entries());
218907acf3c0Scherry 
219007acf3c0Scherry 	/* The only node now is the one we inserted second. */
219107acf3c0Scherry 	upm = uvm_physseg_get_first();
219207acf3c0Scherry 
219307acf3c0Scherry 	ATF_CHECK_EQ(VALID_START_PFN_2, uvm_physseg_get_start(upm));
219407acf3c0Scherry 	ATF_CHECK_EQ(VALID_END_PFN_2, uvm_physseg_get_end(upm));
219507acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_START_PFN_2, uvm_physseg_get_avail_start(upm));
219607acf3c0Scherry 	ATF_CHECK_EQ(VALID_AVAIL_END_PFN_2, uvm_physseg_get_avail_end(upm));
219707acf3c0Scherry }
219807acf3c0Scherry 
219907acf3c0Scherry ATF_TC(uvm_page_physunload_invalid);
ATF_TC_HEAD(uvm_page_physunload_invalid,tc)220007acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_invalid, tc)
220107acf3c0Scherry {
220207acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the  uvm_page_physunload() \
220307acf3c0Scherry 	    fails when then Free list does not match.");
220407acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_invalid,tc)220507acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_invalid, tc)
220607acf3c0Scherry {
220707acf3c0Scherry 	psize_t npages = (VALID_END_PFN_2 - VALID_START_PFN_2);
220807acf3c0Scherry 
220907acf3c0Scherry 	struct vm_page *pgs = malloc(sizeof(struct vm_page) * npages);
221007acf3c0Scherry 
221107acf3c0Scherry 	paddr_t p = 0;
221207acf3c0Scherry 
221307acf3c0Scherry 	uvm_physseg_t upm;
221407acf3c0Scherry 
221507acf3c0Scherry 	setup();
221607acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
221707acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
221807acf3c0Scherry 
221907acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
222007acf3c0Scherry 
222107acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
222207acf3c0Scherry 
222307acf3c0Scherry 	uvm_physseg_init_seg(upm, pgs);
222407acf3c0Scherry 
222507acf3c0Scherry 	ATF_CHECK_EQ(false, uvm_page_physunload(upm, VM_FREELIST_FIRST4G, &p));
222607acf3c0Scherry }
222707acf3c0Scherry 
222807acf3c0Scherry ATF_TC(uvm_page_physunload_force);
ATF_TC_HEAD(uvm_page_physunload_force,tc)222907acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_force, tc)
223007acf3c0Scherry {
223107acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the basic \
223207acf3c0Scherry 	    uvm_page_physunload_force() including delete works without.");
223307acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_force,tc)223407acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_force, tc)
223507acf3c0Scherry {
223607acf3c0Scherry 	/*
223707acf3c0Scherry 	 * Would uvmexp.npages reduce everytime an uvm_page_physunload is called?
223807acf3c0Scherry 	 */
223907acf3c0Scherry 	paddr_t p = 0;
224007acf3c0Scherry 
224107acf3c0Scherry 	uvm_physseg_t upm;
224207acf3c0Scherry 
224307acf3c0Scherry 	setup();
224407acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_1, VALID_END_PFN_1,
224507acf3c0Scherry 	    VALID_AVAIL_START_PFN_1, VALID_AVAIL_END_PFN_1, VM_FREELIST_DEFAULT);
224607acf3c0Scherry 
224707acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
224807acf3c0Scherry 
224907acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
225007acf3c0Scherry 
225107acf3c0Scherry 	/* Insert more than one segment iff VM_PHYSSEG_MAX > 1 */
225207acf3c0Scherry #if VM_PHYSSEG_MAX > 1
225307acf3c0Scherry 	/*
22546e3ee785Sandvar 	 * We have couple of physloads done this is because of the fact that if
225507acf3c0Scherry 	 * we physunload all the PFs from a given range and we have only one
225607acf3c0Scherry 	 * segment in total a panic() is called
225707acf3c0Scherry 	 */
225807acf3c0Scherry 	uvm_page_physload(VALID_START_PFN_2, VALID_END_PFN_2,
225907acf3c0Scherry 	    VALID_AVAIL_START_PFN_2, VALID_AVAIL_END_PFN_2, VM_FREELIST_DEFAULT);
226007acf3c0Scherry 
226107acf3c0Scherry 	ATF_REQUIRE_EQ(2, uvm_physseg_get_entries());
226207acf3c0Scherry #endif
226307acf3c0Scherry 
226407acf3c0Scherry #if VM_PHYSSEG_MAX == 1
226507acf3c0Scherry 	atf_tc_expect_signal(SIGABRT,
226607acf3c0Scherry 	    "cannot uvm_page_physunload() the last segment");
226707acf3c0Scherry #endif
226807acf3c0Scherry 
226907acf3c0Scherry 	ATF_REQUIRE_EQ(VALID_AVAIL_START_PFN_1,
227007acf3c0Scherry 	    uvm_physseg_get_avail_start(upm));
227107acf3c0Scherry 
227207acf3c0Scherry 	for(paddr_t i = VALID_AVAIL_START_PFN_1;
227307acf3c0Scherry 	    i < VALID_AVAIL_END_PFN_1; i++) {
227407acf3c0Scherry 		ATF_CHECK_EQ(true,
227507acf3c0Scherry 		    uvm_page_physunload_force(upm, VM_FREELIST_DEFAULT, &p));
227607acf3c0Scherry 		ATF_CHECK_EQ(i, atop(p));
227707acf3c0Scherry 
227807acf3c0Scherry 		if(i + 1 < VALID_AVAIL_END_PFN_1)
227907acf3c0Scherry 			ATF_CHECK_EQ(i + 1, uvm_physseg_get_avail_start(upm));
228007acf3c0Scherry 	}
228107acf3c0Scherry 
228207acf3c0Scherry 	/*
228307acf3c0Scherry 	 * Now we try to retrieve the segment, which has been removed
228407acf3c0Scherry 	 * from the system through force unloading all the pages inside it.
228507acf3c0Scherry 	 */
228607acf3c0Scherry 	upm = uvm_physseg_find(VALID_AVAIL_END_PFN_1 - 1, NULL);
228707acf3c0Scherry 
228807acf3c0Scherry 	/* It should no longer exist */
2289a85205fcSfox #if defined(UVM_HOTPLUG)
229007acf3c0Scherry 	ATF_CHECK_EQ(NULL, upm);
2291a85205fcSfox #else
2292a85205fcSfox 	ATF_CHECK_EQ(-1, upm);
2293a85205fcSfox #endif
229407acf3c0Scherry 
229507acf3c0Scherry 	ATF_CHECK_EQ(1, uvm_physseg_get_entries());
229607acf3c0Scherry }
229707acf3c0Scherry 
229807acf3c0Scherry ATF_TC(uvm_page_physunload_force_invalid);
ATF_TC_HEAD(uvm_page_physunload_force_invalid,tc)229907acf3c0Scherry ATF_TC_HEAD(uvm_page_physunload_force_invalid, tc)
230007acf3c0Scherry {
230107acf3c0Scherry 	atf_tc_set_md_var(tc, "descr", "Tests if the invalid conditions for \
230207acf3c0Scherry 	    uvm_page_physunload_force_invalid().");
230307acf3c0Scherry }
ATF_TC_BODY(uvm_page_physunload_force_invalid,tc)230407acf3c0Scherry ATF_TC_BODY(uvm_page_physunload_force_invalid, tc)
230507acf3c0Scherry {
230607acf3c0Scherry 	paddr_t p = 0;
230707acf3c0Scherry 
230807acf3c0Scherry 	uvm_physseg_t upm;
230907acf3c0Scherry 
231007acf3c0Scherry 	setup();
231107acf3c0Scherry 	upm = uvm_page_physload(VALID_START_PFN_2, VALID_START_PFN_2+ 1,
231207acf3c0Scherry 	    VALID_START_PFN_2, VALID_START_PFN_2, VM_FREELIST_DEFAULT);
231307acf3c0Scherry 
231407acf3c0Scherry 	ATF_REQUIRE_EQ(1, uvm_physseg_get_entries());
231507acf3c0Scherry 
231607acf3c0Scherry 	ATF_REQUIRE_EQ(0, uvmexp.npages);
231707acf3c0Scherry 
231807acf3c0Scherry 	ATF_CHECK_EQ(false,
231907acf3c0Scherry 	    uvm_page_physunload_force(upm, VM_FREELIST_DEFAULT, &p));
232007acf3c0Scherry 
232107acf3c0Scherry 	ATF_CHECK_EQ(0, p);
232207acf3c0Scherry }
232307acf3c0Scherry 
ATF_TP_ADD_TCS(tp)232407acf3c0Scherry ATF_TP_ADD_TCS(tp)
232507acf3c0Scherry {
232607acf3c0Scherry #if defined(UVM_HOTPLUG)
232707acf3c0Scherry 	/* Internal */
232807acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_alloc_atboot_mismatch);
232907acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_alloc_atboot_overrun);
233007acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_alloc_sanity);
233107acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_free_atboot_mismatch);
233207acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_free_sanity);
233307acf3c0Scherry #if VM_PHYSSEG_MAX > 1
233407acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_atboot_free_leak);
233507acf3c0Scherry #endif
233607acf3c0Scherry #endif /* UVM_HOTPLUG */
233707acf3c0Scherry 
233807acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_plug);
233907acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_unplug);
234007acf3c0Scherry 
234107acf3c0Scherry 	/* Exported */
234207acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_init);
234307acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physload_preload);
234407acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physload_postboot);
234507acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_handle_immutable);
234607acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_seg_chomp_slab);
234707acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_alloc_from_slab);
234807acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_init_seg);
234907acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_start);
235007acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_start_invalid);
235107acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_end);
235207acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_end_invalid);
235307acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_avail_start);
235407acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_avail_start_invalid);
235507acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_avail_end);
235607acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_avail_end_invalid);
235707acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_next);
235807acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_next_invalid);
235907acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_prev);
236007acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_prev_invalid);
236107acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_first);
236207acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_last);
236307acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_valid);
236407acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_valid_invalid);
236507acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_highest);
236607acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_free_list);
236707acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_start_hint);
236807acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_set_start_hint);
236907acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_set_start_hint_invalid);
237007acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_pg);
237107acf3c0Scherry 
237207acf3c0Scherry #ifdef __HAVE_PMAP_PHYSSEG
237307acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_physseg_get_pmseg);
237407acf3c0Scherry #endif
237507acf3c0Scherry 	ATF_TP_ADD_TC(tp, vm_physseg_find);
237607acf3c0Scherry 	ATF_TP_ADD_TC(tp, vm_physseg_find_invalid);
237707acf3c0Scherry 
237807acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_start);
237907acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_end);
238007acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_none);
238107acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_delete_start);
238207acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_delete_end);
238307acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_invalid);
238407acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_force);
238507acf3c0Scherry 	ATF_TP_ADD_TC(tp, uvm_page_physunload_force_invalid);
238607acf3c0Scherry 
238707acf3c0Scherry 	return atf_no_error();
238807acf3c0Scherry }
2389