1*10465441SEvalZero /* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero * 2010-03-22 Bernard first version 9*10465441SEvalZero */ 10*10465441SEvalZero #ifndef FINSH_API_H__ 11*10465441SEvalZero #define FINSH_API_H__ 12*10465441SEvalZero 13*10465441SEvalZero #if defined(_MSC_VER) 14*10465441SEvalZero #pragma section("FSymTab$f",read) 15*10465441SEvalZero #pragma section("VSymTab",read) 16*10465441SEvalZero #endif 17*10465441SEvalZero 18*10465441SEvalZero typedef long (*syscall_func)(void); 19*10465441SEvalZero 20*10465441SEvalZero /* system call table */ 21*10465441SEvalZero struct finsh_syscall 22*10465441SEvalZero { 23*10465441SEvalZero const char* name; /* the name of system call */ 24*10465441SEvalZero #if defined(FINSH_USING_DESCRIPTION) && defined(FINSH_USING_SYMTAB) 25*10465441SEvalZero const char* desc; /* description of system call */ 26*10465441SEvalZero #endif 27*10465441SEvalZero syscall_func func; /* the function address of system call */ 28*10465441SEvalZero }; 29*10465441SEvalZero extern struct finsh_syscall *_syscall_table_begin, *_syscall_table_end; 30*10465441SEvalZero 31*10465441SEvalZero /* find out system call, which should be implemented in user program */ 32*10465441SEvalZero struct finsh_syscall* finsh_syscall_lookup(const char* name); 33*10465441SEvalZero 34*10465441SEvalZero #ifdef FINSH_USING_SYMTAB 35*10465441SEvalZero 36*10465441SEvalZero #ifdef __TI_COMPILER_VERSION__ 37*10465441SEvalZero #define __TI_FINSH_EXPORT_FUNCTION(f) PRAGMA(DATA_SECTION(f,"FSymTab")) 38*10465441SEvalZero #define __TI_FINSH_EXPORT_VAR(v) PRAGMA(DATA_SECTION(v,"VSymTab")) 39*10465441SEvalZero #endif 40*10465441SEvalZero 41*10465441SEvalZero #ifdef FINSH_USING_DESCRIPTION 42*10465441SEvalZero #ifdef _MSC_VER 43*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ 44*10465441SEvalZero const char __fsym_##cmd##_name[] = #cmd; \ 45*10465441SEvalZero const char __fsym_##cmd##_desc[] = #desc; \ 46*10465441SEvalZero __declspec(allocate("FSymTab$f")) \ 47*10465441SEvalZero const struct finsh_syscall __fsym_##cmd = \ 48*10465441SEvalZero { \ 49*10465441SEvalZero __fsym_##cmd##_name, \ 50*10465441SEvalZero __fsym_##cmd##_desc, \ 51*10465441SEvalZero (syscall_func)&name \ 52*10465441SEvalZero }; 53*10465441SEvalZero #pragma comment(linker, "/merge:FSymTab=mytext") 54*10465441SEvalZero 55*10465441SEvalZero #define FINSH_VAR_EXPORT(name, type, desc) \ 56*10465441SEvalZero const char __vsym_##name##_name[] = #name; \ 57*10465441SEvalZero const char __vsym_##name##_desc[] = #desc; \ 58*10465441SEvalZero __declspec(allocate("VSymTab")) \ 59*10465441SEvalZero const struct finsh_sysvar __vsym_##name = \ 60*10465441SEvalZero { \ 61*10465441SEvalZero __vsym_##name##_name, \ 62*10465441SEvalZero __vsym_##name##_desc, \ 63*10465441SEvalZero type, \ 64*10465441SEvalZero (void*)&name \ 65*10465441SEvalZero }; 66*10465441SEvalZero 67*10465441SEvalZero #elif defined(__TI_COMPILER_VERSION__) 68*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ 69*10465441SEvalZero __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ 70*10465441SEvalZero const char __fsym_##cmd##_name[] = #cmd; \ 71*10465441SEvalZero const char __fsym_##cmd##_desc[] = #desc; \ 72*10465441SEvalZero const struct finsh_syscall __fsym_##cmd = \ 73*10465441SEvalZero { \ 74*10465441SEvalZero __fsym_##cmd##_name, \ 75*10465441SEvalZero __fsym_##cmd##_desc, \ 76*10465441SEvalZero (syscall_func)&name \ 77*10465441SEvalZero }; 78*10465441SEvalZero 79*10465441SEvalZero #define FINSH_VAR_EXPORT(name, type, desc) \ 80*10465441SEvalZero __TI_FINSH_EXPORT_VAR(__vsym_##name); \ 81*10465441SEvalZero const char __vsym_##name##_name[] = #name; \ 82*10465441SEvalZero const char __vsym_##name##_desc[] = #desc; \ 83*10465441SEvalZero const struct finsh_sysvar __vsym_##name = \ 84*10465441SEvalZero { \ 85*10465441SEvalZero __vsym_##name##_name, \ 86*10465441SEvalZero __vsym_##name##_desc, \ 87*10465441SEvalZero type, \ 88*10465441SEvalZero (void*)&name \ 89*10465441SEvalZero }; 90*10465441SEvalZero 91*10465441SEvalZero #else 92*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ 93*10465441SEvalZero const char __fsym_##cmd##_name[] SECTION(".rodata.name") = #cmd; \ 94*10465441SEvalZero const char __fsym_##cmd##_desc[] SECTION(".rodata.name") = #desc; \ 95*10465441SEvalZero RT_USED const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \ 96*10465441SEvalZero { \ 97*10465441SEvalZero __fsym_##cmd##_name, \ 98*10465441SEvalZero __fsym_##cmd##_desc, \ 99*10465441SEvalZero (syscall_func)&name \ 100*10465441SEvalZero }; 101*10465441SEvalZero 102*10465441SEvalZero #define FINSH_VAR_EXPORT(name, type, desc) \ 103*10465441SEvalZero const char __vsym_##name##_name[] SECTION(".rodata.name") = #name; \ 104*10465441SEvalZero const char __vsym_##name##_desc[] SECTION(".rodata.name") = #desc; \ 105*10465441SEvalZero RT_USED const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \ 106*10465441SEvalZero { \ 107*10465441SEvalZero __vsym_##name##_name, \ 108*10465441SEvalZero __vsym_##name##_desc, \ 109*10465441SEvalZero type, \ 110*10465441SEvalZero (void*)&name \ 111*10465441SEvalZero }; 112*10465441SEvalZero 113*10465441SEvalZero #endif 114*10465441SEvalZero #else 115*10465441SEvalZero #ifdef _MSC_VER 116*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ 117*10465441SEvalZero const char __fsym_##cmd##_name[] = #cmd; \ 118*10465441SEvalZero __declspec(allocate("FSymTab$f")) \ 119*10465441SEvalZero const struct finsh_syscall __fsym_##cmd = \ 120*10465441SEvalZero { \ 121*10465441SEvalZero __fsym_##cmd##_name, \ 122*10465441SEvalZero (syscall_func)&name \ 123*10465441SEvalZero }; 124*10465441SEvalZero #pragma comment(linker, "/merge:FSymTab=mytext") 125*10465441SEvalZero 126*10465441SEvalZero #define FINSH_VAR_EXPORT(name, type, desc) \ 127*10465441SEvalZero const char __vsym_##name##_name[] = #name; \ 128*10465441SEvalZero __declspec(allocate("VSymTab")) const struct finsh_sysvar __vsym_##name = \ 129*10465441SEvalZero { \ 130*10465441SEvalZero __vsym_##name##_name, \ 131*10465441SEvalZero type, \ 132*10465441SEvalZero (void*)&name \ 133*10465441SEvalZero }; 134*10465441SEvalZero 135*10465441SEvalZero #elif defined(__TI_COMPILER_VERSION__) 136*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ 137*10465441SEvalZero __TI_FINSH_EXPORT_FUNCTION(__fsym_##cmd); \ 138*10465441SEvalZero const char __fsym_##cmd##_name[] = #cmd; \ 139*10465441SEvalZero const struct finsh_syscall __fsym_##cmd = \ 140*10465441SEvalZero { \ 141*10465441SEvalZero __fsym_##cmd##_name, \ 142*10465441SEvalZero (syscall_func)&name \ 143*10465441SEvalZero }; 144*10465441SEvalZero 145*10465441SEvalZero #define FINSH_VAR_EXPORT(name, type, desc) \ 146*10465441SEvalZero __TI_FINSH_EXPORT_VAR(__vsym_##name); \ 147*10465441SEvalZero const char __vsym_##name##_name[] = #name; \ 148*10465441SEvalZero const struct finsh_sysvar __vsym_##name = \ 149*10465441SEvalZero { \ 150*10465441SEvalZero __vsym_##name##_name, \ 151*10465441SEvalZero type, \ 152*10465441SEvalZero (void*)&name \ 153*10465441SEvalZero }; 154*10465441SEvalZero 155*10465441SEvalZero #else 156*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc) \ 157*10465441SEvalZero const char __fsym_##cmd##_name[] = #cmd; \ 158*10465441SEvalZero RT_USED const struct finsh_syscall __fsym_##cmd SECTION("FSymTab")= \ 159*10465441SEvalZero { \ 160*10465441SEvalZero __fsym_##cmd##_name, \ 161*10465441SEvalZero (syscall_func)&name \ 162*10465441SEvalZero }; 163*10465441SEvalZero 164*10465441SEvalZero #define FINSH_VAR_EXPORT(name, type, desc) \ 165*10465441SEvalZero const char __vsym_##name##_name[] = #name; \ 166*10465441SEvalZero RT_USED const struct finsh_sysvar __vsym_##name SECTION("VSymTab")= \ 167*10465441SEvalZero { \ 168*10465441SEvalZero __vsym_##name##_name, \ 169*10465441SEvalZero type, \ 170*10465441SEvalZero (void*)&name \ 171*10465441SEvalZero }; 172*10465441SEvalZero 173*10465441SEvalZero #endif 174*10465441SEvalZero #endif /* end of FINSH_USING_DESCRIPTION */ 175*10465441SEvalZero #endif /* end of FINSH_USING_SYMTAB */ 176*10465441SEvalZero 177*10465441SEvalZero /** 178*10465441SEvalZero * @ingroup finsh 179*10465441SEvalZero * 180*10465441SEvalZero * This macro exports a system function to finsh shell. 181*10465441SEvalZero * 182*10465441SEvalZero * @param name the name of function. 183*10465441SEvalZero * @param desc the description of function, which will show in help. 184*10465441SEvalZero */ 185*10465441SEvalZero #define FINSH_FUNCTION_EXPORT(name, desc) \ 186*10465441SEvalZero FINSH_FUNCTION_EXPORT_CMD(name, name, desc) 187*10465441SEvalZero 188*10465441SEvalZero /** 189*10465441SEvalZero * @ingroup finsh 190*10465441SEvalZero * 191*10465441SEvalZero * This macro exports a system function with an alias name to finsh shell. 192*10465441SEvalZero * 193*10465441SEvalZero * @param name the name of function. 194*10465441SEvalZero * @param alias the alias name of function. 195*10465441SEvalZero * @param desc the description of function, which will show in help. 196*10465441SEvalZero */ 197*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc) \ 198*10465441SEvalZero FINSH_FUNCTION_EXPORT_CMD(name, alias, desc) 199*10465441SEvalZero 200*10465441SEvalZero /** 201*10465441SEvalZero * @ingroup finsh 202*10465441SEvalZero * 203*10465441SEvalZero * This macro exports a command to module shell. 204*10465441SEvalZero * 205*10465441SEvalZero * @param command the name of command. 206*10465441SEvalZero * @param desc the description of command, which will show in help. 207*10465441SEvalZero */ 208*10465441SEvalZero #ifdef FINSH_USING_MSH 209*10465441SEvalZero #define MSH_CMD_EXPORT(command, desc) \ 210*10465441SEvalZero FINSH_FUNCTION_EXPORT_CMD(command, __cmd_##command, desc) 211*10465441SEvalZero #define MSH_CMD_EXPORT_ALIAS(command, alias, desc) \ 212*10465441SEvalZero FINSH_FUNCTION_EXPORT_ALIAS(command, __cmd_##alias, desc) 213*10465441SEvalZero #else 214*10465441SEvalZero #define MSH_CMD_EXPORT(command, desc) 215*10465441SEvalZero #define MSH_CMD_EXPORT_ALIAS(command, alias, desc) 216*10465441SEvalZero #endif 217*10465441SEvalZero 218*10465441SEvalZero #endif 219