Skip to contentSkip to conversation

x86/head_64.S: Rename start_cpu()

PATCH In review Borislav Petkov 3 participants 8 messages Mar 4, 2017 – Mar 7, 2017 x86

lore
Share & tools
lore

Borislav Petkov

author maintainer
#0 lore raw

PATCH 1/2 x86/head_64.S: Rename start_cpu()

From: Borislav Petkov <[email protected]>

It doesn't really start a CPU but does a far jump to C code. So call it that. Eliminate the unconditional JMP to it from secondary_startup_64() but make the jump to C code piece part of secondary_startup_64() instead.

Also, it doesn't need to be a global symbol either so make it a local label. One less needlessly global symbol in the symbol table.

No functionality change.

---
 arch/x86/kernel/head_64.S | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
arch/x86/kernel/head_64.S +4 -6
index b467b14b03eb..ac9d327d2e42 100644
@@ -269,10 +269,8 @@ ENTRY(secondary_startup_64)
 	/* rsi is pointer to real mode structure with interesting info.
 	   pass it to C */
 	movq	%rsi, %rdi
-	jmp	start_cpu
-ENDPROC(secondary_startup_64)
 
-ENTRY(start_cpu)
+.Ljump_to_C_code:
 	/*
 	 * Jump to run C code and to be on a real kernel address.
 	 * Since we are running on identity-mapped space we have to jump
@@ -305,7 +303,7 @@ ENTRY(start_cpu)
 	pushq	%rax		# target address in negative space
 	lretq
 .Lafter_lret:
-ENDPROC(start_cpu)
+ENDPROC(secondary_startup_64)
 
 #include "verify_cpu.S"
 
@@ -313,11 +311,11 @@ ENDPROC(start_cpu)
 /*
  * Boot CPU0 entry point. It's called from play_dead(). Everything has been set
  * up already except stack. We just set up stack here. Then call
- * start_secondary() via start_cpu().
+ * start_secondary() via .Ljump_to_C_code.
  */
 ENTRY(start_cpu0)
 	movq	initial_stack(%rip), %rsp
-	jmp	start_cpu
+	jmp	.Ljump_to_C_code
 ENDPROC(start_cpu0)
 #endif
 
Signature · 1 line
2.11.0
author maintainer
#1 lore raw

PATCH 2/2 x86/head_64.S: Pass struct boot_params' virtual address to C

From: Borislav Petkov <[email protected]>

... so that callees don't have to convert it and can use it directly. Simplifies C code a bit. Cleanup comments and formatting in the vicinity, while at it.

Also, document what phys_base really is.

No functionality change.

---
 arch/x86/kernel/head64.c  |  8 ++++----
 arch/x86/kernel/head_64.S | 10 +++++++---
 2 files changed, 11 insertions(+), 7 deletions(-)
arch/x86/kernel/head64.c +4 -4
index 54a2372f5dbb..17ee20a9b4e4 100644
@@ -118,7 +118,7 @@ static unsigned long get_cmd_line_ptr(void)
 
 static void __init copy_bootdata(char *real_mode_data)
 {
-	char * command_line;
+	char *command_line;
 	unsigned long cmd_line_ptr;
 
 	memcpy(&boot_params, real_mode_data, sizeof boot_params);
@@ -130,7 +130,7 @@ static void __init copy_bootdata(char *real_mode_data)
 	}
 }
 
-asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
+asmlinkage __visible void __init x86_64_start_kernel(char *real_mode_data)
 {
 	int i;
 
@@ -163,7 +163,7 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
 		set_intr_gate(i, early_idt_handler_array[i]);
 	load_idt((const struct desc_ptr *)&idt_descr);
 
-	copy_bootdata(__va(real_mode_data));
+	copy_bootdata(real_mode_data);
 
 	/*
 	 * Load microcode early on BSP.
@@ -180,7 +180,7 @@ void __init x86_64_start_reservations(char *real_mode_data)
 {
 	/* version is always not zero if it is copied */
 	if (!boot_params.hdr.version)
-		copy_bootdata(__va(real_mode_data));
+		copy_bootdata(real_mode_data);
 
 	x86_early_init_platform_quirks();
 
arch/x86/kernel/head_64.S +7 -3
index ac9d327d2e42..506de36293bc 100644
@@ -266,9 +266,12 @@ ENTRY(secondary_startup_64)
 	movl	initial_gs+4(%rip),%edx
 	wrmsr
 
-	/* rsi is pointer to real mode structure with interesting info.
-	   pass it to C */
-	movq	%rsi, %rdi
+	/*
+	 * %rsi is pointer to real mode struct boot_params with interesting info.
+	 * Pass its virtual address to C.
+	 */
+	movq	$__PAGE_OFFSET_BASE, %rdi
+	addq	%rsi, %rdi
 
 .Ljump_to_C_code:
 	/*
@@ -487,6 +490,7 @@ early_gdt_descr:
 early_gdt_descr_base:
 	.quad	INIT_PER_CPU_VAR(gdt_page)
 
+/* The physical address the kernel is loaded at. */
 ENTRY(phys_base)
 	/* This must match the first entry in level2_kernel_pgt */
 	.quad   0x0000000000000000
Signature · 1 line
2.11.0
#2 lore raw

Re: [PATCH 2/2] x86/head_64.S: Pass struct boot_params' virtual address to C

Quoted 63 lines · Borislav Petkov

From: Borislav Petkov <[email protected]>

... so that callees don't have to convert it and can use it directly. Simplifies C code a bit. Cleanup comments and formatting in the vicinity, while at it.

Also, document what phys_base really is.

No functionality change.

---
 arch/x86/kernel/head64.c  |  8 ++++----
 arch/x86/kernel/head_64.S | 10 +++++++---
 2 files changed, 11 insertions(+), 7 deletions(-)
arch/x86/kernel/head64.c +4 -4
index 54a2372f5dbb..17ee20a9b4e4 100644
@@ -118,7 +118,7 @@ static unsigned long get_cmd_line_ptr(void)
 
 static void __init copy_bootdata(char *real_mode_data)
 {
-	char * command_line;
+	char *command_line;
 	unsigned long cmd_line_ptr;
 
 	memcpy(&boot_params, real_mode_data, sizeof boot_params);
@@ -130,7 +130,7 @@ static void __init copy_bootdata(char *real_mode_data)
 	}
 }
 
-asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
+asmlinkage __visible void __init x86_64_start_kernel(char *real_mode_data)
 {
 	int i;
 
@@ -163,7 +163,7 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
 		set_intr_gate(i, early_idt_handler_array[i]);
 	load_idt((const struct desc_ptr *)&idt_descr);
 
-	copy_bootdata(__va(real_mode_data));
+	copy_bootdata(real_mode_data);
 
 	/*
 	 * Load microcode early on BSP.
@@ -180,7 +180,7 @@ void __init x86_64_start_reservations(char *real_mode_data)
 {
 	/* version is always not zero if it is copied */
 	if (!boot_params.hdr.version)
-		copy_bootdata(__va(real_mode_data));
+		copy_bootdata(real_mode_data);
 
 	x86_early_init_platform_quirks();
 
arch/x86/kernel/head_64.S +0 -0
index ac9d327d2e42..506de36293bc 100644
@@ -266,9 +266,12 @@ ENTRY(secondary_startup_64)
 	movl	initial_gs+4(%rip),%edx
 	wrmsr

arch/x86/kernel/head_64.S ENTRY(secondary_startup_64) · line 274

Quoted 10 lines
arch/x86/kernel/head_64.S +6 -3
 
-	/* rsi is pointer to real mode structure with interesting info.
-	   pass it to C */
-	movq	%rsi, %rdi
+	/*
+	 * %rsi is pointer to real mode struct boot_params with interesting info.
+	 * Pass its virtual address to C.
+	 */
+	movq	$__PAGE_OFFSET_BASE, %rdi
+	addq	%rsi, %rdi

The updated comments and other details are fine, but I'm not sure about the __va()
change: the patch essentially open codes __va() in assembly - which would make any changes to __va() [for whatever reason] more difficult, right?

Right now we don't seem to have a single such line of assembly, so changes to __va() can be done in C alone.

Thanks,

Ingo

author maintainer
#3 lore raw

Re: [PATCH 2/2] x86/head_64.S: Pass struct boot_params' virtual address to C

Quoted 6 lines · Ingo Molnar

The updated comments and other details are fine, but I'm not sure about the __va()
change: the patch essentially open codes __va() in assembly - which would make any changes to __va() [for whatever reason] more difficult, right?

Right now we don't seem to have a single such line of assembly, so changes to __va() can be done in C alone.

Ok, that's a fair point.

Signature · 4 lines
Regards/Gruss,
    Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.
#4 lore raw
In reply to Borislav Petkov
Quoted 45 lines · Borislav Petkov

From: Borislav Petkov <[email protected]>

It doesn't really start a CPU but does a far jump to C code. So call it that. Eliminate the unconditional JMP to it from secondary_startup_64() but make the jump to C code piece part of secondary_startup_64() instead.

Also, it doesn't need to be a global symbol either so make it a local label. One less needlessly global symbol in the symbol table.

No functionality change.

---
 arch/x86/kernel/head_64.S | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
arch/x86/kernel/head_64.S +2 -4
index b467b14b03eb..ac9d327d2e42 100644
@@ -269,10 +269,8 @@ ENTRY(secondary_startup_64)
 	/* rsi is pointer to real mode structure with interesting info.
 	   pass it to C */
 	movq	%rsi, %rdi
-	jmp	start_cpu
-ENDPROC(secondary_startup_64)
 
-ENTRY(start_cpu)
+.Ljump_to_C_code:
 	/*
 	 * Jump to run C code and to be on a real kernel address.
 	 * Since we are running on identity-mapped space we have to jump
@@ -305,7 +303,7 @@ ENTRY(start_cpu)
 	pushq	%rax		# target address in negative space
 	lretq
 .Lafter_lret:
-ENDPROC(start_cpu)
+ENDPROC(secondary_startup_64)
 
 #include "verify_cpu.S"
 
@@ -313,11 +311,11 @@ ENDPROC(start_cpu)
 /*
  * Boot CPU0 entry point. It's called from play_dead(). Everything has been set

arch/x86/kernel/head_64.S ENDPROC(start_cpu) · line 320

Quoted 10 lines
arch/x86/kernel/head_64.S +2 -2
  * up already except stack. We just set up stack here. Then call
- * start_secondary() via start_cpu().
+ * start_secondary() via .Ljump_to_C_code.
  */
 ENTRY(start_cpu0)
 	movq	initial_stack(%rip), %rsp
-	jmp	start_cpu
+	jmp	.Ljump_to_C_code
 ENDPROC(start_cpu0)
 #endif

Wouldn't this be slightly more readable:

	jmp	.L_jump_to_C_code

? (Note the extra underscore in the symbol name)

The local labels syntax is silly, I always end up looking twice to make sense of 'Ljump' or 'Lwhatever' ;-)

