implement va_list for ARMv7 - cu_va_start and cu_va_arg works now based on frame-pointer (r11) for variable arguments, indexed differently than x86 stack ABI does
This commit is contained in:
parent
5448323450
commit
003e51b692
4 changed files with 24 additions and 5 deletions
|
|
@ -182,7 +182,14 @@ cu_memtest:
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
cu_va_start:
|
cu_va_start:
|
||||||
|
add r1, r11, #8
|
||||||
|
str r1, [r0]
|
||||||
bx lr
|
bx lr
|
||||||
|
|
||||||
cu_va_arg:
|
cu_va_arg:
|
||||||
|
// r0 - va_list, r1 - index
|
||||||
|
mov r1, r1, lsl #2
|
||||||
|
ldr r0, [r0]
|
||||||
|
add r0, r0, r1
|
||||||
|
ldr r0, [r0]
|
||||||
bx lr
|
bx lr
|
||||||
|
|
|
||||||
10
string.c
10
string.c
|
|
@ -273,8 +273,11 @@ void cu_sprintf(char* dst, size_t maxLen, const char* fmt, ...)
|
||||||
uword idx;
|
uword idx;
|
||||||
char* cur,*end,c;
|
char* cur,*end,c;
|
||||||
char numbuf[64];
|
char numbuf[64];
|
||||||
|
#ifdef CU_ARCH_ARM
|
||||||
|
idx = 0;
|
||||||
|
#else
|
||||||
idx = 3;
|
idx = 3;
|
||||||
|
#endif
|
||||||
cur = dst;
|
cur = dst;
|
||||||
end = dst+maxLen;
|
end = dst+maxLen;
|
||||||
while((c = *fmt++) && cur != end)
|
while((c = *fmt++) && cur != end)
|
||||||
|
|
@ -360,8 +363,11 @@ void cu_sscanf(char* buf, char* fmt, ...)
|
||||||
char* sptr;
|
char* sptr;
|
||||||
} u;
|
} u;
|
||||||
char c,*stk;
|
char c,*stk;
|
||||||
|
#ifdef CU_ARCH_ARM
|
||||||
|
idx = 0;
|
||||||
|
#else
|
||||||
idx = 2;
|
idx = 2;
|
||||||
|
#endif
|
||||||
while((c = *fmt))
|
while((c = *fmt))
|
||||||
{
|
{
|
||||||
//kprintf("%c %c\n",c,*buf);
|
//kprintf("%c %c\n",c,*buf);
|
||||||
|
|
|
||||||
6
test.c
6
test.c
|
|
@ -177,7 +177,7 @@ int main()
|
||||||
printf("cu_memset\tc0\t%p\n", cu_memtest(&c0, 1));
|
printf("cu_memset\tc0\t%p\n", cu_memtest(&c0, 1));
|
||||||
|
|
||||||
printf("[va_list]\n");
|
printf("[va_list]\n");
|
||||||
//va_test(1337, 1, 2, 3, 4, 5);
|
va_test(1337, 1, 2, 3, 4, 5);
|
||||||
|
|
||||||
printf("[string]\n");
|
printf("[string]\n");
|
||||||
printf("cu_memcmp\t%u\n", cu_memcmp(val3, val3, sizeof(val3)));
|
printf("cu_memcmp\t%u\n", cu_memcmp(val3, val3, sizeof(val3)));
|
||||||
|
|
@ -188,7 +188,7 @@ int main()
|
||||||
printf("cu_strcpy\tstr2\t\"%s\"\n", str2);
|
printf("cu_strcpy\tstr2\t\"%s\"\n", str2);
|
||||||
printf("cu_strcmp\t%u\n", cu_strcmp(str2, str1));
|
printf("cu_strcmp\t%u\n", cu_strcmp(str2, str1));
|
||||||
|
|
||||||
/*char str3[64] = {0};
|
char str3[64] = {0};
|
||||||
cu_sprintf(str3, 64, "hello %u world \"%s\"", 2312, "test");
|
cu_sprintf(str3, 64, "hello %u world \"%s\"", 2312, "test");
|
||||||
printf("cu_sprintf\t%s\n", str3);
|
printf("cu_sprintf\t%s\n", str3);
|
||||||
|
|
||||||
|
|
@ -196,7 +196,7 @@ int main()
|
||||||
char str5[8] = {0};
|
char str5[8] = {0};
|
||||||
iword val5 = 0;
|
iword val5 = 0;
|
||||||
cu_sscanf((char*)str4, "\"%s\" %d", str5, 8, &val5);
|
cu_sscanf((char*)str4, "\"%s\" %d", str5, 8, &val5);
|
||||||
printf("cu_sscanf\t%s\t%u\n", str5, val5);*/
|
printf("cu_sscanf\t%s\t%u\n", str5, val5);
|
||||||
|
|
||||||
printf("[heap]\n");
|
printf("[heap]\n");
|
||||||
static u8 heap_data[4096];
|
static u8 heap_data[4096];
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,15 @@
|
||||||
# define VA_NUM 0
|
# define VA_NUM 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CU_ARCH_X86
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uword args[VA_NUM];
|
uword args[VA_NUM];
|
||||||
} cu_va_list;
|
} cu_va_list;
|
||||||
|
#elif (defined(CU_ARCH_ARM))
|
||||||
|
typedef struct {
|
||||||
|
uword fp;
|
||||||
|
} cu_va_list;
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void cu_va_start(cu_va_list* va);
|
extern void cu_va_start(cu_va_list* va);
|
||||||
extern uword cu_va_arg(cu_va_list* va, unsigned idx);
|
extern uword cu_va_arg(cu_va_list* va, unsigned idx);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue