source: mainline/kernel/arch/xen32/include/asm.h@ 06e1e95

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 06e1e95 was 06e1e95, checked in by Jakub Jermar <jakub@…>, 19 years ago

C99 compliant header guards (hopefully) everywhere in the kernel.
Formatting and indentation changes.
Small improvements in sparc64.

  • Property mode set to 100644
File size: 6.6 KB
RevLine 
[aecf79f]1/*
2 * Copyright (C) 2001-2004 Jakub Jermar
3 * Copyright (C) 2005 Sergey Bondari
[e2882a7]4 * Copyright (C) 2006 Martin Decky
[aecf79f]5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * - The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/** @addtogroup xen32
32 * @{
33 */
34/** @file
35 */
36
[06e1e95]37#ifndef KERN_xen32_ASM_H_
38#define KERN_xen32_ASM_H_
[aecf79f]39
40#include <arch/pm.h>
41#include <arch/types.h>
[5b23a82]42#include <arch/barrier.h>
[aecf79f]43#include <config.h>
44
45extern void enable_l_apic_in_msr(void);
46
47
48extern void asm_delay_loop(uint32_t t);
49extern void asm_fake_loop(uint32_t t);
50
51
52/** Halt CPU
53 *
54 * Halt the current CPU until interrupt event.
55 */
[3e5cc686]56#define cpu_halt() ((void) 0)
57#define cpu_sleep() ((void) 0)
[aecf79f]58
59#define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \
60 { \
61 unative_t res; \
62 __asm__ volatile ("movl %%" #reg ", %0" : "=r" (res) ); \
63 return res; \
64 }
65
66#define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \
67 { \
68 __asm__ volatile ("movl %0, %%" #reg : : "r" (regn)); \
69 }
70
71GEN_READ_REG(cr0);
72GEN_READ_REG(cr2);
73
74GEN_READ_REG(dr0);
75GEN_READ_REG(dr1);
76GEN_READ_REG(dr2);
77GEN_READ_REG(dr3);
78GEN_READ_REG(dr6);
79GEN_READ_REG(dr7);
80
81GEN_WRITE_REG(dr0);
82GEN_WRITE_REG(dr1);
83GEN_WRITE_REG(dr2);
84GEN_WRITE_REG(dr3);
85GEN_WRITE_REG(dr6);
86GEN_WRITE_REG(dr7);
87
88/** Byte to port
89 *
90 * Output byte to port
91 *
92 * @param port Port to write to
93 * @param val Value to write
94 */
95static inline void outb(uint16_t port, uint8_t val) { __asm__ volatile ("outb %b0, %w1\n" : : "a" (val), "d" (port) ); }
96
97/** Word to port
98 *
99 * Output word to port
100 *
101 * @param port Port to write to
102 * @param val Value to write
103 */
104static inline void outw(uint16_t port, uint16_t val) { __asm__ volatile ("outw %w0, %w1\n" : : "a" (val), "d" (port) ); }
105
106/** Double word to port
107 *
108 * Output double word to port
109 *
110 * @param port Port to write to
111 * @param val Value to write
112 */
113static inline void outl(uint16_t port, uint32_t val) { __asm__ volatile ("outl %l0, %w1\n" : : "a" (val), "d" (port) ); }
114
115/** Byte from port
116 *
117 * Get byte from port
118 *
119 * @param port Port to read from
120 * @return Value read
121 */
122static inline uint8_t inb(uint16_t port) { uint8_t val; __asm__ volatile ("inb %w1, %b0 \n" : "=a" (val) : "d" (port) ); return val; }
123
124/** Word from port
125 *
126 * Get word from port
127 *
128 * @param port Port to read from
129 * @return Value read
130 */
131static inline uint16_t inw(uint16_t port) { uint16_t val; __asm__ volatile ("inw %w1, %w0 \n" : "=a" (val) : "d" (port) ); return val; }
132
133/** Double word from port
134 *
135 * Get double word from port
136 *
137 * @param port Port to read from
138 * @return Value read
139 */
140static inline uint32_t inl(uint16_t port) { uint32_t val; __asm__ volatile ("inl %w1, %l0 \n" : "=a" (val) : "d" (port) ); return val; }
141
142/** Enable interrupts.
143 *
144 * Enable interrupts and return previous
145 * value of EFLAGS.
146 *
147 * @return Old interrupt priority level.
148 */
149static inline ipl_t interrupts_enable(void)
150{
[5b23a82]151 // FIXME SMP
152
153 ipl_t v = shared_info.vcpu_info[0].evtchn_upcall_mask;
154 write_barrier();
155 shared_info.vcpu_info[0].evtchn_upcall_mask = 0;
156 write_barrier();
157 if (shared_info.vcpu_info[0].evtchn_upcall_pending)
158 force_evtchn_callback();
159
[aecf79f]160 return v;
161}
162
163/** Disable interrupts.
164 *
165 * Disable interrupts and return previous
166 * value of EFLAGS.
167 *
168 * @return Old interrupt priority level.
169 */
170static inline ipl_t interrupts_disable(void)
171{
[5b23a82]172 // FIXME SMP
173
174 ipl_t v = shared_info.vcpu_info[0].evtchn_upcall_mask;
175 shared_info.vcpu_info[0].evtchn_upcall_mask = 1;
176 write_barrier();
177
[aecf79f]178 return v;
179}
180
181/** Restore interrupt priority level.
182 *
183 * Restore EFLAGS.
184 *
185 * @param ipl Saved interrupt priority level.
186 */
187static inline void interrupts_restore(ipl_t ipl)
188{
[5b23a82]189 if (ipl == 0)
190 interrupts_enable();
191 else
192 interrupts_disable();
[aecf79f]193}
194
195/** Return interrupt priority level.
196 *
197 * @return EFLAFS.
198 */
199static inline ipl_t interrupts_read(void)
200{
[5b23a82]201 // FIXME SMP
202
203 return shared_info.vcpu_info[0].evtchn_upcall_mask;
[aecf79f]204}
205
206/** Return base address of current stack
207 *
208 * Return the base address of the current stack.
209 * The stack is assumed to be STACK_SIZE bytes long.
210 * The stack must start on page boundary.
211 */
212static inline uintptr_t get_stack_base(void)
213{
214 uintptr_t v;
215
216 __asm__ volatile ("andl %%esp, %0\n" : "=r" (v) : "0" (~(STACK_SIZE-1)));
217
218 return v;
219}
220
221static inline uint64_t rdtsc(void)
222{
223 uint64_t v;
224
225 __asm__ volatile("rdtsc\n" : "=A" (v));
226
227 return v;
228}
229
230/** Return current IP address */
231static inline uintptr_t * get_ip()
232{
233 uintptr_t *ip;
234
235 __asm__ volatile (
236 "mov %%eip, %0"
237 : "=r" (ip)
238 );
239 return ip;
240}
241
242/** Invalidate TLB Entry.
243 *
244 * @param addr Address on a page whose TLB entry is to be invalidated.
245 */
246static inline void invlpg(uintptr_t addr)
247{
248 __asm__ volatile ("invlpg %0\n" :: "m" (*(unative_t *)addr));
249}
250
251/** Load GDTR register from memory.
252 *
253 * @param gdtr_reg Address of memory from where to load GDTR.
254 */
255static inline void gdtr_load(ptr_16_32_t *gdtr_reg)
256{
257 __asm__ volatile ("lgdtl %0\n" : : "m" (*gdtr_reg));
258}
259
260/** Store GDTR register to memory.
261 *
262 * @param gdtr_reg Address of memory to where to load GDTR.
263 */
264static inline void gdtr_store(ptr_16_32_t *gdtr_reg)
265{
266 __asm__ volatile ("sgdtl %0\n" : : "m" (*gdtr_reg));
267}
268
269/** Load TR from descriptor table.
270 *
271 * @param sel Selector specifying descriptor of TSS segment.
272 */
273static inline void tr_load(uint16_t sel)
274{
275 __asm__ volatile ("ltr %0" : : "r" (sel));
276}
277
278#endif
279
280/** @}
281 */
Note: See TracBrowser for help on using the repository browser.