source: mainline/kernel/arch/ppc32/include/asm.h@ ffe276f

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since ffe276f was ffe276f, checked in by Martin Decky <martin@…>, 15 years ago

restructure constants
change the return type of pic_get_pending()
coding style changes

  • Property mode set to 100644
File size: 4.2 KB
Line 
1/*
2 * Copyright (c) 2005 Martin Decky
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/** @addtogroup ppc32
30 * @{
31 */
32/** @file
33 */
34
35#ifndef KERN_ppc32_ASM_H_
36#define KERN_ppc32_ASM_H_
37
38#include <typedefs.h>
39#include <config.h>
40#include <arch/cpu.h>
41
42static inline uint32_t msr_read(void)
43{
44 uint32_t msr;
45
46 asm volatile (
47 "mfmsr %[msr]\n"
48 : [msr] "=r" (msr)
49 );
50
51 return msr;
52}
53
54static inline void msr_write(uint32_t msr)
55{
56 asm volatile (
57 "mtmsr %[msr]\n"
58 :: [msr] "r" (msr)
59 );
60}
61
62static inline uint32_t msr_read(void)
63{
64 uint32_t msr;
65
66 asm volatile (
67 "mfmsr %[msr]\n"
68 : [msr] "=r" (msr)
69 );
70
71 return msr;
72}
73
74static inline void msr_write(uint32_t msr)
75{
76 asm volatile (
77 "mtmsr %[msr]\n"
78 :: [msr] "r" (msr)
79 );
80}
81
82/** Enable interrupts.
83 *
84 * Enable interrupts and return previous
85 * value of EE.
86 *
87 * @return Old interrupt priority level.
88 *
89 */
90static inline ipl_t interrupts_enable(void)
91{
92 ipl_t ipl = msr_read();
93 msr_write(ipl | MSR_EE);
94 return ipl;
95}
96
97/** Disable interrupts.
98 *
99 * Disable interrupts and return previous
100 * value of EE.
101 *
102 * @return Old interrupt priority level.
103 *
104 */
105static inline ipl_t interrupts_disable(void)
106{
107 ipl_t ipl = msr_read();
108 msr_write(ipl & (~MSR_EE));
109 return ipl;
110}
111
112/** Restore interrupt priority level.
113 *
114 * Restore EE.
115 *
116 * @param ipl Saved interrupt priority level.
117 *
118 */
119static inline void interrupts_restore(ipl_t ipl)
120{
121 msr_write((msr_read() & (~MSR_EE)) | (ipl & MSR_EE));
122}
123
124/** Return interrupt priority level.
125 *
126 * Return EE.
127 *
128 * @return Current interrupt priority level.
129 *
130 */
131static inline ipl_t interrupts_read(void)
132{
133 return msr_read();
134}
135
136/** Check whether interrupts are disabled.
137 *
138 * @return True if interrupts are disabled.
139 *
140 */
141static inline bool interrupts_disabled(void)
142{
143 return ((msr_read() & MSR_EE) == 0);
144}
145
146/** Return base address of current stack.
147 *
148 * Return the base address of the current stack.
149 * The stack is assumed to be STACK_SIZE bytes long.
150 * The stack must start on page boundary.
151 *
152 */
153static inline uintptr_t get_stack_base(void)
154{
155 uintptr_t base;
156
157 asm volatile (
158 "and %[base], %%sp, %[mask]\n"
159 : [base] "=r" (base)
160 : [mask] "r" (~(STACK_SIZE - 1))
161 );
162
163 return base;
164}
165
166static inline void cpu_sleep(void)
167{
168}
169
170extern void cpu_halt(void) __attribute__((noreturn));
171extern void asm_delay_loop(uint32_t t);
172extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry);
173
174static inline void pio_write_8(ioport8_t *port, uint8_t v)
175{
176 *port = v;
177}
178
179static inline void pio_write_16(ioport16_t *port, uint16_t v)
180{
181 *port = v;
182}
183
184static inline void pio_write_32(ioport32_t *port, uint32_t v)
185{
186 *port = v;
187}
188
189static inline uint8_t pio_read_8(ioport8_t *port)
190{
191 return *port;
192}
193
194static inline uint16_t pio_read_16(ioport16_t *port)
195{
196 return *port;
197}
198
199static inline uint32_t pio_read_32(ioport32_t *port)
200{
201 return *port;
202}
203
204#endif
205
206/** @}
207 */
Note: See TracBrowser for help on using the repository browser.