diff options
| -rw-r--r-- | arch/x86/include/asm/debugreg.h | 67 | ||||
| -rw-r--r-- | arch/x86/include/asm/processor.h | 63 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 1 |
3 files changed, 68 insertions, 63 deletions
diff --git a/arch/x86/include/asm/debugreg.h b/arch/x86/include/asm/debugreg.h index b903d5ea3941..2d91580bf228 100644 --- a/arch/x86/include/asm/debugreg.h +++ b/arch/x86/include/asm/debugreg.h | |||
| @@ -78,8 +78,75 @@ | |||
| 78 | */ | 78 | */ |
| 79 | #ifdef __KERNEL__ | 79 | #ifdef __KERNEL__ |
| 80 | 80 | ||
| 81 | #include <linux/bug.h> | ||
| 82 | |||
| 81 | DECLARE_PER_CPU(unsigned long, cpu_dr7); | 83 | DECLARE_PER_CPU(unsigned long, cpu_dr7); |
| 82 | 84 | ||
| 85 | #ifndef CONFIG_PARAVIRT | ||
| 86 | /* | ||
| 87 | * These special macros can be used to get or set a debugging register | ||
| 88 | */ | ||
| 89 | #define get_debugreg(var, register) \ | ||
| 90 | (var) = native_get_debugreg(register) | ||
| 91 | #define set_debugreg(value, register) \ | ||
| 92 | native_set_debugreg(register, value) | ||
| 93 | #endif | ||
| 94 | |||
| 95 | static inline unsigned long native_get_debugreg(int regno) | ||
| 96 | { | ||
| 97 | unsigned long val = 0; /* Damn you, gcc! */ | ||
| 98 | |||
| 99 | switch (regno) { | ||
| 100 | case 0: | ||
| 101 | asm("mov %%db0, %0" :"=r" (val)); | ||
| 102 | break; | ||
| 103 | case 1: | ||
| 104 | asm("mov %%db1, %0" :"=r" (val)); | ||
| 105 | break; | ||
| 106 | case 2: | ||
| 107 | asm("mov %%db2, %0" :"=r" (val)); | ||
| 108 | break; | ||
| 109 | case 3: | ||
| 110 | asm("mov %%db3, %0" :"=r" (val)); | ||
| 111 | break; | ||
| 112 | case 6: | ||
| 113 | asm("mov %%db6, %0" :"=r" (val)); | ||
| 114 | break; | ||
| 115 | case 7: | ||
| 116 | asm("mov %%db7, %0" :"=r" (val)); | ||
| 117 | break; | ||
| 118 | default: | ||
| 119 | BUG(); | ||
| 120 | } | ||
| 121 | return val; | ||
| 122 | } | ||
| 123 | |||
| 124 | static inline void native_set_debugreg(int regno, unsigned long value) | ||
| 125 | { | ||
| 126 | switch (regno) { | ||
| 127 | case 0: | ||
| 128 | asm("mov %0, %%db0" ::"r" (value)); | ||
| 129 | break; | ||
| 130 | case 1: | ||
| 131 | asm("mov %0, %%db1" ::"r" (value)); | ||
| 132 | break; | ||
| 133 | case 2: | ||
| 134 | asm("mov %0, %%db2" ::"r" (value)); | ||
| 135 | break; | ||
| 136 | case 3: | ||
| 137 | asm("mov %0, %%db3" ::"r" (value)); | ||
| 138 | break; | ||
| 139 | case 6: | ||
| 140 | asm("mov %0, %%db6" ::"r" (value)); | ||
| 141 | break; | ||
| 142 | case 7: | ||
| 143 | asm("mov %0, %%db7" ::"r" (value)); | ||
| 144 | break; | ||
| 145 | default: | ||
| 146 | BUG(); | ||
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 83 | static inline void hw_breakpoint_disable(void) | 150 | static inline void hw_breakpoint_disable(void) |
| 84 | { | 151 | { |
| 85 | /* Zero the control register for HW Breakpoint */ | 152 | /* Zero the control register for HW Breakpoint */ |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 58545c97d071..30aa6e95f814 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -474,61 +474,6 @@ struct thread_struct { | |||
| 474 | unsigned io_bitmap_max; | 474 | unsigned io_bitmap_max; |
| 475 | }; | 475 | }; |
| 476 | 476 | ||
| 477 | static inline unsigned long native_get_debugreg(int regno) | ||
| 478 | { | ||
| 479 | unsigned long val = 0; /* Damn you, gcc! */ | ||
| 480 | |||
| 481 | switch (regno) { | ||
| 482 | case 0: | ||
| 483 | asm("mov %%db0, %0" :"=r" (val)); | ||
| 484 | break; | ||
| 485 | case 1: | ||
| 486 | asm("mov %%db1, %0" :"=r" (val)); | ||
| 487 | break; | ||
| 488 | case 2: | ||
| 489 | asm("mov %%db2, %0" :"=r" (val)); | ||
| 490 | break; | ||
| 491 | case 3: | ||
| 492 | asm("mov %%db3, %0" :"=r" (val)); | ||
| 493 | break; | ||
| 494 | case 6: | ||
| 495 | asm("mov %%db6, %0" :"=r" (val)); | ||
| 496 | break; | ||
| 497 | case 7: | ||
| 498 | asm("mov %%db7, %0" :"=r" (val)); | ||
| 499 | break; | ||
| 500 | default: | ||
| 501 | BUG(); | ||
| 502 | } | ||
| 503 | return val; | ||
| 504 | } | ||
| 505 | |||
| 506 | static inline void native_set_debugreg(int regno, unsigned long value) | ||
| 507 | { | ||
| 508 | switch (regno) { | ||
| 509 | case 0: | ||
| 510 | asm("mov %0, %%db0" ::"r" (value)); | ||
| 511 | break; | ||
| 512 | case 1: | ||
| 513 | asm("mov %0, %%db1" ::"r" (value)); | ||
| 514 | break; | ||
| 515 | case 2: | ||
| 516 | asm("mov %0, %%db2" ::"r" (value)); | ||
| 517 | break; | ||
| 518 | case 3: | ||
| 519 | asm("mov %0, %%db3" ::"r" (value)); | ||
| 520 | break; | ||
| 521 | case 6: | ||
| 522 | asm("mov %0, %%db6" ::"r" (value)); | ||
| 523 | break; | ||
| 524 | case 7: | ||
| 525 | asm("mov %0, %%db7" ::"r" (value)); | ||
| 526 | break; | ||
| 527 | default: | ||
| 528 | BUG(); | ||
| 529 | } | ||
| 530 | } | ||
| 531 | |||
| 532 | /* | 477 | /* |
| 533 | * Set IOPL bits in EFLAGS from given mask | 478 | * Set IOPL bits in EFLAGS from given mask |
| 534 | */ | 479 | */ |
| @@ -574,14 +519,6 @@ static inline void native_swapgs(void) | |||
| 574 | #define __cpuid native_cpuid | 519 | #define __cpuid native_cpuid |
| 575 | #define paravirt_enabled() 0 | 520 | #define paravirt_enabled() 0 |
| 576 | 521 | ||
| 577 | /* | ||
| 578 | * These special macros can be used to get or set a debugging register | ||
| 579 | */ | ||
| 580 | #define get_debugreg(var, register) \ | ||
| 581 | (var) = native_get_debugreg(register) | ||
| 582 | #define set_debugreg(value, register) \ | ||
| 583 | native_set_debugreg(register, value) | ||
| 584 | |||
| 585 | static inline void load_sp0(struct tss_struct *tss, | 522 | static inline void load_sp0(struct tss_struct *tss, |
| 586 | struct thread_struct *thread) | 523 | struct thread_struct *thread) |
| 587 | { | 524 | { |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c0f7d68d318f..0d676dd923ac 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <asm/archrandom.h> | 18 | #include <asm/archrandom.h> |
| 19 | #include <asm/hypervisor.h> | 19 | #include <asm/hypervisor.h> |
| 20 | #include <asm/processor.h> | 20 | #include <asm/processor.h> |
| 21 | #include <asm/debugreg.h> | ||
| 21 | #include <asm/sections.h> | 22 | #include <asm/sections.h> |
| 22 | #include <linux/topology.h> | 23 | #include <linux/topology.h> |
| 23 | #include <linux/cpumask.h> | 24 | #include <linux/cpumask.h> |
