diff options
Diffstat (limited to 'arch/x86/kernel/cpu/common.c')
-rw-r--r-- | arch/x86/kernel/cpu/common.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c1c00d0b1692..cc83a002786e 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -1084,6 +1084,20 @@ static void clear_all_debug_regs(void) | |||
1084 | } | 1084 | } |
1085 | } | 1085 | } |
1086 | 1086 | ||
1087 | #ifdef CONFIG_KGDB | ||
1088 | /* | ||
1089 | * Restore debug regs if using kgdbwait and you have a kernel debugger | ||
1090 | * connection established. | ||
1091 | */ | ||
1092 | static void dbg_restore_debug_regs(void) | ||
1093 | { | ||
1094 | if (unlikely(kgdb_connected && arch_kgdb_ops.correct_hw_break)) | ||
1095 | arch_kgdb_ops.correct_hw_break(); | ||
1096 | } | ||
1097 | #else /* ! CONFIG_KGDB */ | ||
1098 | #define dbg_restore_debug_regs() | ||
1099 | #endif /* ! CONFIG_KGDB */ | ||
1100 | |||
1087 | /* | 1101 | /* |
1088 | * cpu_init() initializes state that is per-CPU. Some data is already | 1102 | * cpu_init() initializes state that is per-CPU. Some data is already |
1089 | * initialized (naturally) in the bootstrap process, such as the GDT | 1103 | * initialized (naturally) in the bootstrap process, such as the GDT |
@@ -1174,18 +1188,8 @@ void __cpuinit cpu_init(void) | |||
1174 | load_TR_desc(); | 1188 | load_TR_desc(); |
1175 | load_LDT(&init_mm.context); | 1189 | load_LDT(&init_mm.context); |
1176 | 1190 | ||
1177 | #ifdef CONFIG_KGDB | 1191 | clear_all_debug_regs(); |
1178 | /* | 1192 | dbg_restore_debug_regs(); |
1179 | * If the kgdb is connected no debug regs should be altered. This | ||
1180 | * is only applicable when KGDB and a KGDB I/O module are built | ||
1181 | * into the kernel and you are using early debugging with | ||
1182 | * kgdbwait. KGDB will control the kernel HW breakpoint registers. | ||
1183 | */ | ||
1184 | if (kgdb_connected && arch_kgdb_ops.correct_hw_break) | ||
1185 | arch_kgdb_ops.correct_hw_break(); | ||
1186 | else | ||
1187 | #endif | ||
1188 | clear_all_debug_regs(); | ||
1189 | 1193 | ||
1190 | fpu_init(); | 1194 | fpu_init(); |
1191 | 1195 | ||
@@ -1239,6 +1243,7 @@ void __cpuinit cpu_init(void) | |||
1239 | #endif | 1243 | #endif |
1240 | 1244 | ||
1241 | clear_all_debug_regs(); | 1245 | clear_all_debug_regs(); |
1246 | dbg_restore_debug_regs(); | ||
1242 | 1247 | ||
1243 | /* | 1248 | /* |
1244 | * Force FPU initialization: | 1249 | * Force FPU initialization: |