Don't assume that pointer and cell size are identical, part 1

On ppc64, cell size is 32 bits but pointers are 64-bit.
Thus, direct casts result in warnings, treated as errors.

Use [u]intptr_t cast or cell2pointer and pointer2cell macros as necessary.

v2:
* Drop changes related to physical addresses since physical addresses may be
  wider than pointers (e.g., 36 bits on sparc32, as pointed out by Blue).
* Drop changes to cell2pointer() and pointer2cell() for now.

Signed-off-by: Andreas Färber <andreas.faerber@web.de>


git-svn-id: svn://coreboot.org/openbios/trunk/openbios-devel@922 f158a5a8-5612-0410-a976-696ce0be7e32
This commit is contained in:
Andreas Färber
2010-10-25 20:48:45 +00:00
committed by Andreas Färber
parent 28516584d1
commit 380cd335cc
27 changed files with 93 additions and 94 deletions

View File

@@ -208,7 +208,7 @@ static void call(void)
exit(1);
#else
void (*funcptr) (void);
funcptr=(void *)POP();
funcptr=(void *)cell2pointer(POP());
dbg_interp_printk("call: %x", funcptr);
funcptr();
#endif
@@ -329,7 +329,7 @@ static void doplusloop(void)
#ifndef FCOMPILER
static ucell get_myself(void)
{
static ucell **myself = NULL;
static ucell **myself = NULL;
if( !myself )
myself = (ucell**)findword("my-self") + 1;
return (*myself && **myself) ? (ucell)**myself : 0;
@@ -337,35 +337,35 @@ static ucell get_myself(void)
static void doivar(void)
{
ucell r, *p = (ucell *)(*(ucell *) PC + sizeof(ucell));
ucell r, *p = (ucell *)(*(ucell *) cell2pointer(PC) + sizeof(ucell));
ucell ibase = get_myself();
dbg_interp_printk("ivar, offset: %d size: %d (ibase %d)\n", p[0], p[1], ibase );
r = ibase ? ibase + p[0] : (ucell)&p[2];
r = ibase ? ibase + p[0] : pointer2cell(&p[2]);
PUSH( r );
}
static void doival(void)
{
ucell r, *p = (ucell *)(*(ucell *) PC + sizeof(ucell));
ucell r, *p = (ucell *)(*(ucell *) cell2pointer(PC) + sizeof(ucell));
ucell ibase = get_myself();
dbg_interp_printk("ivar, offset: %d size: %d\n", p[0], p[1] );
r = ibase ? ibase + p[0] : (ucell)&p[2];
PUSH( *(ucell *)r );
r = ibase ? ibase + p[0] : pointer2cell(&p[2]);
PUSH( *(ucell *)cell2pointer(r) );
}
static void doidefer(void)
{
ucell *p = (ucell *)(*(ucell *) PC + sizeof(ucell));
ucell *p = (ucell *)(*(ucell *) cell2pointer(PC) + sizeof(ucell));
ucell ibase = get_myself();
dbg_interp_printk("doidefer, offset: %d size: %d\n", p[0], p[1] );
PUSHR(PC);
PC = ibase ? ibase + p[0] : (ucell)&p[2];
PC = ibase ? ibase + p[0] : pointer2cell(&p[2]);
PC -= sizeof(ucell);
}
#else