source: mainline/arch/amd64/src/asm_utils.S@ 8ccec3c1

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 8ccec3c1 was fcfac420, checked in by Ondrej Palkovsky <ondrap@…>, 20 years ago

Changed ia32 & amd64 to use exc_register instead of trap_register.

Fixed dependency list building. I hope you all have 'makedepend' installed,
if you don't it's time to install it, as CC -M builds the dependency
list without directory names..and it just does not work.

  • Property mode set to 100644
File size: 4.2 KB
Line 
1#
2# Copyright (C) 2005 Ondrej Palkovsky
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8#
9# - Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# - Redistributions in binary form must reproduce the above copyright
12# notice, this list of conditions and the following disclaimer in the
13# documentation and/or other materials provided with the distribution.
14# - The name of the author may not be used to endorse or promote products
15# derived from this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27#
28
29
30# Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error word
31# and 1 means interrupt with error word
32
33
34#define ERROR_WORD_INTERRUPT_LIST 0x00027D00
35
36#include <arch/pm.h>
37
38.text
39.global interrupt_handlers
40.global panic_printf
41
42panic_printf:
43 movq $halt, (%rsp)
44 jmp printf
45
46.global memcpy
47memcpy:
48 jmp _memcpy
49
50.global cpuid
51.global has_cpuid
52.global rdtsc
53.global read_efer_flag
54.global set_efer_flag
55
56
57# THIS IS USERSPACE CODE
58.global utext
59utext:
600:
61 int $48
62 jmp 0b
63 # not reached
64utext_end:
65
66.data
67.global utext_size
68utext_size:
69 .long utext_end - utext
70
71
72## Determine CPUID support
73#
74# Return 0 in EAX if CPUID is not support, 1 if supported.
75#
76has_cpuid:
77 pushfq # store flags
78 popq %rax # read flags
79 movq %rax,%rdx # copy flags
80 btcl $21,%edx # swap the ID bit
81 pushq %rdx
82 popfq # propagate the change into flags
83 pushfq
84 popq %rdx # read flags
85 andl $(1<<21),%eax # interested only in ID bit
86 andl $(1<<21),%edx
87 xorl %edx,%eax # 0 if not supported, 1 if supported
88 ret
89
90cpuid:
91 movq %rbx, %r10 # we have to preserve rbx across function calls
92
93 movl %edi,%eax # load the command into %eax
94
95 cpuid
96 movl %eax,0(%rsi)
97 movl %ebx,4(%rsi)
98 movl %ecx,8(%rsi)
99 movl %edx,12(%rsi)
100
101 movq %r10, %rbx
102 ret
103
104rdtsc:
105 xorq %rax,%rax
106 rdtsc
107 ret
108
109set_efer_flag:
110 movq $0xc0000080, %rcx
111 rdmsr
112 btsl %edi, %eax
113 wrmsr
114 ret
115
116read_efer_flag:
117 movq $0xc0000080, %rcx
118 rdmsr
119 ret
120
121# Push all general purpose registers on stack except %rbp, %rsp
122.macro push_all_gpr
123 pushq %rax
124 pushq %rbx
125 pushq %rcx
126 pushq %rdx
127 pushq %rsi
128 pushq %rdi
129 pushq %r8
130 pushq %r9
131 pushq %r10
132 pushq %r11
133 pushq %r12
134 pushq %r13
135 pushq %r14
136 pushq %r15
137.endm
138
139.macro pop_all_gpr
140 popq %r15
141 popq %r14
142 popq %r13
143 popq %r12
144 popq %r11
145 popq %r10
146 popq %r9
147 popq %r8
148 popq %rdi
149 popq %rsi
150 popq %rdx
151 popq %rcx
152 popq %rbx
153 popq %rax
154.endm
155
156## Declare interrupt handlers
157#
158# Declare interrupt handlers for n interrupt
159# vectors starting at vector i.
160#
161# The handlers setup data segment registers
162# and call exc_dispatch().
163#
164.macro handler i n
165 pushq %rbp
166 movq %rsp,%rbp
167
168 push_all_gpr
169
170 movq $(\i),%rdi # %rdi - first parameter
171 movq %rbp, %rsi
172 addq $8, %rsi # %rsi - second parameter - original stack
173 call exc_dispatch # exc_dispatch(i, stack)
174
175# Test if this is interrupt with error word or not
176 mov $\i,%cl;
177 movl $1,%eax;
178 test $0xe0,%cl;
179 jnz 0f;
180 and $0x1f,%cl;
181 shl %cl,%eax;
182 and $ERROR_WORD_INTERRUPT_LIST,%eax;
183 jz 0f;
184
185
186# Return with error word
187 pop_all_gpr
188
189 popq %rbp;
190 add $8,%esp; # Skip error word
191 iretq
192
1930:
194# Return with no error word
195 pop_all_gpr
196
197 popq %rbp
198 iretq
199
200 .if (\n-\i)-1
201 handler "(\i+1)",\n
202 .endif
203.endm
204
205interrupt_handlers:
206h_start:
207 handler 0 IDT_ITEMS
208h_end:
209
210
211.data
212.global interrupt_handler_size
213
214interrupt_handler_size: .long (h_end-h_start)/IDT_ITEMS
Note: See TracBrowser for help on using the repository browser.