Skip to contentSkip to conversation

REPOST: Early exception fixes

PATCH In review Andi Kleen 2 participants 9 messages Mar 11, 2008 – Mar 21, 2008 x86

lore
Share & tools
lore

Andi Kleen

author
#0 lore raw

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

author
#1 lore raw

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
Index: linux/arch/x86/kernel/head64.c
===================================================================
@@ -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
Index: linux/include/asm-x86/segment.h
===================================================================
@@ -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
Index: linux/arch/x86/kernel/head_64.S
===================================================================
@@ -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)
author
#2 lore raw

PATCH 2/3 Move early exception handlers into init.text

In reply to Andi Kleen

Currently 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
Index: linux/arch/x86/kernel/head_64.S
===================================================================
@@ -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
 
author
#3 lore raw

PATCH 3/3 Replace macro recursion with more conventional loop

In reply to 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.

---
 arch/x86/kernel/head_64.S |   15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)
arch/x86/kernel/head_64.S +7 -8
Index: linux/arch/x86/kernel/head_64.S
===================================================================
@@ -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)
#4 lore raw

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

author
#5 lore raw

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

#6 lore raw

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

#7 lore raw

Re: [PATCH REPOST] [3/3] Replace macro recursion with more conventional loop

In reply to Andi Kleen
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.

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
#8 lore raw
In reply to Andi Kleen
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