Date: Tue, 03 Aug 2010 12:23:13 -0500 From: Mark Tinguely <marktinguely@gmail.com> To: freebsd-arm@freebsd.org Subject: SheevaPlug boot test Message-ID: <4C585081.7010601@gmail.com>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------060800010109010900000306 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit If someone has a SheevaPlug and a few minutes to add the following patch to the sys/arm/mv/mv_machdep.c and boot. I am interested in the "p1 =" and "p2 =" messages that will be at the top of the boot. This a test that maps a physical page with cache enabled to 2 sequential virtual addresses and does some write/cache/read operations. The virtual addresses used for the test are just above the high vector and should not be used for any devices. I am trying to prove to myself whether the sheeva has a PIPT or VIPT level 2 cache. I think I have a good idea where the Sheeva can create some cache coherency problems related to the level 2 cache. If the Sheeva uses a PIPT level 2 cache, it is very easy to fix. If the Sheeva uses VIPT level 2 cache, then there will be 2 problems to fix. Thank-you in advance, Mark Tinguely --------------060800010109010900000306 Content-Type: text/plain; name="test_l2cache" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="test_l2cache" Index: mv_machdep.c =================================================================== --- mv_machdep.c (revision 210732) +++ mv_machdep.c (working copy) @@ -137,6 +137,7 @@ vm_paddr_t dump_avail[4]; vm_offset_t physical_pages; vm_offset_t pmap_bootstrap_lastaddr; +struct pv_addr testpage; const struct pmap_devmap *pmap_devmap_bootstrap_table; struct pv_addr systempage; struct pv_addr msgbufpv; @@ -417,6 +418,7 @@ initarm(void *mdp, void *unused __unused) * and can be shared by all processes. */ valloc_pages(systempage, 1); + valloc_pages(testpage, 1); /* Allocate dynamic per-cpu area. */ valloc_pages(dpcpu, DPCPU_SIZE / PAGE_SIZE); @@ -477,6 +479,11 @@ initarm(void *mdp, void *unused __unused) pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH, systempage.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH + 0x2000, testpage.pv_pa, + VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH + 0x3000, testpage.pv_pa, + VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); + /* Map pmap_devmap[] entries */ if (platform_devmap_init() != 0) while (1); @@ -587,6 +594,36 @@ initarm(void *mdp, void *unused __unused) init_param1(); init_param2(physmem); kdb_init(); + +#define P1ADDR (ARM_VECTORS_HIGH + 0x3000) +#define P2ADDR (ARM_VECTORS_HIGH + 0x2000) + cpu_idcache_wbinv_all(); + p1 = (int *) P1ADDR; + p2 = (int *) P2ADDR; + *p1 = 0; + cpu_dcache_wbinv_range(P1ADDR, 4096); + cpu_l2cache_wbinv_range(P1ADDR, 4096); + cpu_dcache_inv_range(P2ADDR, 4096); + cpu_l2cache_inv_range(P2ADDR, 4096); + printf("p2 = 0x%08x (0 RAM)\n", *p2); + *p1 = 0xa5a5aa55; /* remove l1, try leaving in l2 */ + cpu_dcache_wbinv_range(P1ADDR, 4096); + printf("p2 = 0x%08x (0xa5a5aa55 pi or 0 vi)\n", *p2); + *p2 = 0x5a5a55aa; /* remove l1, try leavin in l1 of address 2 */ + cpu_dcache_wbinv_range(P2ADDR, 4096); + printf("p1 = 0x%08x (0x5a5a55aa pi or 0xa5a5aa55 vi)\n", *p1); + cpu_dcache_inv_range(P1ADDR, 4096); + cpu_l2cache_inv_range(P1ADDR, 4096); + printf("p1 = 0x%08x (ram)\n", *p1); + cpu_dcache_inv_range(P1ADDR, 4096); + cpu_l2cache_inv_range(P1ADDR, 4096); + cpu_l2cache_wbinv_range(P2ADDR, 4096); + printf("p1 = 0x%08x (ram after a2 wb)\n", *p1); + *p1 = 0; + cpu_dcache_wbinv_range(P1ADDR, 4096); + cpu_l2cache_wbinv_range(P1ADDR, 4096); + cpu_dcache_inv_range(P2ADDR, 4096); + cpu_l2cache_inv_range(P2ADDR, 4096); return ((void *)(kernelstack.pv_va + USPACE_SVC_STACK_TOP - sizeof(struct pcb))); } --------------060800010109010900000306--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4C585081.7010601>