diff options
-rw-r--r-- | Documentation/kernel-parameters.txt | 5 | ||||
-rw-r--r-- | arch/i386/kernel/traps.c | 20 |
2 files changed, 21 insertions, 4 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 733a736bc6c8..22b19962a1a2 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -364,6 +364,11 @@ and is between 256 and 4096 characters. It is defined in the file | |||
364 | clocksource is not available, it defaults to PIT. | 364 | clocksource is not available, it defaults to PIT. |
365 | Format: { pit | tsc | cyclone | pmtmr } | 365 | Format: { pit | tsc | cyclone | pmtmr } |
366 | 366 | ||
367 | code_bytes [IA32] How many bytes of object code to print in an | ||
368 | oops report. | ||
369 | Range: 0 - 8192 | ||
370 | Default: 64 | ||
371 | |||
367 | disable_8254_timer | 372 | disable_8254_timer |
368 | enable_8254_timer | 373 | enable_8254_timer |
369 | [IA32/X86_64] Disable/Enable interrupt 0 timer routing | 374 | [IA32/X86_64] Disable/Enable interrupt 0 timer routing |
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index 4ec21037a361..af0d3f70a817 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
@@ -94,6 +94,7 @@ asmlinkage void spurious_interrupt_bug(void); | |||
94 | asmlinkage void machine_check(void); | 94 | asmlinkage void machine_check(void); |
95 | 95 | ||
96 | int kstack_depth_to_print = 24; | 96 | int kstack_depth_to_print = 24; |
97 | static unsigned int code_bytes = 64; | ||
97 | ATOMIC_NOTIFIER_HEAD(i386die_chain); | 98 | ATOMIC_NOTIFIER_HEAD(i386die_chain); |
98 | 99 | ||
99 | int register_die_notifier(struct notifier_block *nb) | 100 | int register_die_notifier(struct notifier_block *nb) |
@@ -325,7 +326,8 @@ void show_registers(struct pt_regs *regs) | |||
325 | */ | 326 | */ |
326 | if (in_kernel) { | 327 | if (in_kernel) { |
327 | u8 *eip; | 328 | u8 *eip; |
328 | int code_bytes = 64; | 329 | unsigned int code_prologue = code_bytes * 43 / 64; |
330 | unsigned int code_len = code_bytes; | ||
329 | unsigned char c; | 331 | unsigned char c; |
330 | 332 | ||
331 | printk("\n" KERN_EMERG "Stack: "); | 333 | printk("\n" KERN_EMERG "Stack: "); |
@@ -333,14 +335,14 @@ void show_registers(struct pt_regs *regs) | |||
333 | 335 | ||
334 | printk(KERN_EMERG "Code: "); | 336 | printk(KERN_EMERG "Code: "); |
335 | 337 | ||
336 | eip = (u8 *)regs->eip - 43; | 338 | eip = (u8 *)regs->eip - code_prologue; |
337 | if (eip < (u8 *)PAGE_OFFSET || | 339 | if (eip < (u8 *)PAGE_OFFSET || |
338 | probe_kernel_address(eip, c)) { | 340 | probe_kernel_address(eip, c)) { |
339 | /* try starting at EIP */ | 341 | /* try starting at EIP */ |
340 | eip = (u8 *)regs->eip; | 342 | eip = (u8 *)regs->eip; |
341 | code_bytes = 32; | 343 | code_len = code_len - code_prologue + 1; |
342 | } | 344 | } |
343 | for (i = 0; i < code_bytes; i++, eip++) { | 345 | for (i = 0; i < code_len; i++, eip++) { |
344 | if (eip < (u8 *)PAGE_OFFSET || | 346 | if (eip < (u8 *)PAGE_OFFSET || |
345 | probe_kernel_address(eip, c)) { | 347 | probe_kernel_address(eip, c)) { |
346 | printk(" Bad EIP value."); | 348 | printk(" Bad EIP value."); |
@@ -1192,3 +1194,13 @@ static int __init kstack_setup(char *s) | |||
1192 | return 1; | 1194 | return 1; |
1193 | } | 1195 | } |
1194 | __setup("kstack=", kstack_setup); | 1196 | __setup("kstack=", kstack_setup); |
1197 | |||
1198 | static int __init code_bytes_setup(char *s) | ||
1199 | { | ||
1200 | code_bytes = simple_strtoul(s, NULL, 0); | ||
1201 | if (code_bytes > 8192) | ||
1202 | code_bytes = 8192; | ||
1203 | |||
1204 | return 1; | ||
1205 | } | ||
1206 | __setup("code_bytes=", code_bytes_setup); | ||