Author: blueswirl Date: 2009-08-02 13:05:00 +0200 (Sun, 02 Aug 2009) New Revision: 524
Modified: trunk/openbios-devel/arch/ppc/ofmem.c trunk/openbios-devel/arch/ppc/qemu/ofmem.c Log: unify ppc ofmem implementations (Igor Kovalenko)
Modified: trunk/openbios-devel/arch/ppc/ofmem.c =================================================================== --- trunk/openbios-devel/arch/ppc/ofmem.c 2009-08-02 11:04:27 UTC (rev 523) +++ trunk/openbios-devel/arch/ppc/ofmem.c 2009-08-02 11:05:00 UTC (rev 524) @@ -88,7 +88,7 @@ ucell mode; } translation_t;
-static struct { +typedef struct { char *next_malloc; alloc_desc_t *mfree; /* list of free malloc blocks */
@@ -96,9 +96,31 @@ range_t *virt_range;
translation_t *trans; /* this is really a translation_t */ -} ofmem; +} ofmem_t;
+static ofmem_t s_ofmem;
+#define IO_BASE 0x80000000 +#define OFMEM (&s_ofmem) + +static inline ulong +get_hash_base( void ) +{ + return HASH_BASE; +} + +static inline ulong +get_hash_size( void ) +{ + return HASH_SIZE; +} + +ulong +get_ram_size( void ) +{ + return RAMSIZE; +} + /************************************************************************/ /* OF private allocations */ /************************************************************************/ @@ -106,21 +128,23 @@ void * malloc( int size ) { + ofmem_t *ofmem = OFMEM; alloc_desc_t *d, **pp; char *ret; + ulong top;
if( !size ) return NULL;
- if( !ofmem.next_malloc ) - ofmem.next_malloc = (char*)OF_MALLOC_BASE; + if( !ofmem->next_malloc ) + ofmem->next_malloc = (char*)OF_MALLOC_BASE;
if( size & 3 ) size += 4 - (size & 3); size += sizeof(alloc_desc_t);
/* look in the freelist */ - for( pp=&ofmem.mfree; *pp && (**pp).size < size; pp = &(**pp).next ) + for( pp=&ofmem->mfree; *pp && (**pp).size < size; pp = &(**pp).next ) ;
/* waste at most 4K by taking an entry from the freelist */ @@ -131,24 +155,28 @@ return ret; }
- if( (ulong)ofmem.next_malloc + size > HASH_BASE ) { + top = HASH_BASE; + if( (ulong)ofmem->next_malloc + size > top ) { printk("out of malloc memory (%x)!\n", size ); return NULL; } - d = (alloc_desc_t*) ofmem.next_malloc; - ofmem.next_malloc += size;
+ d = (alloc_desc_t*) ofmem->next_malloc; + ofmem->next_malloc += size; + d->next = NULL; d->size = size;
ret = (char*)d + sizeof(alloc_desc_t); memset( ret, 0, size - sizeof(alloc_desc_t) ); + return ret; }
void free( void *ptr ) { + ofmem_t *ofmem = OFMEM; alloc_desc_t **pp, *d;
/* it is legal to free NULL pointers (size zero allocations) */ @@ -156,10 +184,10 @@ return;
d = (alloc_desc_t*)((char *)ptr - sizeof(alloc_desc_t)); - d->next = ofmem.mfree; + d->next = ofmem->mfree;
/* insert in the (sorted) freelist */ - for( pp=&ofmem.mfree; *pp && (**pp).size < d->size ; pp = &(**pp).next ) + for( pp=&ofmem->mfree; *pp && (**pp).size < d->size ; pp = &(**pp).next ) ; d->next = *pp; *pp = d; @@ -231,7 +259,7 @@ def_memmode( ucell phys ) { /* XXX: Guard bit not set as it should! */ - if( phys < 0x80000000 || phys >= 0xffc00000 ) + if( phys < IO_BASE || phys >= 0xffc00000 ) return 0x02; /*0xa*/ /* wim GxPp */ return 0x6a; /* WIm GxPp, I/O */ } @@ -359,20 +387,21 @@ static ucell ofmem_claim_phys_( ucell phys, ucell size, ucell align, ucell min, ucell max, int reverse ) { + ofmem_t *ofmem = OFMEM; if( !align ) { - if( !is_free( phys, size, ofmem.phys_range ) ) { + if( !is_free( phys, size, ofmem->phys_range ) ) { printk("Non-free physical memory claimed!\n"); return -1; } - add_entry( phys, size, &ofmem.phys_range ); + add_entry( phys, size, &ofmem->phys_range ); return phys; } - phys = find_area( align, size, ofmem.phys_range, min, max, reverse ); + phys = find_area( align, size, ofmem->phys_range, min, max, reverse ); if( phys == (ucell)-1 ) { printk("ofmem_claim_phys - out of space\n"); return -1; } - add_entry( phys, size, &ofmem.phys_range ); + add_entry( phys, size, &ofmem->phys_range ); return phys; }
@@ -381,27 +410,28 @@ ofmem_claim_phys( ucell phys, ucell size, ucell align ) { /* printk("+ ofmem_claim phys %08lx %lx %ld\n", phys, size, align ); */ - return ofmem_claim_phys_( phys, size, align, 0, RAMSIZE, 0 ); + return ofmem_claim_phys_( phys, size, align, 0, get_ram_size(), 0 ); }
static ucell ofmem_claim_virt_( ucell virt, ucell size, ucell align, ucell min, ucell max, int reverse ) { + ofmem_t *ofmem = OFMEM; if( !align ) { - if( !is_free( virt, size, ofmem.virt_range ) ) { + if( !is_free( virt, size, ofmem->virt_range ) ) { printk("Non-free physical memory claimed!\n"); return -1; } - add_entry( virt, size, &ofmem.virt_range ); + add_entry( virt, size, &ofmem->virt_range ); return virt; }
- virt = find_area( align, size, ofmem.virt_range, min, max, reverse ); + virt = find_area( align, size, ofmem->virt_range, min, max, reverse ); if( virt == (ucell)-1 ) { printk("ofmem_claim_virt - out of space\n"); return -1; } - add_entry( virt, size, &ofmem.virt_range ); + add_entry( virt, size, &ofmem->virt_range ); return virt; }
@@ -409,7 +439,7 @@ ofmem_claim_virt( ucell virt, ucell size, ucell align ) { /* printk("+ ofmem_claim virt %08lx %lx %ld\n", virt, size, align ); */ - return ofmem_claim_virt_( virt, size, align, RAMSIZE, 0x80000000, 0 ); + return ofmem_claim_virt_( virt, size, align, get_ram_size() , IO_BASE, 0 ); }
@@ -417,13 +447,15 @@ ucell ofmem_claim( ucell addr, ucell size, ucell align ) { + ofmem_t *ofmem = OFMEM; ucell virt, phys; ucell offs = addr & 0xfff;
/* printk("+ ofmem_claim %08lx %lx %ld\n", addr, size, align ); */ virt = phys = 0; if( !align ) { - if( is_free(addr, size, ofmem.virt_range) && is_free(addr, size, ofmem.phys_range) ) { + if( is_free(addr, size, ofmem->virt_range) && + is_free(addr, size, ofmem->phys_range) ) { ofmem_claim_phys_( addr, size, 0, 0, 0, 0 ); ofmem_claim_virt_( addr, size, 0, 0, 0, 0 ); virt = phys = addr; @@ -434,8 +466,8 @@ } else { if( align < 0x1000 ) align = 0x1000; - phys = ofmem_claim_phys_( addr, size, align, 0, RAMSIZE, 1 /* reverse */ ); - virt = ofmem_claim_virt_( addr, size, align, 0, RAMSIZE, 1 /* reverse */ ); + phys = ofmem_claim_phys_( addr, size, align, 0, get_ram_size(), 1 /* reverse */ ); + virt = ofmem_claim_virt_( addr, size, align, 0, get_ram_size(), 1 /* reverse */ ); if( phys == (ucell)-1 || virt == (ucell)-1 ) { printk("ofmem_claim failed\n"); return -1; @@ -465,9 +497,10 @@ static void split_trans( ucell virt ) { + ofmem_t *ofmem = OFMEM; translation_t *t, *t2;
- for( t=ofmem.trans; t; t=t->next ) { + for( t=ofmem->trans; t; t=t->next ) { if( virt > t->virt && virt < t->virt + t->size-1 ) { t2 = (translation_t*)malloc( sizeof(translation_t) ); t2->virt = virt; @@ -484,30 +517,31 @@ static int map_page_range( ucell virt, ucell phys, ucell size, ucell mode ) { + ofmem_t *ofmem = OFMEM; translation_t *t, **tt;
split_trans( virt ); split_trans( virt + size );
/* detect remappings */ - for( t=ofmem.trans; t; ) { + for( t=ofmem->trans; t; ) { if( virt == t->virt || (virt < t->virt && virt + size > t->virt )) { if( t->phys + virt - t->virt != phys ) { printk("mapping altered (ea " FMT_ucellx ")\n", t->virt ); } else if( t->mode != mode ){ printk("mapping mode altered\n"); } - for( tt=&ofmem.trans; *tt != t ; tt=&(**tt).next ) + for( tt=&ofmem->trans; *tt != t ; tt=&(**tt).next ) ; *tt = t->next; free((char*)t); - t=ofmem.trans; + t=ofmem->trans; continue; } t=t->next; } /* add mapping */ - for( tt=&ofmem.trans; *tt && (**tt).virt < virt ; tt=&(**tt).next ) + for( tt=&ofmem->trans; *tt && (**tt).virt < virt ; tt=&(**tt).next ) ; t = (translation_t*)malloc( sizeof(translation_t) ); t->virt = virt; @@ -523,6 +557,7 @@ int ofmem_map( ucell phys, ucell virt, ucell size, ucell mode ) { + ofmem_t *ofmem = OFMEM; /* printk("+ofmem_map: %08lX --> %08lX (size %08lX, mode 0x%02X)\n", virt, phys, size, mode ); */
@@ -536,9 +571,9 @@ } #if 1 /* claim any unclaimed virtual memory in the range */ - fill_range( virt, size, &ofmem.virt_range ); + fill_range( virt, size, &ofmem->virt_range ); /* hmm... we better claim the physical range too */ - fill_range( phys, size, &ofmem.phys_range ); + fill_range( phys, size, &ofmem->phys_range ); #endif //printk("map_page_range %08lx -> %08lx %08lx\n", virt, phys, size ); map_page_range( virt, phys, size, (mode==-1)? def_memmode(phys) : mode ); @@ -549,9 +584,10 @@ ucell ofmem_translate( ucell virt, ucell *mode ) { + ofmem_t *ofmem = OFMEM; translation_t *t;
- for( t=ofmem.trans; t && t->virt <= virt ; t=t->next ) { + for( t=ofmem->trans; t && t->virt <= virt ; t=t->next ) { ucell offs; if( t->virt + t->size - 1 < virt ) continue; @@ -587,7 +623,9 @@ *mode = def_memmode( ea ); return ea; } - if( (phys=ofmem_translate(ea, mode)) == (ucell)-1 ) { + + phys = ofmem_translate(ea, mode); + if( phys == (ucell)-1 ) { #ifdef I_WANT_MOLISMS if( ea != 0x80816c00 ) printk("ea_to_phys: no translation for %08lx, using 1-1\n", ea ); @@ -619,9 +657,9 @@
hash1 = vsid; hash1 ^= (ea >> 12) & 0xffff; - hash1 &= (HASH_SIZE-1) >> 6; + hash1 &= (get_hash_size() - 1) >> 6;
- pp = (mPTE_t*)(HASH_BASE + (hash1 << 6)); + pp = (mPTE_t*)(get_hash_base() + (hash1 << 6)); upte = (ulong*)pp;
/* replace old translation */ @@ -651,11 +689,15 @@ { ulong dar, dsisr; ucell mode; + ucell phys;
asm volatile("mfdar %0" : "=r" (dar) : ); asm volatile("mfdsisr %0" : "=r" (dsisr) : ); + //printk("dsi-exception @ %08lx <%08lx>\n", dar, dsisr ); - hash_page( dar, ea_to_phys(dar, &mode), mode ); + + phys = ea_to_phys(dar, &mode); + hash_page( dar, phys, mode ); }
void @@ -663,12 +705,15 @@ { ulong nip, srr1; ucell mode; + ucell phys;
asm volatile("mfsrr0 %0" : "=r" (nip) : ); asm volatile("mfsrr1 %0" : "=r" (srr1) : );
//printk("isi-exception @ %08lx <%08lx>\n", nip, srr1 ); - hash_page( nip, ea_to_phys(nip, &mode), mode ); + + phys = ea_to_phys(nip, &mode); + hash_page( nip, phys, mode ); }
@@ -697,8 +742,9 @@ void ofmem_init( void ) { + ofmem_t *ofmem = OFMEM; /* In case we can't rely on memory being zero initialized */ - memset(&ofmem, 0, sizeof(ofmem)); + memset(ofmem, 0, sizeof(ofmem));
ofmem_claim_phys( 0, FREE_BASE_1, 0 ); ofmem_claim_virt( 0, FREE_BASE_1, 0 );
Modified: trunk/openbios-devel/arch/ppc/qemu/ofmem.c =================================================================== --- trunk/openbios-devel/arch/ppc/qemu/ofmem.c 2009-08-02 11:04:27 UTC (rev 523) +++ trunk/openbios-devel/arch/ppc/qemu/ofmem.c 2009-08-02 11:05:00 UTC (rev 524) @@ -31,6 +31,7 @@ extern void setup_mmu( ulong code_base );
#define FREE_BASE 0x00004000 +#define OF_CODE_START 0xfff00000UL #define IO_BASE 0x80000000 #define OFMEM ((ofmem_t*)FREE_BASE) #define OF_MALLOC_BASE ((char*)OFMEM + ((sizeof(ofmem_t) + 3) & ~3)) @@ -446,7 +447,7 @@ ofmem_claim_virt_( addr, size, 0, 0, 0, 0 ); virt = phys = addr; } else { - /* printk("**** ofmem_claim failure ***!\n"); */ + printk("**** ofmem_claim failure ***!\n"); return -1; } } else { @@ -550,8 +551,9 @@ virt, phys, size, mode ); */
if( (phys & 0xfff) || (virt & 0xfff) || (size & 0xfff) ) { - /* printk("ofmem_map: Bad parameters (%08lX %08lX %08lX)\n", - phys, virt, size ); */ + printk("ofmem_map: Bad parameters (" FMT_ucellX " " FMT_ucellX " " + FMT_ucellX ")\n", + phys, virt, size ); phys &= ~0xfff; virt &= ~0xfff; size = (size + 0xfff) & ~0xfff; @@ -585,7 +587,7 @@
//printk("ofmem_translate: no translation defined (%08lx)\n", virt); //print_trans(); - return -1UL; + return -1; }
/* release memory allocated by ofmem_claim */ @@ -605,16 +607,16 @@ { ucell phys;
- if (ea >= 0xfff00000UL) { + if (ea >= OF_CODE_START) { /* ROM into RAM */ - ea -= 0xfff00000UL; + ea -= OF_CODE_START; phys = get_rom_base() + ea; *mode = 0x02; return phys; }
phys = ofmem_translate(ea, mode); - if( phys == -1UL ) { + if( phys == (ucell)-1 ) { phys = ea; *mode = def_memmode( phys );