diff options
author | 2017-04-25 03:31:15 -0700 | |
---|---|---|
committer | 2017-05-22 06:48:08 +0000 | |
commit | bb756eebdac6fd24e8919e2c43f7d2c8c4091f59 (patch) | |
tree | ca11e03542edf2d8f631efeca5e1626d211107e3 /qemu/roms/openbios/arch/sparc64/lib.c | |
parent | a14b48d18a9ed03ec191cf16b162206998a895ce (diff) |
Adding qemu as a submodule of KVMFORNFV
This Patch includes the changes to add qemu as a submodule to
kvmfornfv repo and make use of the updated latest qemu for the
execution of all testcase
Change-Id: I1280af507a857675c7f81d30c95255635667bdd7
Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Diffstat (limited to 'qemu/roms/openbios/arch/sparc64/lib.c')
-rw-r--r-- | qemu/roms/openbios/arch/sparc64/lib.c | 508 |
1 files changed, 0 insertions, 508 deletions
diff --git a/qemu/roms/openbios/arch/sparc64/lib.c b/qemu/roms/openbios/arch/sparc64/lib.c deleted file mode 100644 index 4709ca8fe..000000000 --- a/qemu/roms/openbios/arch/sparc64/lib.c +++ /dev/null @@ -1,508 +0,0 @@ -/* lib.c - * tag: simple function library - * - * Copyright (C) 2003 Stefan Reinauer - * - * See the file "COPYING" for further information about - * the copyright and warranty status of this work. - */ - -#include "config.h" -#include "libc/vsprintf.h" -#include "libopenbios/bindings.h" -#include "spitfire.h" -#include "libopenbios/sys_info.h" -#include "boot.h" - -#include "arch/sparc64/ofmem_sparc64.h" - -/* Format a string and print it on the screen, just like the libc - * function printf. - */ -int printk( const char *fmt, ... ) -{ - char *p, buf[512]; - va_list args; - int i; - - va_start(args, fmt); - i = vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - - for( p=buf; *p; p++ ) - putchar(*p); - return i; -} - -/* Private functions for mapping between physical/virtual addresses */ -phys_addr_t -va2pa(unsigned long va) -{ - if ((va >= (unsigned long)&_start) && - (va < (unsigned long)&_end)) - return va - va_shift; - else - return va; -} - -unsigned long -pa2va(phys_addr_t pa) -{ - if ((pa + va_shift >= (unsigned long)&_start) && - (pa + va_shift < (unsigned long)&_end)) - return pa + va_shift; - else - return pa; -} - -void *malloc(int size) -{ - return ofmem_malloc(size); -} - -void* realloc( void *ptr, size_t size ) -{ - return ofmem_realloc(ptr, size); -} - -void free(void *ptr) -{ - ofmem_free(ptr); -} - -static void -mmu_open(void) -{ - RET(-1); -} - -static void -mmu_close(void) -{ -} - -void ofmem_walk_boot_map(translation_entry_cb cb) -{ - unsigned long phys, virt, size, mode, data, mask; - unsigned int i; - - for (i = 0; i < 64; i++) { - data = spitfire_get_dtlb_data(i); - if (data & SPITFIRE_TTE_VALID) { - switch ((data >> 61) & 3) { - default: - case 0x0: /* 8k */ - mask = 0xffffffffffffe000ULL; - size = PAGE_SIZE_8K; - break; - case 0x1: /* 64k */ - mask = 0xffffffffffff0000ULL; - size = PAGE_SIZE_64K; - break; - case 0x2: /* 512k */ - mask = 0xfffffffffff80000ULL; - size = PAGE_SIZE_512K; - break; - case 0x3: /* 4M */ - mask = 0xffffffffffc00000ULL; - size = PAGE_SIZE_4M; - break; - } - - virt = spitfire_get_dtlb_tag(i); - virt &= mask; - - /* extract 41bit physical address */ - phys = data & 0x000001fffffff000ULL; - phys &= mask; - - mode = data & 0xfff; - - cb(phys, virt, size, mode); - } - } -} - -/* - 3.6.5 translate - ( virt -- false | phys.lo ... phys.hi mode true ) -*/ -static void -mmu_translate(void) -{ - ucell virt, mode; - phys_addr_t phys; - - virt = POP(); - - phys = ofmem_translate(virt, &mode); - - if (phys != -1UL) { - PUSH(phys & 0xffffffff); - PUSH(phys >> 32); - PUSH(mode); - PUSH(-1); - } - else { - PUSH(0); - } -} - -/* - * D5.3 pgmap@ ( va -- tte ) - */ -static void -pgmap_fetch(void) -{ - unsigned long va, tte_data; - - va = POP(); - - tte_data = find_tte(va); - if (tte_data == -1) - goto error; - - /* return tte_data */ - PUSH(tte_data); - return; - -error: - /* If we get here, there was no entry */ - PUSH(0); -} - -/* - ( index tte_data vaddr -- ? ) -*/ -static void -dtlb_load(void) -{ - unsigned long vaddr, tte_data, idx; - - vaddr = POP(); - tte_data = POP(); - idx = POP(); - dtlb_load3(vaddr, tte_data, idx); -} - -/* MMU D-TLB miss handler */ -void -dtlb_miss_handler(void) -{ - unsigned long faultva, tte_data = 0; - - /* Grab fault address from MMU and round to nearest 8k page */ - faultva = dtlb_faultva(); - faultva >>= 13; - faultva <<= 13; - - /* If a valid va>tte-data routine has been set, invoke that Forth xt instead */ - if (va2ttedata && *va2ttedata != 0) { - - /* va>tte-data ( addr cnum -- false | tte-data true ) */ - PUSH(faultva); - PUSH(0); - enterforth(*va2ttedata); - - /* Check the result first... */ - tte_data = POP(); - if (!tte_data) { - bug(); - } else { - /* Grab the real data */ - tte_data = POP(); - } - } else { - /* Search the ofmem linked list for this virtual address */ - tte_data = find_tte(faultva); - } - - if (tte_data) { - /* Update MMU */ - dtlb_load2(faultva, tte_data); - } else { - /* If we got here, there was no translation so fail */ - bug(); - } - -} - -/* - ( index tte_data vaddr -- ? ) -*/ -static void -itlb_load(void) -{ - unsigned long vaddr, tte_data, idx; - - vaddr = POP(); - tte_data = POP(); - idx = POP(); - itlb_load3(vaddr, tte_data, idx); -} - -/* MMU I-TLB miss handler */ -void -itlb_miss_handler(void) -{ - unsigned long faultva, tte_data = 0; - - /* Grab fault address from MMU and round to nearest 8k page */ - faultva = itlb_faultva(); - faultva >>= 13; - faultva <<= 13; - - /* If a valid va>tte-data routine has been set, invoke that Forth xt instead */ - if (va2ttedata && *va2ttedata != 0) { - - /* va>tte-data ( addr cnum -- false | tte-data true ) */ - PUSH(faultva); - PUSH(0); - enterforth(*va2ttedata); - - /* Check the result first... */ - tte_data = POP(); - if (!tte_data) { - bug(); - } else { - /* Grab the real data */ - tte_data = POP(); - } - } else { - /* Search the ofmem linked list for this virtual address */ - tte_data = find_tte(faultva); - } - - if (tte_data) { - /* Update MMU */ - itlb_load2(faultva, tte_data); - } else { - /* If we got here, there was no translation so fail */ - bug(); - } -} - -/* - 3.6.5 map - ( phys.lo ... phys.hi virt size mode -- ) -*/ -static void -mmu_map(void) -{ - ucell virt, size, mode; - phys_addr_t phys; - - mode = POP(); - size = POP(); - virt = POP(); - phys = POP(); - phys <<= 32; - phys |= POP(); - - ofmem_map(phys, virt, size, mode); -} - -/* - 3.6.5 unmap - ( virt size -- ) -*/ -static void -mmu_unmap(void) -{ - ucell virt, size; - - size = POP(); - virt = POP(); - ofmem_unmap(virt, size); -} - -/* - 3.6.5 claim - ( virt size align -- base ) -*/ -static void -mmu_claim(void) -{ - ucell virt=-1UL, size, align; - - align = POP(); - size = POP(); - if (!align) { - virt = POP(); - } - - virt = ofmem_claim_virt(virt, size, align); - - PUSH(virt); -} - -/* - 3.6.5 release - ( virt size -- ) -*/ -static void -mmu_release(void) -{ - ucell virt, size; - - size = POP(); - virt = POP(); - - ofmem_release_virt(virt, size); -} - -/* ( phys size align --- base ) */ -static void -mem_claim( void ) -{ - ucell size, align; - phys_addr_t phys=-1UL; - - align = POP(); - size = POP(); - if (!align) { - phys = POP(); - phys <<= 32; - phys |= POP(); - } - - phys = ofmem_claim_phys(phys, size, align); - - PUSH(phys & 0xffffffffUL); - PUSH(phys >> 32); -} - -/* ( phys size --- ) */ -static void -mem_release( void ) -{ - phys_addr_t phys; - ucell size; - - size = POP(); - phys = POP(); - phys <<= 32; - phys |= POP(); - - ofmem_release_phys(phys, size); -} - -/* ( name-cstr phys size align --- phys ) */ -static void -mem_retain ( void ) -{ - ucell size, align; - phys_addr_t phys=-1UL; - - align = POP(); - size = POP(); - if (!align) { - phys = POP(); - phys <<= 32; - phys |= POP(); - } - - /* Currently do nothing with the name */ - POP(); - - phys = ofmem_retain(phys, size, align); - - PUSH(phys & 0xffffffffUL); - PUSH(phys >> 32); -} - -/* ( virt size align -- baseaddr|-1 ) */ -static void -ciface_claim( void ) -{ - ucell align = POP(); - ucell size = POP(); - ucell virt = POP(); - ucell ret = ofmem_claim( virt, size, align ); - - /* printk("ciface_claim: %08x %08x %x\n", virt, size, align ); */ - PUSH( ret ); -} - -/* ( virt size -- ) */ -static void -ciface_release( void ) -{ - ucell size = POP(); - ucell virt = POP(); - ofmem_release(virt, size); -} - -DECLARE_NODE(memory, INSTALL_OPEN, 0, "/memory"); - -NODE_METHODS( memory ) = { - { "claim", mem_claim }, - { "release", mem_release }, - { "SUNW,retain", mem_retain }, -}; - -DECLARE_NODE(mmu, INSTALL_OPEN, 0, "/virtual-memory"); - -NODE_METHODS(mmu) = { - { "open", mmu_open }, - { "close", mmu_close }, - { "translate", mmu_translate }, - { "SUNW,dtlb-load", dtlb_load }, - { "SUNW,itlb-load", itlb_load }, - { "map", mmu_map }, - { "unmap", mmu_unmap }, - { "claim", mmu_claim }, - { "release", mmu_release }, -}; - -void ob_mmu_init(const char *cpuname, uint64_t ram_size) -{ - /* memory node */ - REGISTER_NODE(memory); - - /* MMU node */ - REGISTER_NODE(mmu); - - ofmem_register(find_dev("/memory"), find_dev("/virtual-memory")); - - push_str("/chosen"); - fword("find-device"); - - push_str("/virtual-memory"); - fword("open-dev"); - fword("encode-int"); - push_str("mmu"); - fword("property"); - - push_str("/memory"); - fword("find-device"); - - /* All memory: 0 to RAM_size */ - PUSH(0); - fword("encode-int"); - PUSH(0); - fword("encode-int"); - fword("encode+"); - PUSH((int)(ram_size >> 32)); - fword("encode-int"); - fword("encode+"); - PUSH((int)(ram_size & 0xffffffff)); - fword("encode-int"); - fword("encode+"); - push_str("reg"); - fword("property"); - - push_str("/openprom/client-services"); - fword("find-device"); - bind_func("cif-claim", ciface_claim); - bind_func("cif-release", ciface_release); - - /* Other MMU functions */ - PUSH(0); - fword("active-package!"); - bind_func("pgmap@", pgmap_fetch); - - /* Find address of va2ttedata defer word contents for MMU miss handlers */ - va2ttedata = (ucell *)findword("va>tte-data"); - va2ttedata++; -} |