hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/x86/boot/boot.h
....@@ -110,66 +110,78 @@
110110
111111 static inline u8 rdfs8(addr_t addr)
112112 {
113
+ u8 *ptr = (u8 *)absolute_pointer(addr);
113114 u8 v;
114
- asm volatile("movb %%fs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr));
115
+ asm volatile("movb %%fs:%1,%0" : "=q" (v) : "m" (*ptr));
115116 return v;
116117 }
117118 static inline u16 rdfs16(addr_t addr)
118119 {
120
+ u16 *ptr = (u16 *)absolute_pointer(addr);
119121 u16 v;
120
- asm volatile("movw %%fs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
122
+ asm volatile("movw %%fs:%1,%0" : "=r" (v) : "m" (*ptr));
121123 return v;
122124 }
123125 static inline u32 rdfs32(addr_t addr)
124126 {
127
+ u32 *ptr = (u32 *)absolute_pointer(addr);
125128 u32 v;
126
- asm volatile("movl %%fs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
129
+ asm volatile("movl %%fs:%1,%0" : "=r" (v) : "m" (*ptr));
127130 return v;
128131 }
129132
130133 static inline void wrfs8(u8 v, addr_t addr)
131134 {
132
- 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));
133137 }
134138 static inline void wrfs16(u16 v, addr_t addr)
135139 {
136
- 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));
137142 }
138143 static inline void wrfs32(u32 v, addr_t addr)
139144 {
140
- 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));
141147 }
142148
143149 static inline u8 rdgs8(addr_t addr)
144150 {
151
+ u8 *ptr = (u8 *)absolute_pointer(addr);
145152 u8 v;
146
- asm volatile("movb %%gs:%1,%0" : "=q" (v) : "m" (*(u8 *)addr));
153
+ asm volatile("movb %%gs:%1,%0" : "=q" (v) : "m" (*ptr));
147154 return v;
148155 }
149156 static inline u16 rdgs16(addr_t addr)
150157 {
158
+ u16 *ptr = (u16 *)absolute_pointer(addr);
151159 u16 v;
152
- asm volatile("movw %%gs:%1,%0" : "=r" (v) : "m" (*(u16 *)addr));
160
+ asm volatile("movw %%gs:%1,%0" : "=r" (v) : "m" (*ptr));
153161 return v;
154162 }
155163 static inline u32 rdgs32(addr_t addr)
156164 {
165
+ u32 *ptr = (u32 *)absolute_pointer(addr);
157166 u32 v;
158
- asm volatile("movl %%gs:%1,%0" : "=r" (v) : "m" (*(u32 *)addr));
167
+ asm volatile("movl %%gs:%1,%0" : "=r" (v) : "m" (*ptr));
159168 return v;
160169 }
161170
162171 static inline void wrgs8(u8 v, addr_t addr)
163172 {
164
- 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));
165175 }
166176 static inline void wrgs16(u16 v, addr_t addr)
167177 {
168
- 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));
169180 }
170181 static inline void wrgs32(u32 v, addr_t addr)
171182 {
172
- 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));
173185 }
174186
175187 /* Note: these only return true/false, not a signed return value! */