We cannot do anything about that - but we can name our symbols to work it around. But the price is the extra underscore in the symbol name...

Thanks,

Ingo

author maintainer
#5 lore raw
Quoted 5 lines · Ingo Molnar

The local labels syntax is silly, I always end up looking twice to make sense of 'Ljump' or 'Lwhatever' ;-)

We cannot do anything about that - but we can name our symbols to work it around. But the price is the extra underscore in the symbol name...

Sure, but other labels in this file don't have the preceding "_".

Perhaps we should agree on a convention for the local labels naming in our asm and adhere to it...

Hmm.

Signature · 4 lines
Regards/Gruss,
    Boris.

Good mailing practices for 400: avoid top-posting and trim the reply.
#6 lore raw
Quoted 8 lines · Borislav Petkov
Quoted 5 lines · Ingo Molnar

The local labels syntax is silly, I always end up looking twice to make sense of 'Ljump' or 'Lwhatever' ;-)

We cannot do anything about that - but we can name our symbols to work it around. But the price is the extra underscore in the symbol name...

Sure, but other labels in this file don't have the preceding "_".

Yeah, and that would make it all inconsistent - fair enough.

Ok, I'll apply your patch as-is.

Quoted 2 lines

Perhaps we should agree on a convention for the local labels naming in our asm and adhere to it...

Too much churn I suspect, plus we'd generate extra churn when people inevitably get it wrong.

Thanks,

Ingo

#7 lore raw

[tip:x86/boot] x86/boot/64: Rename start_cpu()

In reply to Borislav Petkov
x86/boot/64: Rename start_cpu()
Commit-ID:  79d243a042155b4421a06faaac15d775a133e6c8
Gitweb:     http://git.kernel.org/tip/79d243a042155b4421a06faaac15d775a133e6c8
Author:     Borislav Petkov <[email protected]>
AuthorDate: Sat, 4 Mar 2017 10:56:10 +0100
Committer:  Ingo Molnar <[email protected]>
CommitDate: Tue, 7 Mar 2017 13:57:25 +0100

x86/boot/64: Rename start_cpu()

It doesn't really start a CPU but does a far jump to C code. So call it that. Eliminate the unconditional JMP to it from secondary_startup_64() but make the jump to C code piece part of secondary_startup_64() instead.

Also, it doesn't need to be a global symbol either so make it a local label. One less needlessly global symbol in the symbol table.

No functionality change.

---
 arch/x86/kernel/head_64.S | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
arch/x86/kernel/head_64.S +4 -6
index b467b14..ac9d327 100644
@@ -269,10 +269,8 @@ ENTRY(secondary_startup_64)
 	/* rsi is pointer to real mode structure with interesting info.
 	   pass it to C */
 	movq	%rsi, %rdi
-	jmp	start_cpu
-ENDPROC(secondary_startup_64)
 
-ENTRY(start_cpu)
+.Ljump_to_C_code:
 	/*
 	 * Jump to run C code and to be on a real kernel address.
 	 * Since we are running on identity-mapped space we have to jump
@@ -305,7 +303,7 @@ ENTRY(start_cpu)
 	pushq	%rax		# target address in negative space
 	lretq
 .Lafter_lret:
-ENDPROC(start_cpu)
+ENDPROC(secondary_startup_64)
 
 #include "verify_cpu.S"
 
@@ -313,11 +311,11 @@ ENDPROC(start_cpu)
 /*
  * Boot CPU0 entry point. It's called from play_dead(). Everything has been set
  * up already except stack. We just set up stack here. Then call
- * start_secondary() via start_cpu().
+ * start_secondary() via .Ljump_to_C_code.
  */
 ENTRY(start_cpu0)
 	movq	initial_stack(%rip), %rsp
-	jmp	start_cpu
+	jmp	.Ljump_to_C_code
 ENDPROC(start_cpu0)
 #endif