.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | /* -*- linux-c -*- ------------------------------------------------------- * |
---|
2 | 3 | * |
---|
3 | 4 | * Copyright (C) 1991, 1992 Linus Torvalds |
---|
4 | 5 | * Copyright 2007 rPath, Inc. - All Rights Reserved |
---|
5 | 6 | * Copyright 2009 Intel Corporation; author H. Peter Anvin |
---|
6 | | - * |
---|
7 | | - * This file is part of the Linux kernel, and is made available under |
---|
8 | | - * the terms of the GNU General Public License version 2. |
---|
9 | 7 | * |
---|
10 | 8 | * ----------------------------------------------------------------------- */ |
---|
11 | 9 | |
---|
.. | .. |
---|
30 | 28 | #include "cpuflags.h" |
---|
31 | 29 | |
---|
32 | 30 | /* Useful macros */ |
---|
33 | | -#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) |
---|
34 | | - |
---|
35 | 31 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) |
---|
36 | 32 | |
---|
37 | 33 | extern struct setup_header hdr; |
---|
.. | .. |
---|
114 | 110 | |
---|
115 | 111 | static inline u8 rdfs8(addr_t addr) |
---|
116 | 112 | { |
---|
| 113 | + u8 *ptr = (u8 *)absolute_pointer(addr); |
---|
117 | 114 | u8 v; |
---|
118 | | - asm volatile("movb %%fs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr)); |
---|
| 115 | + asm volatile("movb %%fs:%1,%0" : "=q" (v) : "m" (*ptr)); |
---|
119 | 116 | return v; |
---|
120 | 117 | } |
---|
121 | 118 | static inline u16 rdfs16(addr_t addr) |
---|
122 | 119 | { |
---|
| 120 | + u16 *ptr = (u16 *)absolute_pointer(addr); |
---|
123 | 121 | u16 v; |
---|
124 | | - asm volatile("movw %%fs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr)); |
---|
| 122 | + asm volatile("movw %%fs:%1,%0" : "=r" (v) : "m" (*ptr)); |
---|
125 | 123 | return v; |
---|
126 | 124 | } |
---|
127 | 125 | static inline u32 rdfs32(addr_t addr) |
---|
128 | 126 | { |
---|
| 127 | + u32 *ptr = (u32 *)absolute_pointer(addr); |
---|
129 | 128 | u32 v; |
---|
130 | | - asm volatile("movl %%fs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr)); |
---|
| 129 | + asm volatile("movl %%fs:%1,%0" : "=r" (v) : "m" (*ptr)); |
---|
131 | 130 | return v; |
---|
132 | 131 | } |
---|
133 | 132 | |
---|
134 | 133 | static inline void wrfs8(u8 v, addr_t addr) |
---|
135 | 134 | { |
---|
136 | | - asm volatile("movb %1,%%fs:%0" : "+m" (*(u8 *)addr) : "qi" (v)); |
---|
| 135 | + u8 *ptr = (u8 *)absolute_pointer(addr); |
---|
| 136 | + asm volatile("movb %1,%%fs:%0" : "+m" (*ptr) : "qi" (v)); |
---|
137 | 137 | } |
---|
138 | 138 | static inline void wrfs16(u16 v, addr_t addr) |
---|
139 | 139 | { |
---|
140 | | - asm volatile("movw %1,%%fs:%0" : "+m" (*(u16 *)addr) : "ri" (v)); |
---|
| 140 | + u16 *ptr = (u16 *)absolute_pointer(addr); |
---|
| 141 | + asm volatile("movw %1,%%fs:%0" : "+m" (*ptr) : "ri" (v)); |
---|
141 | 142 | } |
---|
142 | 143 | static inline void wrfs32(u32 v, addr_t addr) |
---|
143 | 144 | { |
---|
144 | | - asm volatile("movl %1,%%fs:%0" : "+m" (*(u32 *)addr) : "ri" (v)); |
---|
| 145 | + u32 *ptr = (u32 *)absolute_pointer(addr); |
---|
| 146 | + asm volatile("movl %1,%%fs:%0" : "+m" (*ptr) : "ri" (v)); |
---|
145 | 147 | } |
---|
146 | 148 | |
---|
147 | 149 | static inline u8 rdgs8(addr_t addr) |
---|
148 | 150 | { |
---|
| 151 | + u8 *ptr = (u8 *)absolute_pointer(addr); |
---|
149 | 152 | u8 v; |
---|
150 | | - asm volatile("movb %%gs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr)); |
---|
| 153 | + asm volatile("movb %%gs:%1,%0" : "=q" (v) : "m" (*ptr)); |
---|
151 | 154 | return v; |
---|
152 | 155 | } |
---|
153 | 156 | static inline u16 rdgs16(addr_t addr) |
---|
154 | 157 | { |
---|
| 158 | + u16 *ptr = (u16 *)absolute_pointer(addr); |
---|
155 | 159 | u16 v; |
---|
156 | | - asm volatile("movw %%gs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr)); |
---|
| 160 | + asm volatile("movw %%gs:%1,%0" : "=r" (v) : "m" (*ptr)); |
---|
157 | 161 | return v; |
---|
158 | 162 | } |
---|
159 | 163 | static inline u32 rdgs32(addr_t addr) |
---|
160 | 164 | { |
---|
| 165 | + u32 *ptr = (u32 *)absolute_pointer(addr); |
---|
161 | 166 | u32 v; |
---|
162 | | - asm volatile("movl %%gs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr)); |
---|
| 167 | + asm volatile("movl %%gs:%1,%0" : "=r" (v) : "m" (*ptr)); |
---|
163 | 168 | return v; |
---|
164 | 169 | } |
---|
165 | 170 | |
---|
166 | 171 | static inline void wrgs8(u8 v, addr_t addr) |
---|
167 | 172 | { |
---|
168 | | - asm volatile("movb %1,%%gs:%0" : "+m" (*(u8 *)addr) : "qi" (v)); |
---|
| 173 | + u8 *ptr = (u8 *)absolute_pointer(addr); |
---|
| 174 | + asm volatile("movb %1,%%gs:%0" : "+m" (*ptr) : "qi" (v)); |
---|
169 | 175 | } |
---|
170 | 176 | static inline void wrgs16(u16 v, addr_t addr) |
---|
171 | 177 | { |
---|
172 | | - asm volatile("movw %1,%%gs:%0" : "+m" (*(u16 *)addr) : "ri" (v)); |
---|
| 178 | + u16 *ptr = (u16 *)absolute_pointer(addr); |
---|
| 179 | + asm volatile("movw %1,%%gs:%0" : "+m" (*ptr) : "ri" (v)); |
---|
173 | 180 | } |
---|
174 | 181 | static inline void wrgs32(u32 v, addr_t addr) |
---|
175 | 182 | { |
---|
176 | | - asm volatile("movl %1,%%gs:%0" : "+m" (*(u32 *)addr) : "ri" (v)); |
---|
| 183 | + u32 *ptr = (u32 *)absolute_pointer(addr); |
---|
| 184 | + asm volatile("movl %1,%%gs:%0" : "+m" (*ptr) : "ri" (v)); |
---|
177 | 185 | } |
---|
178 | 186 | |
---|
179 | 187 | /* Note: these only return true/false, not a signed return value! */ |
---|
.. | .. |
---|
309 | 317 | void __attribute__((noreturn)) die(void); |
---|
310 | 318 | |
---|
311 | 319 | /* memory.c */ |
---|
312 | | -int detect_memory(void); |
---|
| 320 | +void detect_memory(void); |
---|
313 | 321 | |
---|
314 | 322 | /* pm.c */ |
---|
315 | 323 | void __attribute__((noreturn)) go_to_protected_mode(void); |
---|