mirror of
https://gitlab.com/qemu-project/openbios.git
synced 2024-02-13 08:34:06 +08:00
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:
committed by
Andreas Färber
parent
28516584d1
commit
380cd335cc
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user