* libgloss/nds32/_exit.S: Finish with an infinite loop in _exit.
* libgloss/nds32/_getpid.S: Don't issue _getpid system call, it is always successful. * libgloss/nds32/_gettimeofday.S: No error for _gettimeofday is defined in SYS_geterr handler. * libgloss/nds32/_isatty.S: No error for _isatty is defined in SYS_geterr handler. * libgloss/nds32/_kill.S: Alway fail. errno = EINVAL. * libgloss/nds32/_link.S: Alway fail. errno = EMLINK. * libgloss/nds32/_times.S: Alway fail. errno = EACCES. * libgloss/nds32/_unlink.S: fix copy and paste error. * libgloss/nds32/crt0.S: Add pre_c_init, post_c_init, arg_init. * libgloss/nds32/crt1.S: Add pre_c_init, post_c_init, arg_init. * libgloss/nds32/syscall_extra.h: Re-format. * libgloss/nds32/vh.h: Add more virtual hosting number.
This commit is contained in:
parent
0cbcde7bdb
commit
d4ef8a6368
@ -1,3 +1,21 @@
|
|||||||
|
2014-12-15 Nick Hung <nick@andestech.com>
|
||||||
|
|
||||||
|
* libgloss/nds32/_exit.S: Finish with an infinite loop in _exit.
|
||||||
|
* libgloss/nds32/_getpid.S: Don't issue _getpid system call, it is
|
||||||
|
always successful.
|
||||||
|
* libgloss/nds32/_gettimeofday.S: No error for _gettimeofday is defined
|
||||||
|
in SYS_geterr handler.
|
||||||
|
* libgloss/nds32/_isatty.S: No error for _isatty is defined in
|
||||||
|
SYS_geterr handler.
|
||||||
|
* libgloss/nds32/_kill.S: Alway fail. errno = EINVAL.
|
||||||
|
* libgloss/nds32/_link.S: Alway fail. errno = EMLINK.
|
||||||
|
* libgloss/nds32/_times.S: Alway fail. errno = EACCES.
|
||||||
|
* libgloss/nds32/_unlink.S: fix copy and paste error.
|
||||||
|
* libgloss/nds32/crt0.S: Add pre_c_init, post_c_init, arg_init.
|
||||||
|
* libgloss/nds32/crt1.S: Add pre_c_init, post_c_init, arg_init.
|
||||||
|
* libgloss/nds32/syscall_extra.h: Re-format.
|
||||||
|
* libgloss/nds32/vh.h: Add more virtual hosting number.
|
||||||
|
|
||||||
2014-12-11 Anthony Green <green@moxielogic.com>
|
2014-12-11 Anthony Green <green@moxielogic.com>
|
||||||
|
|
||||||
* moxie/configure: Rebuilt.
|
* moxie/configure: Rebuilt.
|
||||||
|
@ -27,22 +27,18 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
#ifdef __NDS32_VH__
|
|
||||||
|
|
||||||
#include "vh.h"
|
#include "vh.h"
|
||||||
.extern _impure_ptr
|
|
||||||
TYPE3 _exit, VH_EXIT
|
|
||||||
|
|
||||||
#else /* not __NDS32_VH__ */
|
|
||||||
|
|
||||||
#include "../syscall.h"
|
#include "../syscall.h"
|
||||||
#include "syscall_extra.h"
|
.text
|
||||||
.section .text
|
|
||||||
.global _exit
|
.global _exit
|
||||||
.type _exit, @function
|
.type _exit, @function
|
||||||
.align 2
|
.align 2
|
||||||
_exit:
|
_exit:
|
||||||
|
#ifdef __NDS32_VH__
|
||||||
|
BREAK VH_EXIT /* Generate_Exception(Breakpoint); */
|
||||||
|
#else
|
||||||
syscall SYS_exit /* Make syscall 'SYS_exit'. */
|
syscall SYS_exit /* Make syscall 'SYS_exit'. */
|
||||||
|
#endif
|
||||||
|
.L_infinite_loop:
|
||||||
|
b .L_infinite_loop
|
||||||
.size _exit, .-_exit
|
.size _exit, .-_exit
|
||||||
|
|
||||||
#endif /* not __NDS32_VH__ */
|
|
||||||
|
@ -28,10 +28,13 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __NDS32_VH__
|
.text
|
||||||
|
.global _getpid
|
||||||
#include "../syscall.h"
|
.type _getpid, @function
|
||||||
#include "syscall_extra.h"
|
.align 2
|
||||||
SYS_WRAPPER _getpid, SYS_getpid
|
_getpid:
|
||||||
|
/* The getpid() function shall always be successful and
|
||||||
#endif /* not __NDS32_VH__ */
|
no return value is reserved to indicate an error. */
|
||||||
|
movi $r0, 1 /* A minimal implementation, success. */
|
||||||
|
ret
|
||||||
|
.size _getpid, .-_getpid
|
||||||
|
@ -30,13 +30,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifdef __NDS32_VH__
|
#ifdef __NDS32_VH__
|
||||||
|
|
||||||
#include "vh.h"
|
#include "vh.h"
|
||||||
.extern _impure_ptr
|
|
||||||
TYPE3 _gettimeofday, VH_GETTIMEOFDAY
|
TYPE3 _gettimeofday, VH_GETTIMEOFDAY
|
||||||
|
|
||||||
#else /* not __NDS32_VH__ */
|
#else /* not __NDS32_VH__ */
|
||||||
|
|
||||||
#include "../syscall.h"
|
#include "../syscall.h"
|
||||||
#include "syscall_extra.h"
|
#include "syscall_extra.h"
|
||||||
SYS_WRAPPER _gettimeofday, SYS_gettimeofday
|
.text
|
||||||
|
.global _gettimeofday
|
||||||
|
.type _gettimeofday, @function
|
||||||
|
.align 2
|
||||||
|
_gettimeofday:
|
||||||
|
syscall SYS_gettimeofday
|
||||||
|
ret
|
||||||
|
.size _gettimeofday, .-_gettimeofday
|
||||||
|
|
||||||
#endif /* not __NDS32_VH__ */
|
#endif /* not __NDS32_VH__ */
|
||||||
|
@ -27,6 +27,15 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
|
SYNOPSIS
|
||||||
|
#include <unistd.h>
|
||||||
|
int isatty(int fildes);
|
||||||
|
RETURN VALUE
|
||||||
|
The isatty() function shall return 1 if fildes is associated with
|
||||||
|
a terminal; otherwise, it shall return 0 and may set errno
|
||||||
|
to indicate the error.
|
||||||
|
*/
|
||||||
#ifdef __NDS32_VH__
|
#ifdef __NDS32_VH__
|
||||||
|
|
||||||
#include "vh.h"
|
#include "vh.h"
|
||||||
@ -37,6 +46,21 @@ TYPE0 _isatty, VH_ISATTY
|
|||||||
|
|
||||||
#include "../syscall.h"
|
#include "../syscall.h"
|
||||||
#include "syscall_extra.h"
|
#include "syscall_extra.h"
|
||||||
SYS_WRAPPER _isatty, SYS_isatty
|
.text
|
||||||
|
.global _isatty
|
||||||
|
.type _isatty, @function
|
||||||
|
.align 2
|
||||||
|
_isatty:
|
||||||
|
syscall SYS_isatty /* Make syscall with SWID=`SYS_isatty'.
|
||||||
|
Reture value `0' stored in $r0 means
|
||||||
|
there is something wrong. */
|
||||||
|
bnez $r0, 1f /* Branch if success. */
|
||||||
|
syscall SYS_geterr /* There is something wrong. */
|
||||||
|
l.w $r15, _impure_ptr
|
||||||
|
swi $r0, [$r15] /* Set errno. */
|
||||||
|
move $r0, #0
|
||||||
|
1:
|
||||||
|
ret
|
||||||
|
.size _isatty, .-_isatty
|
||||||
|
|
||||||
#endif /* not __NDS32_VH__ */
|
#endif /* not __NDS32_VH__ */
|
||||||
|
@ -27,11 +27,20 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
/* Upon successful completion, 0 shall be returned. Otherwise,
|
||||||
#ifndef __NDS32_VH__
|
-1 shall be returned and errno set to indicate the error. */
|
||||||
|
.extern _impure_ptr /* The first element is _errno. */
|
||||||
#include "../syscall.h"
|
.text
|
||||||
#include "syscall_extra.h"
|
.global _kill
|
||||||
SYS_WRAPPER _kill, SYS_kill
|
.type _kill, @function
|
||||||
|
.align 2
|
||||||
#endif /* not __NDS32_VH__ */
|
_kill:
|
||||||
|
/* A minimal implementation has no concept of either signals,
|
||||||
|
nor of processes to receive those signals. So this function
|
||||||
|
should always fail with an appropriate value in errno. */
|
||||||
|
movi $r0, #22 /* EINVAL: Invalid argument */
|
||||||
|
l.w $r15, _impure_ptr
|
||||||
|
swi $r0, [$r15]
|
||||||
|
movi $r0, -1 /* Set return value to -1. */
|
||||||
|
ret
|
||||||
|
.size _kill, .-_kill
|
||||||
|
@ -27,10 +27,19 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
#ifndef __NDS32_VH__
|
/* Upon successful completion, 0 shall be returned. Otherwise,
|
||||||
|
-1 shall be returned and errno set to indicate the error. */
|
||||||
#include "../syscall.h"
|
.extern _impure_ptr /* The first element is _errno. */
|
||||||
#include "syscall_extra.h"
|
.text
|
||||||
SYS_WRAPPER _link, SYS_link
|
.global _link
|
||||||
|
.type _link, @function
|
||||||
#endif /* not __NDS32_VH__ */
|
.align 2
|
||||||
|
_link:
|
||||||
|
/* A minimal implementation has no file system, so this function
|
||||||
|
must always fail, with an appropriate value set in errno. */
|
||||||
|
movi $r0, #31 /* EMLINK: Too many links */
|
||||||
|
l.w $r15, _impure_ptr
|
||||||
|
swi $r0, [$r15]
|
||||||
|
movi $r0, -1 /* Set return value to -1. */
|
||||||
|
ret
|
||||||
|
.size _link, .-_link
|
||||||
|
@ -27,10 +27,19 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
#ifndef __NDS32_VH__
|
/* If times() fails, (clock_t)-1 shall be returned and errno set
|
||||||
|
to indicate the error. */
|
||||||
#include "../syscall.h"
|
.extern _impure_ptr /* The first element is _errno. */
|
||||||
#include "syscall_extra.h"
|
.text
|
||||||
SYS_WRAPPER _times, SYS_times
|
.global _times
|
||||||
|
.type _times, @function
|
||||||
#endif /* not __NDS32_VH__ */
|
.align 2
|
||||||
|
_times:
|
||||||
|
/* A minimal implementation need not offer any timing information,
|
||||||
|
so should always fail with an appropriate value in errno. */
|
||||||
|
movi $r0, #13 /* EACCES: Permission denied */
|
||||||
|
l.w $r15, _impure_ptr
|
||||||
|
swi $r0, [$r15]
|
||||||
|
movi $r0, -1 /* Set return value to -1. */
|
||||||
|
ret
|
||||||
|
.size _times, .-_times
|
||||||
|
@ -32,7 +32,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "vh.h"
|
#include "vh.h"
|
||||||
.extern _impure_ptr
|
.extern _impure_ptr
|
||||||
TYPE1 _lseek, VH_LSEEK
|
TYPE1 _unlink, VH_UNLINK
|
||||||
|
|
||||||
#else /* not __NDS32_VH__ */
|
#else /* not __NDS32_VH__ */
|
||||||
|
|
||||||
|
@ -36,6 +36,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
##
|
##
|
||||||
##==============================================================================
|
##==============================================================================
|
||||||
|
|
||||||
|
#include "syscall_extra.h"
|
||||||
|
|
||||||
##------------------------------------------------------------------------------
|
##------------------------------------------------------------------------------
|
||||||
## Vector table setup
|
## Vector table setup
|
||||||
##------------------------------------------------------------------------------
|
##------------------------------------------------------------------------------
|
||||||
@ -47,6 +49,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
##------------------------------------------------------------------------------
|
##------------------------------------------------------------------------------
|
||||||
.section .text
|
.section .text
|
||||||
.weak _SDA_BASE_
|
.weak _SDA_BASE_
|
||||||
|
.weak _ITB_BASE_
|
||||||
|
.weak _arg_init
|
||||||
|
.weak __pre_c_init
|
||||||
|
.weak __post_c_init
|
||||||
|
.weak _call_exit
|
||||||
.global _start
|
.global _start
|
||||||
.type _start, @function
|
.type _start, @function
|
||||||
.align 2
|
.align 2
|
||||||
@ -60,8 +67,22 @@ _start:
|
|||||||
determined by Linker. SDA stands for Small Data Access. */
|
determined by Linker. SDA stands for Small Data Access. */
|
||||||
la $gp, _SDA_BASE_
|
la $gp, _SDA_BASE_
|
||||||
|
|
||||||
|
#if __NDS32_EXT_EX9__
|
||||||
|
.L_init_itb:
|
||||||
|
/* Initialization for Instruction Table Base (ITB).
|
||||||
|
The symbol _ITB_BASE_ is determined by Linker.
|
||||||
|
Set $ITB only if MSC_CFG.EIT (cr4.b'24) is set. */
|
||||||
|
mfsr $r0, $MSC_CFG
|
||||||
|
srli $r0, $r0, 24
|
||||||
|
andi $r0, $r0, 0x1
|
||||||
|
beqz $r0, 1f /* Fall through ? */
|
||||||
|
la $r0, _ITB_BASE_
|
||||||
|
mtusr $r0, $ITB
|
||||||
|
1:
|
||||||
|
#endif
|
||||||
|
|
||||||
.L_init_sp:
|
.L_init_sp:
|
||||||
/* Initialization for stack pointe. The symbol _stack is defined
|
/* Initialization for stack pointer. The symbol _stack is defined
|
||||||
in linker script. Make sure $sp is 8-byte aligned. */
|
in linker script. Make sure $sp is 8-byte aligned. */
|
||||||
la $sp, _stack
|
la $sp, _stack
|
||||||
#if __NDS32_ISA_V3__
|
#if __NDS32_ISA_V3__
|
||||||
@ -71,23 +92,33 @@ _start:
|
|||||||
and $sp, $sp, $r0
|
and $sp, $sp, $r0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __NDS32_EX9_EXT__
|
#if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__
|
||||||
.L_init_itb:
|
.L_init_fpu:
|
||||||
/* Initialization for Instruction Table Base (ITB).
|
/* Initialize FPU
|
||||||
The symbol $_ITB_BASE_ is determined by Linker.
|
Set FUCOP_CTL.CP0EN (fucpr.b'0). */
|
||||||
Set $ITB only if MSC_CFG.EIT (cr4.b'24) is set. */
|
mfsr $r0, $FUCOP_CTL
|
||||||
mfsr $r0, $MSC_CFG
|
ori $r0, $r0, 0x1
|
||||||
srli $r0, $r0, 24
|
mtsr $r0, $FUCOP_CTL
|
||||||
andi $r0, $r0, 0x1
|
dsb
|
||||||
beqz $r0, .L_zero_out_bss /* Fall through ? */
|
/* According to [bugzilla #9425], set flush-to-zero mode.
|
||||||
la $r0, $_ITB_BASE_
|
That is, set $FPCSR.DNZ(b'12) = 1. */
|
||||||
mtusr $r0, $ITB
|
FMFCSR $r0
|
||||||
|
ori $r0, $r0, 0x1000
|
||||||
|
FMTCSR $r0
|
||||||
|
dsb
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
.L_pre_c_init:
|
||||||
|
! call __pre_c_init if provided
|
||||||
|
! sample __pre_c_init is in BSP
|
||||||
|
la $r15, __pre_c_init ! load address of __pre_c_init
|
||||||
|
beqz $r15, .L_zero_out_bss ! check existence of __pre_c_init
|
||||||
|
jral $r15 ! pre-c-runtime initialization
|
||||||
|
|
||||||
.L_zero_out_bss:
|
.L_zero_out_bss:
|
||||||
/* Zero out the bss section.
|
/* Zero out the bss section.
|
||||||
Equivalence C code for follow part:
|
Equivalence C code for follow part:
|
||||||
if (_end == _edata) goto .L_call_main
|
if (_end == _edata) goto .L_post_c_init
|
||||||
unsinged int *ptr = _edata;
|
unsinged int *ptr = _edata;
|
||||||
while (ptr != _end)
|
while (ptr != _end)
|
||||||
*ptr++ = 0
|
*ptr++ = 0
|
||||||
@ -98,21 +129,52 @@ _start:
|
|||||||
la $r0, _edata
|
la $r0, _edata
|
||||||
la $r1, _end
|
la $r1, _end
|
||||||
movi $r2, #0
|
movi $r2, #0
|
||||||
beq $r0, $r1, .L_call_main /* Branch if no bss. */
|
beq $r0, $r1, .L_post_c_init /* Branch if no bss. */
|
||||||
.Lword_clear:
|
.Lword_clear:
|
||||||
swi.bi $r2, [$r0], #4
|
swi.bi $r2, [$r0], #4
|
||||||
bne $r0, $r1, .Lword_clear
|
bne $r0, $r1, .Lword_clear
|
||||||
|
|
||||||
.L_call_main:
|
.L_post_c_init:
|
||||||
|
! call __post_c_init if provided
|
||||||
|
! no sample __post_c_init is provided
|
||||||
|
la $r15, __post_c_init ! load address of __post_c_init
|
||||||
|
beqz $r15, .L_arg_init ! check existence of __post_c_init
|
||||||
|
jral $r15 ! post-c-runtime initialization
|
||||||
|
|
||||||
|
.L_arg_init:
|
||||||
|
! argc/argv initialization if necessary
|
||||||
|
la $r7, _arg_init ! get address of _arg_init
|
||||||
|
beqz $r7, .L_clean_reg ! if there isn't _arg_init, go main
|
||||||
|
addi $sp, $sp, -512 ! allocate space for command line
|
||||||
|
! and arguments
|
||||||
|
move $r6, $sp ! r6 = buffer addr of cmd line
|
||||||
|
move $r0, $r6 ! r0 = buffer addr of cmd line
|
||||||
|
syscall SYS_getcmdline ! get cmd line
|
||||||
|
move $r0, $r6 ! r0 = buffer addr of cmd line
|
||||||
|
addi $r1, $r6, 256 ! r1 = argv
|
||||||
|
jral $r7 ! init argc/argv
|
||||||
|
addi $r1, $r6, 256 ! r1 = argv
|
||||||
|
b .L_call_main
|
||||||
|
|
||||||
|
.L_clean_reg:
|
||||||
/* Prepare argc/argv/env for main function.
|
/* Prepare argc/argv/env for main function.
|
||||||
Since there is no operating system so far,
|
Since there is no operating system so far,
|
||||||
we set $r0, $r1, and $r2 to be zero.
|
we set $r0, $r1, and $r2 to be zero.
|
||||||
Note: $r2 already set to zero in line 84. */
|
Note: $r2 already set to zero in .L_zero_out_bss: code fragment. */
|
||||||
movi $r0, 0
|
movi $r0, 0
|
||||||
movi $r1, 0
|
movi $r1, 0
|
||||||
|
movi $r2, 0
|
||||||
|
|
||||||
|
.L_call_main:
|
||||||
/* Call 'main'. */
|
/* Call 'main'. */
|
||||||
bal main
|
bal main
|
||||||
|
|
||||||
|
/* Call _call_exit. */
|
||||||
|
! call _call_exit if necessary; default implementation is in crtexit.c
|
||||||
|
la $r15, _call_exit ! load address of _call_exit
|
||||||
|
beqz $r15, .L_terminate_program ! no _call_exit? go exit
|
||||||
|
jral $r15 ! _call_exit will never return
|
||||||
|
|
||||||
.L_terminate_program:
|
.L_terminate_program:
|
||||||
/* There are two ways to terminate program:
|
/* There are two ways to terminate program:
|
||||||
1. User "syscall 0x1" directly.
|
1. User "syscall 0x1" directly.
|
||||||
|
@ -36,6 +36,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
##
|
##
|
||||||
##==============================================================================
|
##==============================================================================
|
||||||
|
|
||||||
|
#include "syscall_extra.h"
|
||||||
|
|
||||||
##------------------------------------------------------------------------------
|
##------------------------------------------------------------------------------
|
||||||
## Vector table setup
|
## Vector table setup
|
||||||
##------------------------------------------------------------------------------
|
##------------------------------------------------------------------------------
|
||||||
@ -47,6 +49,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
##------------------------------------------------------------------------------
|
##------------------------------------------------------------------------------
|
||||||
.section .text
|
.section .text
|
||||||
.weak _SDA_BASE_
|
.weak _SDA_BASE_
|
||||||
|
.weak _ITB_BASE_
|
||||||
|
.weak _arg_init
|
||||||
|
.weak __pre_c_init
|
||||||
|
.weak __post_c_init
|
||||||
|
.weak _call_exit
|
||||||
.global _start
|
.global _start
|
||||||
.type _start, @function
|
.type _start, @function
|
||||||
.align 2
|
.align 2
|
||||||
@ -60,8 +67,22 @@ _start:
|
|||||||
determined by Linker. SDA stands for Small Data Access. */
|
determined by Linker. SDA stands for Small Data Access. */
|
||||||
la $gp, _SDA_BASE_
|
la $gp, _SDA_BASE_
|
||||||
|
|
||||||
|
#if __NDS32_EXT_EX9__
|
||||||
|
.L_init_itb:
|
||||||
|
/* Initialization for Instruction Table Base (ITB).
|
||||||
|
The symbol _ITB_BASE_ is determined by Linker.
|
||||||
|
Set $ITB only if MSC_CFG.EIT (cr4.b'24) is set. */
|
||||||
|
mfsr $r0, $MSC_CFG
|
||||||
|
srli $r0, $r0, 24
|
||||||
|
andi $r0, $r0, 0x1
|
||||||
|
beqz $r0, 1f /* Fall through ? */
|
||||||
|
la $r0, _ITB_BASE_
|
||||||
|
mtusr $r0, $ITB
|
||||||
|
1:
|
||||||
|
#endif
|
||||||
|
|
||||||
.L_init_sp:
|
.L_init_sp:
|
||||||
/* Initialization for stack pointe. The symbol _stack is defined
|
/* Initialization for stack pointer. The symbol _stack is defined
|
||||||
in linker script. Make sure $sp is 8-byte aligned. */
|
in linker script. Make sure $sp is 8-byte aligned. */
|
||||||
la $sp, _stack
|
la $sp, _stack
|
||||||
#if __NDS32_ISA_V3__
|
#if __NDS32_ISA_V3__
|
||||||
@ -71,19 +92,29 @@ _start:
|
|||||||
and $sp, $sp, $r0
|
and $sp, $sp, $r0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __NDS32_EX9_EXT__
|
#if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__
|
||||||
.L_init_itb:
|
.L_init_fpu:
|
||||||
/* Initialization for Instruction Table Base (ITB).
|
/* Initialize FPU
|
||||||
The symbol $_ITB_BASE_ is determined by Linker.
|
Set FUCOP_CTL.CP0EN (fucpr.b'0). */
|
||||||
Set $ITB only if MSC_CFG.EIT (cr4.b'24) is set. */
|
mfsr $r0, $FUCOP_CTL
|
||||||
mfsr $r0, $MSC_CFG
|
ori $r0, $r0, 0x1
|
||||||
srli $r0, $r0, 24
|
mtsr $r0, $FUCOP_CTL
|
||||||
andi $r0, $r0, 0x1
|
dsb
|
||||||
beqz $r0, .L_zero_out_bss /* Fall through ? */
|
/* According to [bugzilla #9425], set flush-to-zero mode.
|
||||||
la $r0, $_ITB_BASE_
|
That is, set $FPCSR.DNZ(b'12) = 1. */
|
||||||
mtusr $r0, $ITB
|
FMFCSR $r0
|
||||||
|
ori $r0, $r0, 0x1000
|
||||||
|
FMTCSR $r0
|
||||||
|
dsb
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
.L_pre_c_init:
|
||||||
|
! call __pre_c_init if provided
|
||||||
|
! sample __pre_c_init is in BSP
|
||||||
|
la $r15, __pre_c_init ! load address of __pre_c_init
|
||||||
|
beqz $r15, .L_zero_out_bss ! check existence of __pre_c_init
|
||||||
|
jral $r15 ! pre-c-runtime initialization
|
||||||
|
|
||||||
.L_zero_out_bss:
|
.L_zero_out_bss:
|
||||||
/* Zero out the bss section.
|
/* Zero out the bss section.
|
||||||
Equivalence C code for follow part:
|
Equivalence C code for follow part:
|
||||||
@ -97,28 +128,61 @@ _start:
|
|||||||
*/
|
*/
|
||||||
la $r0, _edata
|
la $r0, _edata
|
||||||
la $r1, _end
|
la $r1, _end
|
||||||
beq $r0, $r1, .L_call_main /* Branch if no bss. */
|
|
||||||
movi $r2, #0
|
movi $r2, #0
|
||||||
|
beq $r0, $r1, .L_cpp_init /* Branch if no bss. */
|
||||||
.Lword_clear:
|
.Lword_clear:
|
||||||
swi.bi $r2, [$r0], #4
|
swi.bi $r2, [$r0], #4
|
||||||
bne $r0, $r1, .Lword_clear
|
bne $r0, $r1, .Lword_clear
|
||||||
|
|
||||||
.L_call_main:
|
.L_cpp_init:
|
||||||
/* Call '_init' to invoke constructors. */
|
/* Call '_init' to invoke constructors. */
|
||||||
jal _init
|
jal _init
|
||||||
/* Register '_fini' into atexit() to invoke destructors when
|
/* Register '_fini' into atexit() to invoke destructors when
|
||||||
exit() has been reached. */
|
exit() has been reached. */
|
||||||
la $r0, _fini
|
la $r0, _fini
|
||||||
jal atexit
|
jal atexit
|
||||||
|
|
||||||
|
.L_post_c_init:
|
||||||
|
! call __post_c_init if provided
|
||||||
|
! no sample __post_c_init is provided
|
||||||
|
la $r15, __post_c_init ! load address of __post_c_init
|
||||||
|
beqz $r15, .L_arg_init ! check existence of __post_c_init
|
||||||
|
jral $r15 ! post-c-runtime initialization
|
||||||
|
|
||||||
|
.L_arg_init:
|
||||||
|
! argc/argv initialization if necessary
|
||||||
|
la $r7, _arg_init ! get address of _arg_init
|
||||||
|
beqz $r7, .L_clean_reg ! if there isn't _arg_init, go main
|
||||||
|
addi $sp, $sp, -512 ! allocate space for command line
|
||||||
|
! and arguments
|
||||||
|
move $r6, $sp ! r6 = buffer addr of cmd line
|
||||||
|
move $r0, $r6 ! r0 = buffer addr of cmd line
|
||||||
|
syscall SYS_getcmdline ! get cmd line
|
||||||
|
move $r0, $r6 ! r0 = buffer addr of cmd line
|
||||||
|
addi $r1, $r6, 256 ! r1 = argv
|
||||||
|
jral $r7 ! init argc/argv
|
||||||
|
addi $r1, $r6, 256 ! r1 = argv
|
||||||
|
b .L_call_main
|
||||||
|
|
||||||
|
.L_clean_reg:
|
||||||
/* Prepare argc/argv/env for main function.
|
/* Prepare argc/argv/env for main function.
|
||||||
Since there is no operating system so far,
|
Since there is no operating system so far,
|
||||||
we set $r0, $r1, and $r2 to be zero. */
|
we set $r0, $r1, and $r2 to be zero.
|
||||||
|
Note: $r2 already set to zero in .L_zero_out_bss: code fragment. */
|
||||||
movi $r0, 0
|
movi $r0, 0
|
||||||
movi $r1, 0
|
movi $r1, 0
|
||||||
movi $r2, 0
|
movi $r2, 0
|
||||||
|
|
||||||
|
.L_call_main:
|
||||||
/* Call 'main'. */
|
/* Call 'main'. */
|
||||||
bal main
|
bal main
|
||||||
|
|
||||||
|
/* Call _call_exit. */
|
||||||
|
! call _call_exit if necessary; default implementation is in crtexit.c
|
||||||
|
la $r15, _call_exit ! load address of _call_exit
|
||||||
|
beqz $r15, .L_terminate_program ! no _call_exit? go exit
|
||||||
|
jral $r15 ! _call_exit will never return
|
||||||
|
|
||||||
.L_terminate_program:
|
.L_terminate_program:
|
||||||
/* There are two ways to terminate program:
|
/* There are two ways to terminate program:
|
||||||
1. User "syscall 0x1" directly.
|
1. User "syscall 0x1" directly.
|
||||||
@ -128,7 +192,7 @@ _start:
|
|||||||
Currently, we use option 2 as a solution to follow C99 5.1.2.2.3,
|
Currently, we use option 2 as a solution to follow C99 5.1.2.2.3,
|
||||||
but aware that general exit() will do some cleanup procedures
|
but aware that general exit() will do some cleanup procedures
|
||||||
which may result in large-memory-footprints. */
|
which may result in large-memory-footprints. */
|
||||||
|
|
||||||
bal exit
|
bal exit
|
||||||
|
|
||||||
.L_forever_loop:
|
.L_forever_loop:
|
||||||
|
@ -32,11 +32,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
|
|
||||||
/* These are additional syscalls for nds32 target. */
|
/* These are additional syscalls for nds32 target. */
|
||||||
#define SYS_rename 3001
|
#define SYS_rename 3001
|
||||||
#define SYS_isatty 3002
|
#define SYS_isatty 3002
|
||||||
#define SYS_system 3003
|
#define SYS_system 3003
|
||||||
|
|
||||||
#define SYS_geterr 6001
|
#define SYS_geterr 6001
|
||||||
|
#define SYS_getcmdline 6002
|
||||||
|
|
||||||
|
|
||||||
/* Define macros that generate assembly output. */
|
/* Define macros that generate assembly output. */
|
||||||
|
@ -43,6 +43,9 @@ BREAK #SWID definition:
|
|||||||
#define VH_ISATTY 0x7F2B
|
#define VH_ISATTY 0x7F2B
|
||||||
#define VH_SYSTEM 0x7F2C
|
#define VH_SYSTEM 0x7F2C
|
||||||
#define VH_GETERR 0x7F2D /* The method we get errno. */
|
#define VH_GETERR 0x7F2D /* The method we get errno. */
|
||||||
|
#define VH_GETPID 0x7F2E
|
||||||
|
#define VH_KILL 0x7F2F
|
||||||
|
#define VH_TIMES 0x7F30
|
||||||
|
|
||||||
|
|
||||||
/* Define macros that generate assembly output.
|
/* Define macros that generate assembly output.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user