Changeset f24d300 in mainline for kernel/arch/amd64/include/asm.h
- Timestamp:
- 2009-03-03T15:52:55Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e762b43
- Parents:
- add04f7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/include/asm.h
radd04f7 rf24d300 27 27 */ 28 28 29 /** @addtogroup amd64 29 /** @addtogroup amd64 30 30 * @{ 31 31 */ … … 46 46 * The stack is assumed to be STACK_SIZE bytes long. 47 47 * The stack must start on page boundary. 48 * 48 49 */ 49 50 static inline uintptr_t get_stack_base(void) … … 51 52 uintptr_t v; 52 53 53 asm volatile ("andq %%rsp, %0\n" : "=r" (v) : "0" (~((uint64_t)STACK_SIZE-1))); 54 asm volatile ( 55 "andq %%rsp, %[v]\n" 56 : [v] "=r" (v) 57 : "0" (~((uint64_t) STACK_SIZE-1)) 58 ); 54 59 55 60 return v; … … 73 78 * @param port Port to read from 74 79 * @return Value read 80 * 75 81 */ 76 82 static inline uint8_t pio_read_8(ioport8_t *port) 77 83 { 78 84 uint8_t val; 79 80 asm volatile ("inb %w1, %b0 \n" : "=a" (val) : "d" (port)); 85 86 asm volatile ( 87 "inb %w[port], %b[val]\n" 88 : [val] "=a" (val) 89 : [port] "d" (port) 90 ); 91 81 92 return val; 82 93 } … … 88 99 * @param port Port to read from 89 100 * @return Value read 101 * 90 102 */ 91 103 static inline uint16_t pio_read_16(ioport16_t *port) … … 93 105 uint16_t val; 94 106 95 asm volatile ("inw %w1, %w0 \n" : "=a" (val) : "d" (port)); 107 asm volatile ( 108 "inw %w[port], %w[val]\n" 109 : [val] "=a" (val) 110 : [port] "d" (port) 111 ); 112 96 113 return val; 97 114 } … … 103 120 * @param port Port to read from 104 121 * @return Value read 122 * 105 123 */ 106 124 static inline uint32_t pio_read_32(ioport32_t *port) … … 108 126 uint32_t val; 109 127 110 asm volatile ("inl %w1, %0 \n" : "=a" (val) : "d" (port)); 128 asm volatile ( 129 "inl %w[port], %[val]\n" 130 : [val] "=a" (val) 131 : [port] "d" (port) 132 ); 133 111 134 return val; 112 135 } … … 118 141 * @param port Port to write to 119 142 * @param val Value to write 143 * 120 144 */ 121 145 static inline void pio_write_8(ioport8_t *port, uint8_t val) 122 146 { 123 asm volatile ("outb %b0, %w1\n" : : "a" (val), "d" (port)); 147 asm volatile ( 148 "outb %b[val], %w[port]\n" 149 :: [val] "a" (val), [port] "d" (port) 150 ); 124 151 } 125 152 … … 130 157 * @param port Port to write to 131 158 * @param val Value to write 159 * 132 160 */ 133 161 static inline void pio_write_16(ioport16_t *port, uint16_t val) 134 162 { 135 asm volatile ("outw %w0, %w1\n" : : "a" (val), "d" (port)); 163 asm volatile ( 164 "outw %w[val], %w[port]\n" 165 :: [val] "a" (val), [port] "d" (port) 166 ); 136 167 } 137 168 … … 142 173 * @param port Port to write to 143 174 * @param val Value to write 175 * 144 176 */ 145 177 static inline void pio_write_32(ioport32_t *port, uint32_t val) 146 178 { 147 asm volatile ("outl %0, %w1\n" : : "a" (val), "d" (port)); 179 asm volatile ( 180 "outl %[val], %w[port]\n" 181 :: [val] "a" (val), [port] "d" (port) 182 ); 148 183 } 149 184 … … 160 195 * 161 196 * @return Old interrupt priority level. 197 * 162 198 */ 163 199 static inline ipl_t interrupts_enable(void) { 164 200 ipl_t v; 165 __asm__ volatile ( 201 202 asm volatile ( 166 203 "pushfq\n" 167 "popq % 0\n"204 "popq %[v]\n" 168 205 "sti\n" 169 : "=r" (v) 170 ); 206 : [v] "=r" (v) 207 ); 208 171 209 return v; 172 210 } … … 178 216 * 179 217 * @return Old interrupt priority level. 218 * 180 219 */ 181 220 static inline ipl_t interrupts_disable(void) { 182 221 ipl_t v; 183 __asm__ volatile ( 222 223 asm volatile ( 184 224 "pushfq\n" 185 "popq % 0\n"225 "popq %[v]\n" 186 226 "cli\n" 187 : "=r" (v) 188 ); 227 : [v] "=r" (v) 228 ); 229 189 230 return v; 190 231 } … … 195 236 * 196 237 * @param ipl Saved interrupt priority level. 238 * 197 239 */ 198 240 static inline void interrupts_restore(ipl_t ipl) { 199 __asm__volatile (200 "pushq % 0\n"241 asm volatile ( 242 "pushq %[ipl]\n" 201 243 "popfq\n" 202 : :"r" (ipl)203 244 :: [ipl] "r" (ipl) 245 ); 204 246 } 205 247 … … 209 251 * 210 252 * @return Current interrupt priority level. 253 * 211 254 */ 212 255 static inline ipl_t interrupts_read(void) { 213 256 ipl_t v; 214 __asm__ volatile ( 257 258 asm volatile ( 215 259 "pushfq\n" 216 "popq %0\n" 217 : "=r" (v) 218 ); 260 "popq %[v]\n" 261 : [v] "=r" (v) 262 ); 263 219 264 return v; 220 265 } … … 223 268 static inline void write_msr(uint32_t msr, uint64_t value) 224 269 { 225 __asm__ volatile ( 226 "wrmsr;" : : "c" (msr), 227 "a" ((uint32_t)(value)), 228 "d" ((uint32_t)(value >> 32)) 229 ); 270 asm volatile ( 271 "wrmsr\n" 272 :: "c" (msr), 273 "a" ((uint32_t) (value)), 274 "d" ((uint32_t) (value >> 32)) 275 ); 230 276 } 231 277 … … 233 279 { 234 280 uint32_t ax, dx; 235 236 __asm__ volatile ( 237 "rdmsr;" : "=a"(ax), "=d"(dx) : "c" (msr) 238 ); 239 return ((uint64_t)dx << 32) | ax; 281 282 asm volatile ( 283 "rdmsr\n" 284 : "=a" (ax), "=d" (dx) 285 : "c" (msr) 286 ); 287 288 return ((uint64_t) dx << 32) | ax; 240 289 } 241 290 … … 244 293 * 245 294 * Enable local APIC in MSR. 295 * 246 296 */ 247 297 static inline void enable_l_apic_in_msr() 248 298 { 249 __asm__volatile (299 asm volatile ( 250 300 "movl $0x1b, %%ecx\n" 251 301 "rdmsr\n" 252 "orl $(1 <<11),%%eax\n"302 "orl $(1 << 11),%%eax\n" 253 303 "orl $(0xfee00000),%%eax\n" 254 304 "wrmsr\n" 255 : 256 : 257 :"%eax","%ecx","%edx" 258 ); 305 ::: "%eax","%ecx","%edx" 306 ); 259 307 } 260 308 … … 262 310 { 263 311 uintptr_t *ip; 264 265 __asm__ volatile ( 266 "mov %%rip, %0" 267 : "=r" (ip) 268 ); 312 313 asm volatile ( 314 "mov %%rip, %[ip]" 315 : [ip] "=r" (ip) 316 ); 317 269 318 return ip; 270 319 } … … 273 322 * 274 323 * @param addr Address on a page whose TLB entry is to be invalidated. 324 * 275 325 */ 276 326 static inline void invlpg(uintptr_t addr) 277 327 { 278 __asm__ volatile ("invlpg %0\n" :: "m" (*((unative_t *)addr))); 328 asm volatile ( 329 "invlpg %[addr]\n" 330 :: [addr] "m" (*((unative_t *) addr)) 331 ); 279 332 } 280 333 … … 282 335 * 283 336 * @param gdtr_reg Address of memory from where to load GDTR. 337 * 284 338 */ 285 339 static inline void gdtr_load(struct ptr_16_64 *gdtr_reg) 286 340 { 287 __asm__ volatile ("lgdtq %0\n" : : "m" (*gdtr_reg)); 341 asm volatile ( 342 "lgdtq %[gdtr_reg]\n" 343 :: [gdtr_reg] "m" (*gdtr_reg) 344 ); 288 345 } 289 346 … … 291 348 * 292 349 * @param gdtr_reg Address of memory to where to load GDTR. 350 * 293 351 */ 294 352 static inline void gdtr_store(struct ptr_16_64 *gdtr_reg) 295 353 { 296 __asm__ volatile ("sgdtq %0\n" : : "m" (*gdtr_reg)); 354 asm volatile ( 355 "sgdtq %[gdtr_reg]\n" 356 :: [gdtr_reg] "m" (*gdtr_reg) 357 ); 297 358 } 298 359 … … 300 361 * 301 362 * @param idtr_reg Address of memory from where to load IDTR. 363 * 302 364 */ 303 365 static inline void idtr_load(struct ptr_16_64 *idtr_reg) 304 366 { 305 __asm__ volatile ("lidtq %0\n" : : "m" (*idtr_reg)); 367 asm volatile ( 368 "lidtq %[idtr_reg]\n" 369 :: [idtr_reg] "m" (*idtr_reg)); 306 370 } 307 371 … … 309 373 * 310 374 * @param sel Selector specifying descriptor of TSS segment. 375 * 311 376 */ 312 377 static inline void tr_load(uint16_t sel) 313 378 { 314 __asm__ volatile ("ltr %0" : : "r" (sel)); 379 asm volatile ( 380 "ltr %[sel]" 381 :: [sel] "r" (sel) 382 ); 315 383 } 316 384 317 385 #define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \ 318 { \ 319 unative_t res; \ 320 __asm__ volatile ("movq %%" #reg ", %0" : "=r" (res) ); \ 321 return res; \ 322 } 386 { \ 387 unative_t res; \ 388 asm volatile ( \ 389 "movq %%" #reg ", %[res]" \ 390 : [res] "=r" (res) \ 391 ); \ 392 return res; \ 393 } 323 394 324 395 #define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \ 325 { \ 326 __asm__ volatile ("movq %0, %%" #reg : : "r" (regn)); \ 327 } 396 { \ 397 asm volatile ( \ 398 "movq %[regn], %%" #reg \ 399 :: [regn] "r" (regn) \ 400 ); \ 401 } 328 402 329 403 GEN_READ_REG(cr0)
Note:
See TracChangeset
for help on using the changeset viewer.