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 によって生成されました。