Mercurial > ecos
annotate packages/hal/i386/arch/current/include/arch.inc @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | 8147f1c99f15 |
| children | d2c90368aeef |
| rev | line source |
|---|---|
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
1 #ifndef CYGONCE_HAL_ARCH_INC |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
2 #define CYGONCE_HAL_ARCH_INC |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
3 ##============================================================================= |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
4 ## |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
5 ## arch.inc |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
6 ## |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
7 ## i386 assembler header file |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
8 ## |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
9 ##============================================================================= |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
10 #####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
11 # ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
12 # This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
13 # Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
14 # |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
15 # eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
16 # the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
17 # Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
18 # |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
19 # eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
20 # WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
21 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
22 # for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
23 # |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
24 # You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
25 # with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
26 # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
27 # |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
28 # As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
29 # or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
30 # with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
31 # by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
32 # License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
33 # in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
34 # |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
35 # This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
36 # this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
37 # |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
38 # Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
39 # at http://sources.redhat.com/ecos/ecos-license |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
40 # ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
41 #####ECOSGPLCOPYRIGHTEND#### |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
42 ##============================================================================= |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
43 #######DESCRIPTIONBEGIN#### |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
44 ## |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
45 ## Author(s): nickg |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
46 ## Contributors: nickg, pjo |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
47 ## Date: 1999-10-15 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
48 ## Purpose: Architecture definitions. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
49 ## Description: This file contains various definitions and macros that are |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
50 ## useful for writing assembly code for the i386 CPU family. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
51 ## Usage: |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
52 ## #include <cyg/hal/arch.inc> |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
53 ## ... |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
54 ## |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
55 ## |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
56 ######DESCRIPTIONEND#### |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
57 ## |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
58 ##============================================================================= |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
59 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
60 #include <cyg/hal/i386.inc> |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
61 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
62 #include <cyg/hal/variant.inc> |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
63 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
64 ##----------------------------------------------------------------------------- |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
65 ## CPU specific macros. These provide a common assembler interface to |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
66 ## operations that may have CPU specific implementations on different |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
67 ## variants of the architecture. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
68 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
69 #ifndef CYGPKG_HAL_I386_CPU_INIT_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
70 # Initialize CPU |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
71 .macro hal_cpu_init |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
72 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
73 #endif /* !CYGPKG_HAL_I386_CPU_INIT_DEFINED */ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
74 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
75 ##----------------------------------------------------------------------------- |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
76 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
77 #ifndef CYGPKG_HAL_I386_INTC_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
78 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
79 #ifndef CYGPKG_HAL_I386_INTC_INIT_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
80 # initialize all interrupts to disabled |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
81 .macro hal_intc_init |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
82 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
83 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
84 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
85 .macro hal_intc_decode vnum |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
86 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
87 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
88 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
89 |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
90 #------------------------------------------------------------------------------ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
91 # SMP support |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
92 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
93 #ifdef CYGPKG_HAL_SMP_SUPPORT |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
94 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
95 .macro hal_smp_init |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
96 #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
97 movl $0,cyg_hal_smp_vsr_sync_flag |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
98 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
99 .endm |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
100 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
101 // Put CPU number in register |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
102 .macro hal_smp_cpu reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
103 movl cyg_hal_smp_local_apic,\reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
104 movl 0x20(\reg),\reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
105 shrl $24,\reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
106 .endm |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
107 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
108 #else |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
109 |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
110 .macro hal_smp_init |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
111 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
112 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
113 .macro hal_smp_cpu reg |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
114 movl $0,\reg |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
115 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
116 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
117 #endif |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
118 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
119 #------------------------------------------------------------------------------ |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
120 # Stack switching macros |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
121 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
122 #ifndef CYG_HAL_I386_INTSTACK_MACROS_DEFINED |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
123 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
124 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
125 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
126 #ifdef CYGPKG_HAL_SMP_SUPPORT |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
127 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
128 .macro hal_init_istack reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
129 hal_smp_cpu %ebx |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
130 movl $__interrupt_stack_vector,%ecx |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
131 movl $CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE,%eax |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
132 imull %ebx,%eax |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
133 addl $__interrupt_stack_first,%eax |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
134 movl %eax,0(%ecx,%ebx,4) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
135 movl $CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE,\reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
136 addl %eax,\reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
137 .endm |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
138 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
139 .macro hal_load_istack reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
140 hal_load_istack_base \reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
141 addl $CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE,\reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
142 .endm |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
143 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
144 .macro hal_load_istack_base reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
145 hal_smp_cpu \reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
146 movl $__interrupt_stack_vector,%eax |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
147 movl 0(%eax,\reg,4),\reg |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
148 .endm |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
149 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
150 #else // CYGPKG_HAL_SMP_SUPPORT |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
151 .macro hal_init_istack reg,tr |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
152 movl $__interrupt_stack,\reg // Load interrupt stack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
153 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
154 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
155 .macro hal_load_istack reg |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
156 movl $__interrupt_stack,\reg // Load interrupt stack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
157 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
158 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
159 .macro hal_load_istack_base reg |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
160 movl $__interrupt_stack_base,\reg // Load interrupt stack base |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
161 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
162 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
200
diff
changeset
|
163 #endif // CYGPKG_HAL_SMP_SUPPORT |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
164 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
165 .macro hal_to_intstack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
166 hal_load_istack_base %ebx // EBX = stack base |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
167 movl %ebx,%eax |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
168 addl $CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE,%eax |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
169 cmpl %ebx,%ebp # compare SP with istack base |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
170 jb 1f # if sp < istack base, switch |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
171 cmpl %eax,%ebp # compare SP with istack top |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
172 jbe 2f # if sp < istack top, dont switch |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
173 1: |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
174 movl %eax,%esp # move on to new stack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
175 2: |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
176 pushl %ebp # Save old SP on new stack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
177 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
178 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
179 .macro hal_from_intstack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
180 popl %esp # pop old SP from stack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
181 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
182 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
183 #define CYG_HAL_I386_INTSTACK_MACROS_DEFINED |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
184 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
185 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
186 #else // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
187 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
188 .macro hal_init_istack reg |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
189 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
190 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
191 .macro hal_load_istack_base reg |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
192 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
193 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
194 .macro hal_load_istack reg |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
195 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
196 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
197 .macro hal_to_intstack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
198 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
199 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
200 .macro hal_from_intstack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
201 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
202 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
203 #define CYG_HAL_I386_INTSTACK_MACROS_DEFINED |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
204 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
205 #endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
206 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
207 #endif // CYG_HAL_I386_INTSTACK_MACROS_DEFINED |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
208 |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
209 #------------------------------------------------------------------------------ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
210 # FPU macros. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
211 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
212 #ifndef CYGPKG_HAL_I386_FPU_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
213 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
214 #ifdef CYGHWR_HAL_I386_FPU |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
215 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
216 #define CYGPKG_HAL_I386_FPU_DEFINED |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
217 |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
218 .macro hal_fpu_init |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
219 # Tell the CPU to use the math hardware. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
220 movl %cr0, %eax |
|
171
42f843b391aa
Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents:
161
diff
changeset
|
221 orl $0x32, %eax # Set MP, ET, NE bits |
|
42f843b391aa
Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents:
161
diff
changeset
|
222 andl $~0x8, %eax # And clear TS bit |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
223 movl %eax, %cr0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
224 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
225 finit # and initialize... |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
226 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
227 ## Enable floating point exceptions. Bit mask: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
228 ## 1 - invalid operation |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
229 ## 2 - denormalized operand |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
230 ## 4 - zero divide |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
231 ## 8 - overflow |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
232 ## 16 - underflow |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
233 ## 32 - precision |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
234 pushl $0 # space for CW |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
235 fstcw 0(%esp) # store FPCW to stack |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
236 movl 0(%esp),%eax # get into EAX |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
237 andb $(~0x04),%al # allow only zero divide exceptions |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
238 movl %eax,0(%esp) # put back into memory |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
239 fldcw 0(%esp) # reload |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
240 addl $4,%esp # pop value |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
241 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
242 #ifdef CYGHWR_HAL_I386_PENTIUM_SSE |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
243 # set CR4.OSFXSR to safely use stmxcsr/ldmxcsr |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
244 movl %cr4, %eax |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
245 orl $0x200, %eax |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
246 movl %eax, %cr4 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
247 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
248 ## Enable SIMD exceptions. Bit mask: |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
249 ## 0x0080 - invalid operation |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
250 ## 0x0100 - denormalized operand |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
251 ## 0x0200 - zero divide |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
252 ## 0x0400 - overflow |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
253 ## 0x0800 - underflow |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
254 ## 0x1000 - precision |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
255 pushl $0 # space for MXCSR |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
256 stmxcsr 0(%esp) # store MXCSR to stack |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
257 movl 0(%esp),%eax # get into EAX |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
258 andw $(~0x0200),%ax # allow only zero divide exceptions |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
259 movl %eax,0(%esp) # put back into memory |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
260 ldmxcsr 0(%esp) # reload |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
261 addl $4,%esp # pop value |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
262 #endif |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
263 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
264 #ifdef CYGHWR_HAL_I386_FPU_SWITCH_LAZY |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
265 # Tell the CPU to generate an FPU unavailable exception |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
266 # when the FPU is first used. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
267 movl %cr0, %eax |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
268 orl $0x8, %eax |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
269 movl %eax, %cr0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
270 # Plant a pointer to the FPU switch VSR into slot 7 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
271 # of the VSR table. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
272 movl $__fpu_switch_vsr,%eax |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
273 movl %eax,(hal_vsr_table+7*4) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
274 # Now create an FPU context on the stack so that we can take |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
275 # FPU-using interrupts and exceptions before the machine starts |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
276 # up. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
277 subl $i386reg_fpucontext_size,%esp |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
278 movl $0,i386reg_fpucontext_valid(%esp) |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
279 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
280 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
281 movl %esp,0(%ecx,%ebx,4) # save in table[cpu] entry |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
282 #endif |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
283 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
284 |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
285 .macro hal_fpu_cpu_init |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
286 # Tell the CPU to use the math hardware. |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
287 movl %cr0, %eax |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
288 orl $0x32, %eax # Set MP, ET, NE bits |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
289 andl $~0x8, %eax # And clear TS bit |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
290 movl %eax, %cr0 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
291 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
292 finit # and initialize... |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
293 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
294 ## Enable floating point exceptions. Bit mask: |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
295 ## 1 - invalid operation |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
296 ## 2 - denormalized operand |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
297 ## 4 - zero divide |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
298 ## 8 - overflow |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
299 ## 16 - underflow |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
300 ## 32 - precision |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
301 pushl $0 # space for CW |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
302 fstcw 0(%esp) # store FPCW to stack |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
303 movl 0(%esp),%eax # get into EAX |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
304 andb $(~0x04),%al # allow only zero divide exceptions |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
305 movl %eax,0(%esp) # put back into memory |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
306 fldcw 0(%esp) # reload |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
307 addl $4,%esp # pop value |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
308 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
309 #ifdef CYGHWR_HAL_I386_PENTIUM_SSE |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
310 # set CR4.OSFXSR to safely use stmxcsr/ldmxcsr |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
311 movl %cr4, %eax |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
312 orl $0x200, %eax |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
313 movl %eax, %cr4 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
314 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
315 ## Enable SIMD exceptions. Bit mask: |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
316 ## 0x0080 - invalid operation |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
317 ## 0x0100 - denormalized operand |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
318 ## 0x0200 - zero divide |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
319 ## 0x0400 - overflow |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
320 ## 0x0800 - underflow |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
321 ## 0x1000 - precision |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
322 pushl $0 # space for MXCSR |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
323 stmxcsr 0(%esp) # store MXCSR to stack |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
324 movl 0(%esp),%eax # get into EAX |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
325 andw $(~0x0200),%ax # allow only zero divide exceptions |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
326 movl %eax,0(%esp) # put back into memory |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
327 ldmxcsr 0(%esp) # reload |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
328 addl $4,%esp # pop value |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
329 #endif |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
330 |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
331 #ifdef CYGHWR_HAL_I386_FPU_SWITCH_LAZY |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
332 # Tell the CPU to generate an FPU unavailable exception |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
333 # when the FPU is first used. |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
334 movl %cr0, %eax |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
335 orl $0x8, %eax |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
336 movl %eax, %cr0 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
337 # Now create an FPU context on the stack so that we can take |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
338 # FPU-using interrupts and exceptions before the kernel starts |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
339 # up. |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
340 subl $i386reg_fpucontext_size,%esp |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
341 movl $0,i386reg_fpucontext_valid(%esp) |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
342 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
343 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
344 movl %esp,0(%ecx,%ebx,4) # save in table[cpu] entry |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
345 #endif |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
346 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
347 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
348 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
349 #ifndef CYGHWR_HAL_I386_FPU_SWITCH_LAZY |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
350 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
351 # Non-lazy CPU state switching. We simply switch the entire |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
352 # FPU state on every context switch, interrupt or exception. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
353 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
354 # ------------------------------------------------------------ |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
355 # Context switch handling |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
356 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
357 .macro hal_fpu_push_ctx |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
358 subl $i386reg_fpstate_size,%esp # make space |
|
200
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
191
diff
changeset
|
359 fnsave i386reg_fpstate(%esp) # save FPU state |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
360 #ifdef CYGHWR_HAL_I386_PENTIUM_SSE |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
361 # Save SIMD state. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
362 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
363 # FIXME. This is awfully inefficient. Need to use FXSAVE to |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
364 # save FPU and SIMD at same time. FXSAVE requires a 16 byte |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
365 # alignment and does not have an implicit finit as does FSAVE. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
366 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
367 stmxcsr i386reg_simd_mxcsr(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
368 movups %xmm0,i386reg_simd_xmm0(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
369 movups %xmm1,i386reg_simd_xmm1(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
370 movups %xmm2,i386reg_simd_xmm2(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
371 movups %xmm3,i386reg_simd_xmm3(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
372 movups %xmm4,i386reg_simd_xmm4(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
373 movups %xmm5,i386reg_simd_xmm5(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
374 movups %xmm6,i386reg_simd_xmm6(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
375 movups %xmm7,i386reg_simd_xmm7(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
376 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
377 movl $1,i386reg_fpstate_valid(%esp) # indicate it is valid |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
378 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
379 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
380 .macro hal_fpu_pop_ctx |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
381 btl $0,i386reg_fpstate_valid(%esp) # check ls bit of valid flag |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
382 jc 1f # if set, restore state |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
383 finit # otherwise init FPU |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
384 #ifdef CYGHWR_HAL_I386_PENTIUM_SSE |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
385 # FIXME. Anything needed here? |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
386 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
387 jmp 2f # and skip restore |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
388 1: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
389 frstor i386reg_fpstate(%esp) # restore FPU state |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
390 #ifdef CYGHWR_HAL_I386_PENTIUM_SSE |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
391 # Restore SIMD state. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
392 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
393 # FIXME. This is awfully inefficient. Need to use FXRSTOR to |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
394 # restore FPU and SIMD at same time. FXRSTOR requires a 16 byte |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
395 # alignment. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
396 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
397 movups i386reg_simd_xmm0(%esp),%xmm0 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
398 movups i386reg_simd_xmm1(%esp),%xmm1 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
399 movups i386reg_simd_xmm2(%esp),%xmm2 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
400 movups i386reg_simd_xmm3(%esp),%xmm3 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
401 movups i386reg_simd_xmm4(%esp),%xmm4 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
402 movups i386reg_simd_xmm5(%esp),%xmm5 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
403 movups i386reg_simd_xmm6(%esp),%xmm6 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
404 movups i386reg_simd_xmm7(%esp),%xmm7 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
405 ldmxcsr i386reg_simd_mxcsr(%esp) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
406 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
407 2: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
408 addl $i386reg_fpstate_size,%esp # pop space used |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
409 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
410 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
411 # ------------------------------------------------------------ |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
412 # Interrupt and exception handling |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
413 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
414 # In this configuration, the interrupt and exception code behaves in |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
415 # exactly the same way as the context switch code. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
416 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
417 .macro hal_fpu_push_int |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
418 hal_fpu_push_ctx |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
419 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
420 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
421 .macro hal_fpu_push_int_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
422 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
423 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
424 .macro hal_fpu_pop_int_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
425 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
426 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
427 .macro hal_fpu_pop_int |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
428 hal_fpu_pop_ctx |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
429 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
430 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
431 .macro hal_fpu_push_exc |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
432 hal_fpu_push_ctx |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
433 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
434 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
435 .macro hal_fpu_push_exc_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
436 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
437 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
438 .macro hal_fpu_pop_exc_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
439 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
440 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
441 .macro hal_fpu_pop_exc |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
442 hal_fpu_pop_ctx |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
443 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
444 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
445 #else // CYGHWR_HAL_I386_FPU_SWITCH_LAZY |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
446 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
447 # Lazy CPU state switching. We defer CPU state switching until the new |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
448 # thread actually uses the FPU. This state switch is handled by |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
449 # __fpu_switch_vsr in vectors.S. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
450 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
451 .extern cyg_hal_fpustate_owner |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
452 .extern cyg_hal_fpustate_current |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
453 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
454 # ------------------------------------------------------------ |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
455 # Context switch handling |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
456 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
457 # On context switch we simply stack a pointer to this |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
458 # threads FPU context save area. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
459 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
460 .macro hal_fpu_push_ctx |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
461 hal_smp_cpu %ebx # Get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
462 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
463 pushl 0(%ecx,%ebx,4) # push table[cpu] entry |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
464 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
465 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
466 # We do nothing here but set the CR0:TS bit to force |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
467 # an exception when the FPU is next used and pop the |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
468 # FPU save area pointer into the static variable. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
469 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
470 .macro hal_fpu_pop_ctx |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
471 movl %cr0, %ecx # get CR0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
472 orl $0x8, %ecx # set TS bit |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
473 movl %ecx, %cr0 # restore CR0 |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
474 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
475 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
476 popl 0(%ecx,%ebx,4) # pop table[cpu] entry |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
477 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
478 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
479 # ------------------------------------------------------------ |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
480 # Interrupt handling |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
481 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
482 # On entry to an interrupt we save the current threads FPU context |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
483 # pointer and set the CR0:TS bit to trap any FP operations in the |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
484 # interrupt. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
485 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
486 .macro hal_fpu_push_int |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
487 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
488 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
489 pushl 0(%ecx,%ebx,4) # push table[cpu] entry |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
490 # ensure that CR0:TS bit is set |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
491 movl %cr0, %ecx # get CR0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
492 orl $0x8, %ecx # set TS bit |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
493 movl %ecx, %cr0 # restore CR0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
494 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
495 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
496 # The following is called after we transfer to the interrupt |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
497 # stack. We make space here for the FPU state of the interrupt |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
498 # handler to be saved in case we get nested interrupts that use FP. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
499 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
500 .macro hal_fpu_push_int_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
501 subl $i386reg_fpucontext_size,%esp |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
502 movl $0,i386reg_fpucontext_valid(%esp) |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
503 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
504 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
505 movl %esp,0(%ecx,%ebx,4) # save in table[cpu] entry |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
506 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
507 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
508 # This is invoked just before any transfer back to the thread stack. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
509 # We check whether we are the FPU state owner, and if so, abdicate. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
510 # There is no need to save the state, the next thread will load its |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
511 # own state over the top of it. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
512 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
513 .macro hal_fpu_pop_int_annex |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
514 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
515 movl $cyg_hal_fpustate_owner,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
516 cmpl 0(%ecx,%ebx,4),%esp # are we FPU owner? |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
517 jne 1f # if not, then just continue |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
518 movl $0,0(%ecx,%ebx,4) # no one owns FPU now |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
519 # ensure that CR0:TS bit is set to force a reload of |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
520 # the previous FPU state |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
521 movl %cr0, %ecx # get CR0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
522 orl $0x8, %ecx # set TS bit |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
523 movl %ecx, %cr0 # restore CR0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
524 1: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
525 addl $i386reg_fpucontext_size,%esp # pop FPU save area |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
526 .endm |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
527 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
528 # Final return from interrupt handling. Just pull the current |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
529 # FPU context off the stack. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
530 .macro hal_fpu_pop_int |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
531 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
532 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
533 popl 0(%ecx,%ebx,4) # pop table[cpu] entry |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
534 .endm |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
535 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
536 # ------------------------------------------------------------ |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
537 # Exception handling |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
538 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
539 # Whenever we take an exception, we save the current FPU state away |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
540 # into its save area. This way, if we are going to end up in GDB, the |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
541 # whole machine state is saved in memory. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
542 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
543 .macro hal_fpu_push_exc |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
544 hal_smp_cpu %ebx # get CPU id |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
545 movl $cyg_hal_fpustate_current,%ecx # current state table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
546 pushl 0(%ecx,%ebx,4) # push table[cpu] entry |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
547 movl $cyg_hal_fpustate_owner,%ecx # current owner table |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
548 movl 0(%ecx,%ebx,4),%eax # EAX = FPU state owner |
|
171
42f843b391aa
Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents:
161
diff
changeset
|
549 cmpl $0,%eax # test it |
|
42f843b391aa
Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents:
161
diff
changeset
|
550 je 1f # skip if zero |
|
200
8147f1c99f15
Merge from eCos master repository on 2001-12-21-06:43:03-GMT
jlarmour
parents:
191
diff
changeset
|
551 fnsave i386reg_fpucontext_state(%eax) # save state |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
552 #ifdef CYGHWR_HAL_I386_PENTIUM_SSE |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
553 # Save SIMD state. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
554 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
555 # FIXME. This is awfully inefficient. Need to use FXSAVE to |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
556 # save FPU and SIMD at same time. FXSAVE requires a 16 byte |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
557 # alignment and does not have an implicit finit as does FSAVE. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
558 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
559 stmxcsr i386reg_simd_mxcsr(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
560 movups %xmm0,i386reg_simd_xmm0(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
561 movups %xmm1,i386reg_simd_xmm1(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
562 movups %xmm2,i386reg_simd_xmm2(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
563 movups %xmm3,i386reg_simd_xmm3(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
564 movups %xmm4,i386reg_simd_xmm4(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
565 movups %xmm5,i386reg_simd_xmm5(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
566 movups %xmm6,i386reg_simd_xmm6(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
567 movups %xmm7,i386reg_simd_xmm7(%eax) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
182
diff
changeset
|
568 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
569 movl $1,i386reg_fpucontext_valid(%eax) # set valid |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
570 movl $0,0(%ecx,%ebx,4) # zero owner pointer |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
571 1: |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
572 .endm |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
573 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
574 # The rest of the exception macros behave exactly like the |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
575 # interrupt ones. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
576 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
577 .macro hal_fpu_push_exc_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
578 hal_fpu_push_int_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
579 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
580 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
581 .macro hal_fpu_pop_exc_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
582 hal_fpu_pop_int_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
583 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
584 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
585 .macro hal_fpu_pop_exc |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
586 hal_fpu_pop_int |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
587 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
588 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
589 #endif // CYGHWR_HAL_I386_FPU_SWITCH_LAZY |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
590 |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
591 #else /* !CYGHWR_HAL_I386_FPU */ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
592 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
593 # Non-FP macros. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
594 |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
595 .macro hal_fpu_init |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
596 .endm |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
597 |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
598 .macro hal_fpu_cpu_init |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
599 .endm |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
171
diff
changeset
|
600 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
601 .macro hal_fpu_push_ctx |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
602 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
603 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
604 .macro hal_fpu_pop_ctx |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
605 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
606 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
607 .macro hal_fpu_push_int |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
608 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
609 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
610 .macro hal_fpu_push_int_annex |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
611 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
612 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
613 .macro hal_fpu_pop_int_annex |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
614 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
615 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
616 .macro hal_fpu_pop_int |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
617 .endm |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
618 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
619 .macro hal_fpu_push_exc |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
620 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
621 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
622 .macro hal_fpu_push_exc_annex |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
623 .endm |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
624 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
625 .macro hal_fpu_pop_exc_annex |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
626 .endm |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
627 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
628 .macro hal_fpu_pop_exc |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
629 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
630 |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
631 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
632 |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
633 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
634 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
635 #------------------------------------------------------------------------------ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
636 # MMU macros. |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
637 |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
638 #ifndef CYGPKG_HAL_I386_MMU_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
639 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
640 #define CYGPKG_HAL_I386_MMU_DEFINED |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
641 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
642 .macro hal_mmu_init |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
643 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
644 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
645 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
646 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
647 #------------------------------------------------------------------------------ |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
648 # A20 gate enable |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
649 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
650 #define K_RDWR 0x60 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
651 #define K_STATUS 0x64 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
652 #define K_CMD 0x64 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
653 #define K_OBUF_FUL 0x01 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
654 #define K_IBUF_FUL 0x02 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
655 #define KC_CMD_WIN 0xD0 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
656 #define KC_CMD_WOUT 0xD1 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
657 #define KB_A20 0xDF |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
658 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
659 .macro hal_a20_enable |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
660 // Enable A20 so that addresses at 1MB don't wrap around back to 0. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
661 1: inb $K_STATUS, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
662 testb $K_IBUF_FUL, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
663 jnz 1b |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
664 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
665 2: inb $K_STATUS, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
666 testb $K_OBUF_FUL, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
667 jz 3f |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
668 inb $K_RDWR, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
669 jmp 2b |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
670 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
671 3: movb $KC_CMD_WOUT, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
672 outb %al, $K_CMD |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
673 1: inb $K_STATUS, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
674 testb $K_IBUF_FUL, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
675 jnz 1b |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
676 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
677 movb $KB_A20, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
678 outb %al, $K_RDWR |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
679 1: inb $K_STATUS, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
680 testb $K_IBUF_FUL, %al |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
681 jnz 1b |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
682 .endm |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
683 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
684 #------------------------------------------------------------------------------ |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
685 # MEMC macros. |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
686 # This version simply enables the A20 gate. |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
687 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
688 #ifndef CYGPKG_HAL_I386_MEMC_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
689 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
690 .macro hal_memc_init |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
72
diff
changeset
|
691 hal_a20_enable |
|
72
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
692 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
693 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
694 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
695 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
696 #------------------------------------------------------------------------------ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
697 # Cache macros. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
698 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
699 #ifndef CYGPKG_HAL_I386_CACHE_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
700 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
701 .macro hal_cache_init |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
702 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
703 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
704 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
705 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
706 #------------------------------------------------------------------------------ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
707 # Diagnostics macros. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
708 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
709 #ifndef CYGPKG_HAL_I386_DIAG_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
710 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
711 .macro hal_diag_init |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
712 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
713 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
714 .macro hal_diag_excpt_start |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
715 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
716 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
717 .macro hal_diag_intr_start |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
718 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
719 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
720 .macro hal_diag_restore |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
721 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
722 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
723 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
724 #------------------------------------------------------------------------------ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
725 # Timer initialization. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
726 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
727 #ifndef CYGPKG_HAL_I386_TIMER_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
728 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
729 .macro hal_timer_init |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
730 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
731 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
732 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
733 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
734 #------------------------------------------------------------------------------ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
735 # Monitor initialization. |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
736 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
737 #ifndef CYGPKG_HAL_I386_MON_DEFINED |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
738 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
739 .macro hal_mon_init |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
740 .endm |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
741 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
742 #endif |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
743 |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
744 #------------------------------------------------------------------------------ |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
745 #endif // ifndef CYGONCE_HAL_ARCH_INC |
|
da3908c9cd10
Merge from eCos master repository on 2000-02-17-18:56:14-GMT
jlarmour
parents:
diff
changeset
|
746 # end of arch.inc |
