|
|
newlibrt.c説明を見る。00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2003-2004 by Takagi Nobuhisa 00009 * Copyright (C) 2006 by Embedded and Real-Time Systems Laboratory 00010 * Graduate School of Information Science, Nagoya Univ., JAPAN 00011 * 00012 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00013 * によって公表されている GNU General Public License の Version 2 に記 00014 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00015 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00016 * 利用と呼ぶ)することを無償で許諾する. 00017 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00018 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00019 * スコード中に含まれていること. 00020 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00021 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00022 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00023 * の無保証規定を掲載すること. 00024 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00025 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00026 * と. 00027 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00028 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00029 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00030 * 報告すること. 00031 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00032 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00036 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00037 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00038 * 00039 * @(#) $Id: newlibrt.c,v 1.2 2006/03/13 07:04:55 honda Exp $ 00040 */ 00041 #include <stddef.h> 00042 #include <reent.h> 00043 #include <errno.h> 00044 #include "../kernel/fdmp_kernel.h" 00045 00046 #ifndef HEAP_TOP 00047 #define HEAP_TOP ~0UL 00048 #endif 00049 00050 /* 00051 * For malloc (Newlib) 00052 */ 00053 static int cxxrt_dis_dsp; 00054 00055 void __malloc_lock(struct _reent *ptr) 00056 { 00057 if (!iniflg || sns_dsp()) 00058 return; 00059 dis_dsp(); 00060 cxxrt_dis_dsp = 1; 00061 } 00062 00063 void __malloc_unlock(struct _reent *ptr) 00064 { 00065 if (!cxxrt_dis_dsp) 00066 return; 00067 cxxrt_dis_dsp = 0; 00068 ena_dsp(); 00069 } 00070 00071 void *_sbrk_r(struct _reent *ptr, ptrdiff_t nbyte) 00072 { 00073 extern char end; 00074 static char *heap_ptr = &end; 00075 static char *heap_end = (char*)HEAP_TOP; 00076 char *base; 00077 00078 if (!iniflg) 00079 { 00080 volatile char _auto; 00081 if (&end < &_auto && &_auto < heap_end) 00082 heap_end = (char*)&_auto; 00083 } 00084 00085 if (heap_ptr + nbyte + 32 > heap_end) 00086 { 00087 ptr->_errno = errno = ENOMEM; 00088 return (void*)-1; 00089 } 00090 00091 base = heap_ptr; 00092 heap_ptr += nbyte; 00093 return base; 00094 } 00095 00096 /* 00097 * For program termination 00098 */ 00099 #define ATEXIT_MAX (32 + 1) 00100 00101 static void (*atexit_table[ATEXIT_MAX])(void); 00102 static int atexit_num; 00103 00104 /* 00105 * abort時に最初に呼出されるフック 00106 * raise(SIGABRT)を呼出すようにすれば、ホスト環境との互換をとることが可能になる。 00107 */ 00108 void (*_atabort)(void) = 0; 00109 00110 int atexit(void (*func)(void)) 00111 { 00112 int result = -1; 00113 int sync = iniflg; 00114 00115 if (sync) 00116 loc_cpu(); 00117 00118 if (atexit_num < ATEXIT_MAX) 00119 { 00120 atexit_table[atexit_num++] = func; 00121 result = 0; 00122 } 00123 00124 if (sync) 00125 unl_cpu(); 00126 00127 return result; 00128 } 00129 00130 void exit(int status) 00131 { 00132 if (iniflg) 00133 kernel_exit(); 00134 _exit(status); 00135 } 00136 00137 void abort(void) 00138 { 00139 if (_atabort != 0) 00140 (*_atabort)(); 00141 if (iniflg) 00142 kernel_abort(); 00143 _exit(3); 00144 } 00145 00146 /* 00147 * For software hooks 00148 */ 00149 void software_init_hook(void) 00150 { 00151 extern void _toppers_cxxrt_init(void); 00152 _toppers_cxxrt_init(); 00153 { 00154 #ifdef __ELF__ 00155 extern void _init(void); 00156 extern void _fini(void); 00157 atexit(_fini); 00158 _init(); 00159 #else 00160 extern void __main(void); 00161 __main(); 00162 #endif 00163 } 00164 } 00165 00166 void software_term_hook(void) 00167 { 00168 int i; 00169 00170 for (i = atexit_num - 1; i >= 0; i--) 00171 (*atexit_table[i])(); 00172 } 00173 00174 /* リンク解決用のダミー */ 00175 int main() { return 0; } 00176 Copyright © 2006 by TAKAGI Nobuhisa. このページは Mon Apr 3 23:49:12 2006 に Doxygen によって生成されました。 |