OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [synth/] [i386linux/] [current/] [src/] [vectors.S] - Blame information for rev 834

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
##=============================================================================
2
##
3
##      vectors.S
4
##
5
##      x86 exception vectors
6
##
7
##=============================================================================
8
## ####ECOSGPLCOPYRIGHTBEGIN####
9
## -------------------------------------------
10
## This file is part of eCos, the Embedded Configurable Operating System.
11
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
12
##
13
## eCos is free software; you can redistribute it and/or modify it under
14
## the terms of the GNU General Public License as published by the Free
15
## Software Foundation; either version 2 or (at your option) any later
16
## version.
17
##
18
## eCos is distributed in the hope that it will be useful, but WITHOUT
19
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20
## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21
## for more details.
22
##
23
## You should have received a copy of the GNU General Public License
24
## along with eCos; if not, write to the Free Software Foundation, Inc.,
25
## 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
26
##
27
## As a special exception, if other files instantiate templates or use
28
## macros or inline functions from this file, or you compile this file
29
## and link it with other works to produce a work based on this file,
30
## this file does not by itself cause the resulting work to be covered by
31
## the GNU General Public License. However the source code for this file
32
## must still be made available in accordance with section (3) of the GNU
33
## General Public License v2.
34
##
35
## This exception does not invalidate any other reasons why a work based
36
## on this file might be covered by the GNU General Public License.
37
## -------------------------------------------
38
## ####ECOSGPLCOPYRIGHTEND####
39
##=============================================================================
40
#######DESCRIPTIONBEGIN####
41
##
42
## Author(s):   bartv
43
## Contributors:bartv
44
## Date:        2001-03-16
45
## Purpose:     Synthetic target startup
46
## Description: When running on real hardware vectors.S contains
47
##              initialization code and usually the low-level interrupt and
48
##              exception support. On the synthetic target the latter is
49
##              handled by C code. The main initialization that is needed is
50
##              to jump into the C startup.
51
##
52
######DESCRIPTIONEND####
53
##
54
##=============================================================================
55
 
56
# According the SVR4/i386 ABI, most registers are undefined. However
57
# there is some interesting information on the stack:
58
#     %esp              argc
59
#     %esp+4            argv[0]
60
#     ...               argv[1 onwards]
61
#     %esp + (argc*4)   NULL
62
#     ...               environ[0]
63
#     ...               ...
64
#     ...               NULL
65
#
66
# There are some other things that could be done, for example aligning
67
# the stack to a 16-byte boundary for SSE, but it is not clear which of
68
# those things are actually useful. The glibc source file
69
# sysdeps/i386/elf/start.S contains some relevant information.
70
 
71
#==============================================================================
72
 
73
        .file   "vectors.S"
74
 
75
        .extern _hal_synth_user_desc
76
        .extern _linux_entry
77
 
78
        .data
79
        .global cyg_hal_sys_argc
80
cyg_hal_sys_argc:
81
        .long   0
82
        .global cyg_hal_sys_argv
83
cyg_hal_sys_argv:
84
        .long   0
85
        .global cyg_hal_sys_environ
86
cyg_hal_sys_environ:
87
        .long 0
88
 
89
        .text
90
        .globl  _start
91
_start:
92
        popl    %eax
93
        movl    %eax, cyg_hal_sys_argc
94
        movl    %esp, %ebx
95
        movl    %ebx, cyg_hal_sys_argv
96
        inc     %eax
97
        addl    %eax, %eax
98
        addl    %eax, %eax
99
        addl    %eax, %ebx
100
        movl    %ebx, cyg_hal_sys_environ
101
 
102
        // Clear the frame pointer, to facilitate debugging
103
        xorl    %ebp, %ebp
104
 
105
        // Align the stack to a 16-byte boundary.
106
        andl    $0xFFFFFFF0, %esp
107
 
108
        // Set up the TLS section. This must be done before any
109
        // C code gets to run, or -fstack-protector-all will fail.
110
 
111
        // _hal_synth_user_desc is statically initialized in tls.c
112
        movl    $_hal_synth_user_desc,%ebx
113
        // Syscall 243, set_thread_area
114
        movl    $0xf3, %eax
115
        int     $0x80
116
 
117
        // The syscall may have failed. That should only happen if running
118
        // on an old kernel which predates set_thread_area(), in which case
119
        // we are probably also using an old gcc which does not yet support
120
        // -fstack-protector. There is no obvious way forward if we are trying
121
        // to run an executable built with recent gcc on an old kernel.
122
        test    %eax, %eax
123
        jne     1f
124
 
125
        // gs value = (_hal_synth_user_desc.ud_entry_number * 8) + 3
126
        movl    _hal_synth_user_desc,%eax
127
        lea     0x3(,%eax,8),%eax
128
        mov     %eax,%gs
129
 
130
1:
131
        jmp     _linux_entry

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.