[OpenBIOS] r524 - in trunk/openbios-devel/arch/ppc: . qemu

svn at openbios.org svn at openbios.org
Sun Aug 2 13:05:01 CEST 2009


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 );
 




More information about the OpenBIOS mailing list