REMOVEME x86_64 M2-Plane bug: scaffold/bug.c scaffold/bug.kaem
M2-Planet-0.10.0 This works fine, prints three times 33 mes_cpu=x86 stage0_cpu=x86 kaem -f scaffold/bug.kaem Only ntoab_local works, prints 33 only once, segfaults in ntoab_global and ntoab mes_cpu=x86_64 stage0_cpu=amd64 kaem -f scaffold/bug.kaem * scaffold/bug.c, scaffold/bug.kaem: New files.
This commit is contained in:
parent
1203c3717f
commit
7853d37dfd
|
@ -0,0 +1,194 @@
|
|||
extern int g_debug;
|
||||
|
||||
size_t
|
||||
__mesabi_uldiv (size_t a, size_t b, size_t *remainder)
|
||||
{
|
||||
remainder[0] = a % b;
|
||||
return a / b;
|
||||
}
|
||||
|
||||
char *
|
||||
ntoab_local (long x, unsigned base, int signed_p)
|
||||
{
|
||||
char* __itoa_buf = "012345678911234567890";
|
||||
if (g_debug > 2) eputs ("ntoab 00\n");
|
||||
char *p = __itoa_buf + 11;
|
||||
if (g_debug > 2) eputs ("ntoab 03\n");
|
||||
|
||||
p[0] = 0;
|
||||
if (g_debug > 2) eputs ("ntoab 04\n");
|
||||
p = p - 1;
|
||||
if (g_debug > 2) eputs ("ntoab 05\n");
|
||||
|
||||
int sign_p = 0;
|
||||
size_t i;
|
||||
size_t u;
|
||||
size_t b = base;
|
||||
if (signed_p != 0 && x < 0)
|
||||
{
|
||||
sign_p = 1;
|
||||
/* Avoid LONG_MIN */
|
||||
u = (-(x + 1));
|
||||
u = u + 1;
|
||||
}
|
||||
else
|
||||
u = x;
|
||||
|
||||
do
|
||||
{
|
||||
u = __mesabi_uldiv (u, b, &i);
|
||||
if (i > 9)
|
||||
p[0] = 'a' + i - 10;
|
||||
else
|
||||
p[0] = '0' + i;
|
||||
p = p - 1;
|
||||
}
|
||||
while (u != 0);
|
||||
|
||||
if (sign_p && p[1] != '0')
|
||||
{
|
||||
p[0] = '-';
|
||||
p = p - 1;
|
||||
}
|
||||
|
||||
return p + 1;
|
||||
}
|
||||
|
||||
char *
|
||||
itoa_local (int x)
|
||||
{
|
||||
return ntoab_local (x, 10, 1);
|
||||
}
|
||||
|
||||
char* __itoa_buf_global = "012345678911234567890";
|
||||
|
||||
char *
|
||||
ntoab_global (long x, unsigned base, int signed_p)
|
||||
{
|
||||
char *p;
|
||||
if (g_debug > 2) eputs ("ntoab 00\n");
|
||||
//char *p = __itoa_buf + 11;
|
||||
p = __itoa_buf_global + 11;
|
||||
if (g_debug > 2) eputs ("ntoab 03\n");
|
||||
|
||||
p[0] = 0;
|
||||
if (g_debug > 2) eputs ("ntoab 04\n");
|
||||
p = p - 1;
|
||||
if (g_debug > 2) eputs ("ntoab 05\n");
|
||||
|
||||
int sign_p = 0;
|
||||
size_t i;
|
||||
size_t u;
|
||||
size_t b = base;
|
||||
if (signed_p != 0 && x < 0)
|
||||
{
|
||||
sign_p = 1;
|
||||
/* Avoid LONG_MIN */
|
||||
u = (-(x + 1));
|
||||
u = u + 1;
|
||||
}
|
||||
else
|
||||
u = x;
|
||||
|
||||
do
|
||||
{
|
||||
u = __mesabi_uldiv (u, b, &i);
|
||||
if (i > 9)
|
||||
p[0] = 'a' + i - 10;
|
||||
else
|
||||
p[0] = '0' + i;
|
||||
p = p - 1;
|
||||
}
|
||||
while (u != 0);
|
||||
|
||||
if (sign_p && p[1] != '0')
|
||||
{
|
||||
p[0] = '-';
|
||||
p = p - 1;
|
||||
}
|
||||
|
||||
return p + 1;
|
||||
}
|
||||
|
||||
char *
|
||||
itoa_global (int x)
|
||||
{
|
||||
return ntoab_global (x, 10, 1);
|
||||
}
|
||||
|
||||
char* __itoa_buf;
|
||||
|
||||
char *
|
||||
ntoab (long x, unsigned base, int signed_p)
|
||||
{
|
||||
if (g_debug > 2) eputs ("ntoab 00\n");
|
||||
if (__itoa_buf == 0)
|
||||
{
|
||||
if (g_debug > 2) eputs ("ntoab 01\n");
|
||||
__itoa_buf = malloc (20);
|
||||
if (g_debug > 2) eputs ("ntoab 02\n");
|
||||
}
|
||||
char *p = __itoa_buf + 11;
|
||||
if (__itoa_buf == 0)
|
||||
eputs ("MALLOC FAILED ON __itoa_buf\n");
|
||||
p = __itoa_buf + 11;
|
||||
if (g_debug > 2) eputs ("ntoab 03\n");
|
||||
|
||||
p[0] = 0;
|
||||
if (g_debug > 2) eputs ("ntoab 04\n");
|
||||
p = p - 1;
|
||||
if (g_debug > 2) eputs ("ntoab 05\n");
|
||||
|
||||
int sign_p = 0;
|
||||
size_t i;
|
||||
size_t u;
|
||||
size_t b = base;
|
||||
if (signed_p != 0 && x < 0)
|
||||
{
|
||||
sign_p = 1;
|
||||
/* Avoid LONG_MIN */
|
||||
u = (-(x + 1));
|
||||
u = u + 1;
|
||||
}
|
||||
else
|
||||
u = x;
|
||||
|
||||
do
|
||||
{
|
||||
u = __mesabi_uldiv (u, b, &i);
|
||||
if (i > 9)
|
||||
p[0] = 'a' + i - 10;
|
||||
else
|
||||
p[0] = '0' + i;
|
||||
p = p - 1;
|
||||
}
|
||||
while (u != 0);
|
||||
|
||||
if (sign_p && p[1] != '0')
|
||||
{
|
||||
p[0] = '-';
|
||||
p = p - 1;
|
||||
}
|
||||
|
||||
return p + 1;
|
||||
}
|
||||
|
||||
char *
|
||||
itoa (int x)
|
||||
{
|
||||
return ntoab (x, 10, 1);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
eputs ("local thirtythree=");
|
||||
eputs (itoa_local (33));
|
||||
eputs ("\n");
|
||||
eputs ("global thirtythree=");
|
||||
eputs (itoa_global (33));
|
||||
eputs ("\n");
|
||||
eputs ("thirtythree=");
|
||||
eputs (itoa (33));
|
||||
eputs ("\n");
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
#! /bin/sh
|
||||
|
||||
# Usage:
|
||||
# kaem --verbose --strict --file scaffold/bug.kaem
|
||||
# scaffold/bug-m2
|
||||
|
||||
mes_cpu=${mes_cpu:-x86}
|
||||
stage0_cpu=${stage0_cpu:-x86}
|
||||
|
||||
M2-Planet \
|
||||
--debug \
|
||||
--architecture ${stage0_cpu} \
|
||||
-f lib/linux/${mes_cpu}-mes-m2/crt1.c \
|
||||
-f include/mes/lib-mini.h \
|
||||
-f lib/linux/${mes_cpu}-mes-m2/_write.c \
|
||||
-f lib/linux/${mes_cpu}-mes-m2/_exit.c \
|
||||
-f include/linux/${mes_cpu}/syscall.h \
|
||||
-f lib/linux/${mes_cpu}-mes-m2/syscall.c \
|
||||
-f lib/m2/cast.c \
|
||||
-f include/mes/lib.h \
|
||||
-f lib/string/strlen.c \
|
||||
-f lib/mes/write.c \
|
||||
-f lib/mes/eputs.c \
|
||||
-f lib/linux/brk.c \
|
||||
-f lib/linux/malloc.c \
|
||||
-f scaffold/bug.c \
|
||||
-o scaffold/bug.M1
|
||||
|
||||
blood-elf --little-endian -f scaffold/bug.M1 -o scaffold/bug.blood-elf-M1
|
||||
|
||||
M1 \
|
||||
--architecture ${stage0_cpu} \
|
||||
--little-endian \
|
||||
-f lib/m2/${mes_cpu}/${mes_cpu}_defs.M1 \
|
||||
-f lib/${mes_cpu}-mes/${mes_cpu}.M1 \
|
||||
-f lib/linux/${mes_cpu}-mes-m2/crt1.M1 \
|
||||
-f scaffold/bug.M1 \
|
||||
-f scaffold/bug.blood-elf-M1 \
|
||||
-o scaffold/bug.hex2
|
||||
|
||||
hex2 \
|
||||
--architecture ${stage0_cpu} \
|
||||
--little-endian \
|
||||
--base-address 0x1000000 \
|
||||
-f lib/m2/${mes_cpu}/ELF-${mes_cpu}.hex2 \
|
||||
-f scaffold/bug.hex2 \
|
||||
-o scaffold/bug-m2
|
||||
|
||||
echo Now run: scaffold/bug-m2
|
||||
./scaffold/bug-m2
|
Loading…
Reference in New Issue