From 5d68ef8ec1254ec766a3aeb743e164020233e59c Mon Sep 17 00:00:00 2001 From: prife Date: Tue, 22 Jan 2013 12:44:47 +0800 Subject: [PATCH] fix bug in finsh when built with 64bit-gcc --- components/finsh/cmd.c | 8 ++++++-- components/finsh/finsh.h | 15 +++++++++++++-- components/finsh/finsh_var.c | 4 +++- components/finsh/finsh_vm.c | 12 +++++++++++- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/components/finsh/cmd.c b/components/finsh/cmd.c index b4b8712b02..84a0a6f123 100644 --- a/components/finsh/cmd.c +++ b/components/finsh/cmd.c @@ -623,7 +623,9 @@ long list(void) rt_kprintf("--Variable List:\n"); { struct finsh_sysvar *index; - for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++) + for (index = _sysvar_table_begin; + index < _sysvar_table_end; + FINSH_NEXT_SYSVAR(index)) { #ifdef FINSH_USING_DESCRIPTION rt_kprintf("%-16s -- %s\n", index->name, index->desc); @@ -761,7 +763,9 @@ void list_prefix(char *prefix) /* checks in system variable */ { struct finsh_sysvar* index; - for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++) + for (index = _sysvar_table_begin; + index < _sysvar_table_end; + FINSH_NEXT_SYSVAR(index)) { if (str_is_prefix(prefix, index->name) == 0) { diff --git a/components/finsh/finsh.h b/components/finsh/finsh.h index 994509bd64..85e32b9fb8 100644 --- a/components/finsh/finsh.h +++ b/components/finsh/finsh.h @@ -64,8 +64,16 @@ typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned long u_long; -#if !defined(__CC_ARM) && !defined(__IAR_SYSTEMS_ICC__) && !defined(__ADSPBLACKFIN__) && !defined(_MSC_VER) +#if !defined(__CC_ARM) && \ + !defined(__IAR_SYSTEMS_ICC__) && \ + !defined(__ADSPBLACKFIN__) && \ + !defined(_MSC_VER) + +#if !(defined(__GNUC__) && defined(__x86_64__)) typedef unsigned int size_t; +#else +#include +#endif #ifndef NULL #define NULL RT_NULL @@ -148,11 +156,14 @@ struct finsh_sysvar void* var ; /* the address of variable */ }; -#if defined(_MSC_VER) +#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__)) struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call); +struct finsh_sysvar* finsh_sysvar_next(struct finsh_sysvar* call); #define FINSH_NEXT_SYSCALL(index) index=finsh_syscall_next(index) +#define FINSH_NEXT_SYSVAR(index) index=finsh_sysvar_next(index) #else #define FINSH_NEXT_SYSCALL(index) index++ +#define FINSH_NEXT_SYSVAR(index) index++ #endif /* system variable item */ diff --git a/components/finsh/finsh_var.c b/components/finsh/finsh_var.c index 96f1244210..8429f6f21c 100644 --- a/components/finsh/finsh_var.c +++ b/components/finsh/finsh_var.c @@ -121,7 +121,9 @@ struct finsh_sysvar* finsh_sysvar_lookup(const char* name) struct finsh_sysvar* index; struct finsh_sysvar_item* item; - for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++) + for (index = _sysvar_table_begin; + index < _sysvar_table_end; + FINSH_NEXT_SYSVAR(index)) { if (strcmp(index->name, name) == 0) return index; diff --git a/components/finsh/finsh_vm.c b/components/finsh/finsh_vm.c index 845eb48919..6b24b70f24 100644 --- a/components/finsh/finsh_vm.c +++ b/components/finsh/finsh_vm.c @@ -83,7 +83,7 @@ void finsh_syscall_append(const char* name, syscall_func func) } #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__x86_64__)) struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call) { unsigned int *ptr; @@ -93,6 +93,16 @@ struct finsh_syscall* finsh_syscall_next(struct finsh_syscall* call) return (struct finsh_syscall*)ptr; } + +struct finsh_sysvar* finsh_sysvar_next(struct finsh_sysvar* call) +{ + unsigned int *ptr; + ptr = (unsigned int*) (call + 1); + while ((*ptr == 0) && ((unsigned int*)ptr < (unsigned int*) _sysvar_table_end)) + ptr ++; + + return (struct finsh_sysvar*)ptr; +} #endif struct finsh_syscall* finsh_syscall_lookup(const char* name)