Author: blueswirl Date: 2009-01-31 17:42:01 +0100 (Sat, 31 Jan 2009) New Revision: 436
Modified: openbios-devel/kernel/bootstrap.c openbios-devel/kernel/cross.h openbios-devel/kernel/dict.c openbios-devel/kernel/forth.c Log: Fix Sparc64 cross compilation in 32 bit environment, closes #17
Modified: openbios-devel/kernel/bootstrap.c =================================================================== --- openbios-devel/kernel/bootstrap.c 2009-01-31 13:33:07 UTC (rev 435) +++ openbios-devel/kernel/bootstrap.c 2009-01-31 16:42:01 UTC (rev 436) @@ -116,7 +116,7 @@ bit=i&~(-BITS);
if(d1[i]==d2[i]) { - reloc_table[pos] &= target_ucell(~((ucell)1UL<<bit)); + reloc_table[pos] &= target_ucell(~((ucell)1ULL << bit));
// This check might bring false positives in data. //if(d1[i] >= pointer2cell(dict_one) && @@ -124,7 +124,7 @@ // printk("\nWARNING: inconsistent relocation (%x:%x)!\n", d1[i], d2[i]); } else { /* This is a pointer, it needs relocation, d2==dict */ - reloc_table[pos] |= target_ucell((ucell)1UL<<bit); + reloc_table[pos] |= target_ucell((ucell)1ULL << bit); d2[i] = target_ucell(target_ucell(d2[i]) - pointer2cell(d2)); } } @@ -175,8 +175,9 @@ .checksum = 0, .compression = 0, .relocation = -1, - .length = target_ulong(dicthead), - .last = target_ucell(((unsigned long)last-(unsigned long)dict)), + .length = target_ulong((uint32_t)dicthead), + .last = target_ucell((ucell)((unsigned long)last + - (unsigned long)dict)), .reserved[0] = 0, .reserved[1] = 0, .reserved[2] = 0, @@ -464,7 +465,7 @@ { FILE *f; char tib[160]; - long num; + cell num; char *test;
const ucell SEMIS = (ucell)findword("(semis)"); @@ -627,11 +628,12 @@ u8 flags = read_byte((u8*)cell2pointer(res) - sizeof(cell) - 1); #ifdef CONFIG_DEBUG_INTERPRETER - printk("%s is 0x%p\n", tib, (ucell) res); + printk("%s is 0x%" FMT_CELL_x "\n", tib, (ucell) res); #endif if (!(*state) || (flags & 3)) { #ifdef CONFIG_DEBUG_INTERPRETER - printk("executing %s, %p (flags: %s %s)\n", + printk("executing %s, %" FMT_CELL_d + " (flags: %s %s)\n", tib, res, (flags & 1) ? "immediate" : "", (flags & 2) ? "compile-only" : ""); @@ -649,9 +651,9 @@
/* if not look if it's a number */ if (tib[0] == '-') - num = strtol(tib, &test, read_ucell(base)); + num = strtoll(tib, &test, read_ucell(base)); else - num = strtoul(tib, &test, read_ucell(base)); + num = strtoull(tib, &test, read_ucell(base));
if (*test != 0) { @@ -667,12 +669,12 @@
if (*state == 0) { #ifdef CONFIG_DEBUG_INTERPRETER - printk("pushed %x to stack\n\n", num); + printk("pushed %" FMT_CELL_x " to stack\n\n", num); #endif PUSH(num); } else { #ifdef CONFIG_DEBUG_INTERPRETER - printk("writing lit, %x to dict\n\n", num); + printk("writing lit, %" FMT_CELL_x " to dict\n\n", num); #endif writecell(LIT); /* lit */ writecell(num);
Modified: openbios-devel/kernel/cross.h =================================================================== --- openbios-devel/kernel/cross.h 2009-01-31 13:33:07 UTC (rev 435) +++ openbios-devel/kernel/cross.h 2009-01-31 16:42:01 UTC (rev 436) @@ -46,16 +46,13 @@ #define target_ucell(value) ((ucell)target_long(value)) #define target_cell(value) ((cell)target_long(value)) #elif BITS==64 -#ifdef NATIVE_BITWIDTH_LARGER_THAN_HOST_BITWIDTH -#define target_ucell(value) ( ((ucell)target_long((value)&0xffffffff))<<32 ) -#define target_cell(value) ( ((cell)target_long((value)&0xffffffff))<<32 ) +#define target_ucell(value) \ + ((((ucell)target_long((value) & 0xffffffff)) << 32) | \ + ((ucell)target_long((value) >> 32))) +#define target_cell(value) \ + ((((cell)target_long((value) & 0xffffffff)) << 32) | \ + ((cell)target_long((value) >> 32))) #else -#define target_ucell(value) ( ((ucell)target_long((value)&0xffffffff))<<32 | \ - ((ucell)target_long((value)>>32)) ) -#define target_cell(value) ( ((cell)target_long((value)&0xffffffff))<<32 | \ - ((cell)target_long((value)>>32)) ) -#endif -#else #error "Endianness not supported. Please report." #endif
Modified: openbios-devel/kernel/dict.c =================================================================== --- openbios-devel/kernel/dict.c 2009-01-31 13:33:07 UTC (rev 435) +++ openbios-devel/kernel/dict.c 2009-01-31 16:42:01 UTC (rev 436) @@ -167,7 +167,7 @@ l=(walk-(ucell *)dict); pos=l/BITS; bit=l&~(-BITS); - if (reloc_table[pos]&target_ucell(1UL<<bit)) { + if (reloc_table[pos] & target_ucell((ucell)1ULL << bit)) { // printk("%lx, pos %x, bit %d\n",*walk, pos, bit); write_ucell(walk, read_ucell(walk)+pointer2cell(dict)); }
Modified: openbios-devel/kernel/forth.c =================================================================== --- openbios-devel/kernel/forth.c 2009-01-31 13:33:07 UTC (rev 435) +++ openbios-devel/kernel/forth.c 2009-01-31 16:42:01 UTC (rev 436) @@ -330,8 +330,18 @@ const ucell b = POP(); const ducell a = DPOP(); #ifdef NEED_FAKE_INT128_T - fprintf(stderr, "mudivmode called\n"); - exit(-1); + if (a.hi != 0) { + fprintf(stderr, "mudivmod called (0x%016llx %016llx / 0x%016llx)\n", + a.hi, a.lo, b); + exit(-1); + } else { + ducell c; + + PUSH(a.lo % b); + c.hi = 0; + c.lo = a.lo / b; + DPUSH(c); + } #else PUSH(a % b); DPUSH(a / b); @@ -480,8 +490,16 @@ const dcell d2 = DPOP(); const dcell d1 = DPOP(); #ifdef NEED_FAKE_INT128_T - fprintf(stderr, "dplus called\n"); - exit(-1); + ducell c; + + if (d1.hi != 0 || d2.hi != 0) { + fprintf(stderr, "dplus called (0x%016llx %016llx + 0x%016llx %016llx)\n", + d1.hi, d1.lo, d2.hi, d2.lo); + exit(-1); + } + c.hi = 0; + c.lo = d1.lo + d2.lo; + DPUSH(c); #else DPUSH(d1 + d2); #endif @@ -497,8 +515,16 @@ const dcell d2 = DPOP(); const dcell d1 = DPOP(); #ifdef NEED_FAKE_INT128_T - fprintf(stderr, "dminus called\n"); - exit(-1); + ducell c; + + if (d1.hi != 0 || d2.hi != 0) { + fprintf(stderr, "dminus called (0x%016llx %016llx + 0x%016llx %016llx)\n", + d1.hi, d1.lo, d2.hi, d2.lo); + exit(-1); + } + c.hi = 0; + c.lo = d1.lo - d2.lo; + DPUSH(c); #else DPUSH(d1 - d2); #endif @@ -514,8 +540,15 @@ const cell u2 = POP(); const cell u1 = POP(); #ifdef NEED_FAKE_INT128_T - fprintf(stderr, "mmult called\n"); - exit(-1); + ducell c; + + if (0) { // XXX How to detect overflow? + fprintf(stderr, "mmult called (%016llx * 0x%016llx)\n", u1, u2); + exit(-1); + } + c.hi = 0; + c.lo = u1 * u2; + DPUSH(c); #else DPUSH((dcell) u1 * u2); #endif @@ -531,8 +564,15 @@ const ucell u2 = POP(); const ucell u1 = POP(); #ifdef NEED_FAKE_INT128_T - fprintf(stderr, "ummult called\n"); - exit(-1); + ducell c; + + if (0) { // XXX How to detect overflow? + fprintf(stderr, "ummult called (%016llx * 0x%016llx)\n", u1, u2); + exit(-1); + } + c.hi = 0; + c.lo = u1 * u2; + DPUSH(c); #else DPUSH((ducell) u1 * u2); #endif