REPOST: Early exception fixes
cover REPOST: Early exception fixes
Mostly saves some code size and cleans up the code after Roland's recent changes.
Please ack or nack.
-Andi
PATCH 1/3 Don't set up early exception handlers for external interrupts
All of early setup runs with interrupts disabled, so there is no need to set up early exception handlers for vectors >= 32
This saves some minor text size.
--- arch/x86/kernel/head64.c | 2 +- arch/x86/kernel/head_64.S | 6 ++---- include/asm-x86/segment.h | 3 ++- 3 files changed, 5 insertions(+), 6 deletions(-)
arch/x86/kernel/head64.c +1 -1
@@ -91,7 +91,7 @@ void __init x86_64_start_kernel(char * r/* Cleanup the over mapped high alias */ cleanup_highmap (); -for (i =0 ; i <IDT_ENTRIES ; i++) { +for (i =0 ; i <NUM_EXCEPTION_VECTORS ; i++) {#ifdef CONFIG_EARLY_PRINTK set_intr_gate (i, &early_idt_handlers[i]);#else
include/asm-x86/segment.h +2 -1
@@ -191,13 +191,14 @@#define SEGMENT_TI_MASK 0x4#define IDT_ENTRIES 256 +#define NUM_EXCEPTION_VECTORS 32#define GDT_SIZE (GDT_ENTRIES * 8)#define GDT_ENTRY_TLS_ENTRIES 3#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)#ifdef __KERNEL__#ifndef __ASSEMBLY__ -extern const char early_idt_handlers[IDT_ENTRIES ][10 ]; +extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS ][10 ];#endif #endif
arch/x86/kernel/head_64.S +2 -4
@@ -278,10 +278,8 @@ bad_address: .globl early_idt_handlers early_idt_handlers: - early_idt_tramp 0, 63 - early_idt_tramp 64, 127 - early_idt_tramp 128, 191 - early_idt_tramp 192, 255 + .set maxe,NUM_EXCEPTION_VECTORS-1 + early_idt_tramp 0,maxe #endif ENTRY(early_idt_handler)
PATCH 2/3 Move early exception handlers into init.text
In reply to Andi KleenCurrently they are in .text.head because the rest of head_64.S. .text.head is not removed as init data, but the early exception handlers should be because they are not needed after early boot of the BP. So move them over.
--- arch/x86/kernel/head_64.S | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/kernel/head_64.S +2 -0
@@ -267,6 +267,7 @@ ENTRY(secondary_startup_64) bad_address: jmp bad_address + .section ".init.text","ax" #ifdef CONFIG_EARLY_PRINTK .macro early_idt_tramp first, last .ifgt \last-\first
@@ -325,6 +326,7 @@ early_idt_msg: early_idt_ripmsg: .asciz "RIP %s\n" #endif /* CONFIG_EARLY_PRINTK */ + .previous .balign PAGE_SIZE
PATCH 3/3 Replace macro recursion with more conventional loop
In reply to Andi KleenThe early exception handlers are currently set up using a macro recursion. Replace that with a standard loop.
Noop patch, just a cleanup.
--- arch/x86/kernel/head_64.S | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
arch/x86/kernel/head_64.S +7 -8
@@ -269,18 +269,17 @@ bad_address: .section ".init.text","ax" #ifdef CONFIG_EARLY_PRINTK -.macro early_idt_tramp first, last - .ifgt \last-\first - early_idt_tramp \first, \last-1 - .endif - movl $\last,%esi +.macro early_idt_tramp i + movl $\i,%esi jmp early_idt_handler .endm - .globl early_idt_handlers early_idt_handlers: - .set maxe,NUM_EXCEPTION_VECTORS-1 - early_idt_tramp 0,maxe + i = 0 + .rept NUM_EXCEPTION_VECTORS + early_idt_tramp i + i = i+1 + .endr #endif ENTRY(early_idt_handler)
Re: [PATCH REPOST] [3/3] Replace macro recursion with more conventional loop
Quoted 4 lines · Andi Kleen
The early exception handlers are currently set up using a macro recursion. Replace that with a standard loop.
Noop patch, just a cleanup.
Cleanups before code changes please.
Thanks,
tglx
Re: [PATCH REPOST] [3/3] Replace macro recursion with more conventional loop
Quoted 7 lines · Thomas Gleixner
Quoted 4 lines · Andi Kleen
The early exception handlers are currently set up using a macro recursion. Replace that with a standard loop.
Noop patch, just a cleanup.
Cleanups before code changes please.
It relies on the earlier changes.
-Andi
Re: [PATCH REPOST] [3/3] Replace macro recursion with more conventional loop
Quoted 10 lines · Andi Kleen
Quoted 7 lines · Thomas Gleixner
Quoted 4 lines · Andi Kleen
The early exception handlers are currently set up using a macro recursion. Replace that with a standard loop.
Noop patch, just a cleanup.
Cleanups before code changes please.
It relies on the earlier changes.
What a hard work to reverse the order of those patches.
Thanks,
tglx
Re: [PATCH REPOST] [3/3] Replace macro recursion with more conventional loop
In reply to Andi KleenQuoted 10 lines · Andi Kleen
Quoted 7 lines · Thomas Gleixner
Quoted 4 lines · Andi Kleen
The early exception handlers are currently set up using a macro recursion. Replace that with a standard loop.
Noop patch, just a cleanup.
Cleanups before code changes please.
It relies on the earlier changes.
I just had a closer look. Your patch order makes sense. It's less noise that way due to the previous removal of the 3 users of the macro.
I applied the series with the following changes:
- Moved 3/3 before 2/3 to make it clear that this is a consecutive cleanup
- Simplified 3/3 (patch below)
- fixed the commit log of 3/3 so it points out why the cleanup is done
Btw, can you please add a "x86:" prefix to your subject lines ?
Thanks,
tglx
--
The early exception handlers are currently set up using a macro recursion. There is only one user left. Replace the macro with a standard loop in place.
arch/x86/kernel/head_64.S +2 -5
@@ -269,15 +269,12 @@ bad_address: .section ".init.text","ax" #ifdef CONFIG_EARLY_PRINTK -.macro early_idt_tramp i - movl $\i, %esi - jmp early_idt_handler -.endm .globl early_idt_handlers early_idt_handlers: i = 0 .rept NUM_EXCEPTION_VECTORS - early_idt_tramp i + movl $i, %esi + jmp early_idt_handler i = i + 1 .endr #endif
Quoted 5 lines · Andi Kleen
Mostly saves some code size and cleans up the code after Roland's recent changes.
Please ack or nack.
Will do, when I work through my mail backlog.
Thanks,
tglx