| .. | .. |
|---|
| 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); |
|---|