| .. | .. |
|---|
| 110 | 110 | |
|---|
| 111 | 111 | static inline u8 rdfs8(addr_t addr) |
|---|
| 112 | 112 | { |
|---|
| 113 | + u8 *ptr = (u8 *)absolute_pointer(addr); |
|---|
| 113 | 114 | 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)); |
|---|
| 115 | 116 | return v; |
|---|
| 116 | 117 | } |
|---|
| 117 | 118 | static inline u16 rdfs16(addr_t addr) |
|---|
| 118 | 119 | { |
|---|
| 120 | + u16 *ptr = (u16 *)absolute_pointer(addr); |
|---|
| 119 | 121 | 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)); |
|---|
| 121 | 123 | return v; |
|---|
| 122 | 124 | } |
|---|
| 123 | 125 | static inline u32 rdfs32(addr_t addr) |
|---|
| 124 | 126 | { |
|---|
| 127 | + u32 *ptr = (u32 *)absolute_pointer(addr); |
|---|
| 125 | 128 | 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)); |
|---|
| 127 | 130 | return v; |
|---|
| 128 | 131 | } |
|---|
| 129 | 132 | |
|---|
| 130 | 133 | static inline void wrfs8(u8 v, addr_t addr) |
|---|
| 131 | 134 | { |
|---|
| 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)); |
|---|
| 133 | 137 | } |
|---|
| 134 | 138 | static inline void wrfs16(u16 v, addr_t addr) |
|---|
| 135 | 139 | { |
|---|
| 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)); |
|---|
| 137 | 142 | } |
|---|
| 138 | 143 | static inline void wrfs32(u32 v, addr_t addr) |
|---|
| 139 | 144 | { |
|---|
| 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)); |
|---|
| 141 | 147 | } |
|---|
| 142 | 148 | |
|---|
| 143 | 149 | static inline u8 rdgs8(addr_t addr) |
|---|
| 144 | 150 | { |
|---|
| 151 | + u8 *ptr = (u8 *)absolute_pointer(addr); |
|---|
| 145 | 152 | 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)); |
|---|
| 147 | 154 | return v; |
|---|
| 148 | 155 | } |
|---|
| 149 | 156 | static inline u16 rdgs16(addr_t addr) |
|---|
| 150 | 157 | { |
|---|
| 158 | + u16 *ptr = (u16 *)absolute_pointer(addr); |
|---|
| 151 | 159 | 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)); |
|---|
| 153 | 161 | return v; |
|---|
| 154 | 162 | } |
|---|
| 155 | 163 | static inline u32 rdgs32(addr_t addr) |
|---|
| 156 | 164 | { |
|---|
| 165 | + u32 *ptr = (u32 *)absolute_pointer(addr); |
|---|
| 157 | 166 | 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)); |
|---|
| 159 | 168 | return v; |
|---|
| 160 | 169 | } |
|---|
| 161 | 170 | |
|---|
| 162 | 171 | static inline void wrgs8(u8 v, addr_t addr) |
|---|
| 163 | 172 | { |
|---|
| 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)); |
|---|
| 165 | 175 | } |
|---|
| 166 | 176 | static inline void wrgs16(u16 v, addr_t addr) |
|---|
| 167 | 177 | { |
|---|
| 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)); |
|---|
| 169 | 180 | } |
|---|
| 170 | 181 | static inline void wrgs32(u32 v, addr_t addr) |
|---|
| 171 | 182 | { |
|---|
| 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)); |
|---|
| 173 | 185 | } |
|---|
| 174 | 186 | |
|---|
| 175 | 187 | /* Note: these only return true/false, not a signed return value! */ |
|---|