jehanne/sys/src/kern/port/umem/test.c

140 lines
3.9 KiB
C

/*
* This file is part of Jehanne.
*
* Copyright (C) 2016 Giacomo Tesio <giacomo@tesio.it>
*
* Jehanne is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 2 of the License.
*
* Jehanne is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jehanne. If not, see <http://www.gnu.org/licenses/>.
*/
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "../port/umem/internals.h"
int enable_umem_tests_panics = 0;
void
umem_test_virtual_pages(void)
{
PagePointer page = 0;
PagePointer tmp, neverAgain;
uintptr_t pagepa, tmppa;
if(!page_new(&page, 1))
panic("page_new: failed 1");
if(page == 0)
panic("page_new: failed 2");
tmp = page;
if(!page_dispose(&page))
panic("page_dispose: failed 1");
if(page != 0)
panic("page_dispose: failed 2");
if(!page_new(&page, 1))
panic("page_new: failed 1");
if(page != tmp)
panic("page_new: ignoring free page");
tmp = 0;
if(!page_new(&tmp, 0))
panic("page_new: failed 3");
if(tmp == page)
panic("page_new: active page reused");
neverAgain = tmp;
if(!page_dispose(&tmp))
panic("page_dispose: failed 3");
if(tmp != 0)
panic("page_dispose: failed 4");
if(!page_assign(&tmp, page))
panic("page_assign: failed 1");
if(tmp != page)
panic("page_assign: failed 2");
pagepa = page_pa(page);
tmppa = page_pa(tmp);
if(pagepa != tmppa)
panic("page_assign: failed 2");
if(!page_dispose(&tmp))
panic("page_dispose: failed 5");
if(tmp != 0)
panic("page_dispose: failed 6");
/* now page ref count should be 1 */
pagepa = page_pa(page);
if(pagepa != tmppa)
panic("page_pa: failed 1");
if(enable_umem_tests_panics){
page_pa(neverAgain);
page_dispose(&neverAgain);
}
}
void
umem_test_raw_memory(void)
{
char* name;
uintptr_t pa;
unsigned int attr;
usize size;
PagePointer page = 0;
rawmem_register("vesascreen", 0xfc000000, SgPhysical, 0x1000000/PGSZ);
if(!rawmem_lookup(0xfc000000, &name, &pa, &attr, &size, &page))
panic("rawmem_lookup: failed 1");
if(jehanne_strcmp(name, "vesascreen") != 0)
panic("rawmem_lookup: failed 2");
if(pa != 0xfc000000)
panic("rawmem_lookup: failed 3");
if(attr != SgPhysical)
panic("rawmem_lookup: failed 4");
if(size != 0x1000000/PGSZ)
panic("rawmem_lookup: failed 5");
if(page == 0)
panic("rawmem_lookup: failed 6");
if(page_pa(page) != 0xfc000000)
panic("rawmem_lookup: failed 7");
if(page_pa(page+1) != 0xfc001000)
panic("rawmem_lookup: failed 8");
}
void
print_type_sizes(void)
{
jehanne_print("sizeof UserPage %d bytes\n", sizeof(UserPage));
jehanne_print("sizeof PageTableEntry %d bytes\n", sizeof(PageTableEntry));
jehanne_print("sizeof PageTable %d bytes\n", sizeof(PageTable));
jehanne_print("sizeof ElfSegment %d bytes\n", sizeof(ElfSegment));
jehanne_print("sizeof ElfImage %d bytes\n", sizeof(ElfImage));
jehanne_print("sizeof ProcSegment %d bytes\n", sizeof(ProcSegment));
jehanne_print("sizeof RawMemory %d bytes\n", sizeof(RawMemory));
print("---\n");
jehanne_print("sizeof Page %d bytes\n", sizeof(Page));
jehanne_print("sizeof Pte %d bytes\n", sizeof(Pte));
jehanne_print("sizeof Pages %d bytes\n", sizeof(Pages));
jehanne_print("sizeof Section %d bytes\n", sizeof(Section));
jehanne_print("sizeof Image %d bytes\n", sizeof(Image));
jehanne_print("sizeof Segment %d bytes\n", sizeof(Segment));
jehanne_print("sizeof Physseg %d bytes\n", sizeof(Physseg));
print("---\n");
jehanne_print("sizeof Proc %d bytes\n", sizeof(Proc));
}
void
umem_test(void)
{
print_type_sizes();
umem_test_virtual_pages();
umem_test_raw_memory();
}