868b2b66 (kx 2024-12-20 16:11:07 +0300 1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2) #ifdef HAVE_CONFIG_H
868b2b66 (kx 2024-12-20 16:11:07 +0300 3) #include <config.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 4) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6) #include <nls.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 7)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8) #include <errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 9) #include <locale.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 10)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 12) #include <mpu-context.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 13) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 14)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15) /* Allocate MPU Context in .tbss segment: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16) __thread struct __mpu_context mctx;
868b2b66 (kx 2024-12-20 16:11:07 +0300 17)
868b2b66 (kx 2024-12-20 16:11:07 +0300 18) /* Share address of mpu_context: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 19) struct __mpu_context *pmctx;
868b2b66 (kx 2024-12-20 16:11:07 +0300 20)
868b2b66 (kx 2024-12-20 16:11:07 +0300 21) /* Should be called at start of main thread and at start of each posix threads: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 22) void __mpu_init( void )
868b2b66 (kx 2024-12-20 16:11:07 +0300 23) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 24) pmctx = &mctx;
868b2b66 (kx 2024-12-20 16:11:07 +0300 25)
868b2b66 (kx 2024-12-20 16:11:07 +0300 26) mctx._ierrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 27) mctx._rerrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 28) mctx._cerrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 29) mctx._merrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 30) mctx._ewarns = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 31)
868b2b66 (kx 2024-12-20 16:11:07 +0300 32) mctx.mflags = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 33)
868b2b66 (kx 2024-12-20 16:11:07 +0300 34) pmctx->_cur_brk = (__mpu_void_t *)&((pmctx->_mem)[0]);
868b2b66 (kx 2024-12-20 16:11:07 +0300 35)
868b2b66 (kx 2024-12-20 16:11:07 +0300 36) #if ENABLE_NLS == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 37) setlocale( LC_ALL, "" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 38) bind_textdomain_codeset( PACKAGE, "UTF-8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 39) textdomain( PACKAGE );
868b2b66 (kx 2024-12-20 16:11:07 +0300 40) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 41) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 42)
868b2b66 (kx 2024-12-20 16:11:07 +0300 43) /************************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 44) User may call the __mpu_free_context() function when needed to
868b2b66 (kx 2024-12-20 16:11:07 +0300 45) clear MPU context and all allocated memory resources.
868b2b66 (kx 2024-12-20 16:11:07 +0300 46)
868b2b66 (kx 2024-12-20 16:11:07 +0300 47) We do not use __mpu_weak_alias() because the __mpu_weak_alias() macro
868b2b66 (kx 2024-12-20 16:11:07 +0300 48) is dedicated to create aliases of external symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 49) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 50) #if defined( HAVE_WEAK_SYMBOLS )
868b2b66 (kx 2024-12-20 16:11:07 +0300 51) void __mpu_free_context( void ) __attribute__ ((weak, alias ("__mpu_init")));
868b2b66 (kx 2024-12-20 16:11:07 +0300 52) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 53) void __mpu_free_context( void ) __attribute__ ((alias ("__mpu_init")));
868b2b66 (kx 2024-12-20 16:11:07 +0300 54) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 55)
868b2b66 (kx 2024-12-20 16:11:07 +0300 56)
868b2b66 (kx 2024-12-20 16:11:07 +0300 57) static int
868b2b66 (kx 2024-12-20 16:11:07 +0300 58) __mpu_brk( __mpu_void_t *end_d )
868b2b66 (kx 2024-12-20 16:11:07 +0300 59) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 60) __mpu_void_t *ptr = __mem;
868b2b66 (kx 2024-12-20 16:11:07 +0300 61)
868b2b66 (kx 2024-12-20 16:11:07 +0300 62) if( (__mpu_UNIT_t *)end_d < (__mpu_UNIT_t *)ptr ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 63) (__mpu_UNIT_t *)end_d > (__mpu_UNIT_t *)ptr + REGISTERS_MEM_SIZE_IN_UNITS )
868b2b66 (kx 2024-12-20 16:11:07 +0300 64) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 65) errno = ENOMEM;
868b2b66 (kx 2024-12-20 16:11:07 +0300 66) return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 67) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 68)
868b2b66 (kx 2024-12-20 16:11:07 +0300 69) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 70) __cur_brk = (__tx_UNIT_t *)end_d;
868b2b66 (kx 2024-12-20 16:11:07 +0300 71)
868b2b66 (kx 2024-12-20 16:11:07 +0300 72) Функция __mpu_brk() лишь проверяет границы
868b2b66 (kx 2024-12-20 16:11:07 +0300 73) области памяти, значение __cur_brk выставляется
868b2b66 (kx 2024-12-20 16:11:07 +0300 74) в __mpu_sbrk() .
868b2b66 (kx 2024-12-20 16:11:07 +0300 75) *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 76)
868b2b66 (kx 2024-12-20 16:11:07 +0300 77) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 78)
868b2b66 (kx 2024-12-20 16:11:07 +0300 79) } /* End of __mpu_brk() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 80)
868b2b66 (kx 2024-12-20 16:11:07 +0300 81)
868b2b66 (kx 2024-12-20 16:11:07 +0300 82) __mpu_void_t *
868b2b66 (kx 2024-12-20 16:11:07 +0300 83) __mpu_sbrk( int incr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 84) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 85) __mpu_void_t *ptr = __cur_brk;
868b2b66 (kx 2024-12-20 16:11:07 +0300 86) register int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 87)
868b2b66 (kx 2024-12-20 16:11:07 +0300 88) if( incr == 0 ) return( ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 89)
868b2b66 (kx 2024-12-20 16:11:07 +0300 90) rc = __mpu_brk( ptr + incr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 91) if( rc == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 92) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 93) /* errno is set into __mpu_brk() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 94) return( (__mpu_void_t *)0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 95) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 96)
868b2b66 (kx 2024-12-20 16:11:07 +0300 97) __cur_brk = ((__mpu_UNIT_t *)ptr) + (int)incr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 98)
868b2b66 (kx 2024-12-20 16:11:07 +0300 99) return( ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) } /* End of __mpu_sbrk() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 102)
868b2b66 (kx 2024-12-20 16:11:07 +0300 103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 104) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 105) For external purposes:
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) __mpu_error_t *__ptr_integer_error_no( void ) { return( &mctx._ierrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) __mpu_error_t *__ptr_real_error_no ( void ) { return( &mctx._rerrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) __mpu_error_t *__ptr_complex_error_no( void ) { return( &mctx._cerrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) __mpu_error_t *__ptr_math_error_no ( void ) { return( &mctx._merrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) __mpu_error_t *__ptr_extra_warnings ( void ) { return( &mctx._ewarns ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) void __mpu_clear_iflags( void ) { __CLEAR_IFLAGS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) void __mpu_clear_rflags( void ) { __CLEAR_RFLAGS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 116) void __mpu_clear_mflags( void ) { __CLEAR_MFLAGS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 118)
31f615c1 (kx 2024-12-28 23:52:17 +0300 119) int __mpu_gta( void ) { return __MFLAG( AF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 120) int __mpu_gtc( void ) { return __MFLAG( CF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 121) int __mpu_gto( void ) { return __MFLAG( OF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 122) int __mpu_gts( void ) { return __MFLAG( SF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 123) int __mpu_gtp( void ) { return __MFLAG( PF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 124) int __mpu_gtz( void ) { return __MFLAG( ZF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 125) int __mpu_gtr( void ) { return __MFLAG( RF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 126) int __mpu_gtv( void ) { return __MFLAG( VF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 127)
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) void __mpu_sta( void ) { __STA; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) void __mpu_stc( void ) { __STC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) void __mpu_sto( void ) { __STO; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 131) void __mpu_sts( void ) { __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) void __mpu_stp( void ) { __STP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) void __mpu_stz( void ) { __STZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) void __mpu_str( void ) { __STR; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) void __mpu_stv( void ) { __STV; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 136)
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) void __mpu_cla( void ) { __CLA; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) void __mpu_clc( void ) { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) void __mpu_clo( void ) { __CLO; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 140) void __mpu_cls( void ) { __CLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) void __mpu_clp( void ) { __CLP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) void __mpu_clz( void ) { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 143) void __mpu_clr( void ) { __CLR; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 144) void __mpu_clv( void ) { __CLV; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 146) void __mpu_cma( void ) { __CMA; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 147) void __mpu_cmc( void ) { __CMC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 148) void __mpu_cmo( void ) { __CMO; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 149) void __mpu_cms( void ) { __CMS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 150) void __mpu_cmp( void ) { __CMP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) void __mpu_cmz( void ) { __CMZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 152) void __mpu_cmr( void ) { __CMR; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) void __mpu_cmv( void ) { __CMV; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 155)
31f615c1 (kx 2024-12-28 23:52:17 +0300 156) int __mpu_gtdom( void ) { return __MFLAG( DOMF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 157) int __mpu_gtsng( void ) { return __MFLAG( SNGF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 158) int __mpu_gtovf( void ) { return __MFLAG( OVFF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 159) int __mpu_gtudf( void ) { return __MFLAG( UDFF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 160) int __mpu_gttls( void ) { return __MFLAG( TLSF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 161) int __mpu_gtpls( void ) { return __MFLAG( PLSF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 162) int __mpu_gtind( void ) { return __MFLAG( INDF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 163) int __mpu_gtinx( void ) { return __MFLAG( INXF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) void __mpu_stdom( void ) { __STDOM; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 166) void __mpu_stsng( void ) { __STSNG; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 167) void __mpu_stovf( void ) { __STOVF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 168) void __mpu_studf( void ) { __STUDF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 169) void __mpu_sttls( void ) { __STTLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 170) void __mpu_stpls( void ) { __STPLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 171) void __mpu_stind( void ) { __STIND; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 172) void __mpu_stinx( void ) { __STINX; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 173)
868b2b66 (kx 2024-12-20 16:11:07 +0300 174) void __mpu_cldom( void ) { __CLDOM; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 175) void __mpu_clsng( void ) { __CLSNG; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 176) void __mpu_clovf( void ) { __CLOVF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 177) void __mpu_cludf( void ) { __CLUDF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 178) void __mpu_cltls( void ) { __CLTLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 179) void __mpu_clpls( void ) { __CLPLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 180) void __mpu_clind( void ) { __CLIND; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 181) void __mpu_clinx( void ) { __CLINX; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 182)
868b2b66 (kx 2024-12-20 16:11:07 +0300 183) void __mpu_cmdom( void ) { __CMDOM; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 184) void __mpu_cmsng( void ) { __CMSNG; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 185) void __mpu_cmovf( void ) { __CMOVF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) void __mpu_cmudf( void ) { __CMUDF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 187) void __mpu_cmtls( void ) { __CMTLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 188) void __mpu_cmpls( void ) { __CMPLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 189) void __mpu_cmind( void ) { __CMIND; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 190) void __mpu_cminx( void ) { __CMINX; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 191)