b95a1c4f77
(cherry picked from commit 23730413fef4be7fe365f452fcaef16c5f4e4b1b) Signed-off-by: Domen Kožar <domen@dev.si>
47 lines
1.7 KiB
Diff
47 lines
1.7 KiB
Diff
From cdd77e87eae52b7251acc5990207a1c4500a84ce Mon Sep 17 00:00:00 2001
|
|
From: Andi Kleen <ak@linux.intel.com>
|
|
Date: Tue, 5 Nov 2013 21:22:28 +1030
|
|
Subject: x86, asmlinkage, lguest: Pass in globals into assembler statement
|
|
|
|
Tell the compiler that the inline assembler statement
|
|
references lguest_entry.
|
|
|
|
This fixes compile problems with LTO where the variable
|
|
and the assembler code may end up in different files.
|
|
|
|
Cc: x86@kernel.org
|
|
Cc: rusty@rustcorp.com.au
|
|
Signed-off-by: Andi Kleen <ak@linux.intel.com>
|
|
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
|
|
---
|
|
drivers/lguest/x86/core.c | 6 ++++--
|
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/lguest/x86/core.c b/drivers/lguest/x86/core.c
|
|
index 5169239..922a1ac 100644
|
|
--- a/drivers/lguest/x86/core.c
|
|
+++ b/drivers/lguest/x86/core.c
|
|
@@ -157,7 +157,7 @@ static void run_guest_once(struct lg_cpu *cpu, struct lguest_pages *pages)
|
|
* stack, then the address of this call. This stack layout happens to
|
|
* exactly match the stack layout created by an interrupt...
|
|
*/
|
|
- asm volatile("pushf; lcall *lguest_entry"
|
|
+ asm volatile("pushf; lcall *%4"
|
|
/*
|
|
* This is how we tell GCC that %eax ("a") and %ebx ("b")
|
|
* are changed by this routine. The "=" means output.
|
|
@@ -169,7 +169,9 @@ static void run_guest_once(struct lg_cpu *cpu, struct lguest_pages *pages)
|
|
* physical address of the Guest's top-level page
|
|
* directory.
|
|
*/
|
|
- : "0"(pages), "1"(__pa(cpu->lg->pgdirs[cpu->cpu_pgd].pgdir))
|
|
+ : "0"(pages),
|
|
+ "1"(__pa(cpu->lg->pgdirs[cpu->cpu_pgd].pgdir)),
|
|
+ "m"(lguest_entry)
|
|
/*
|
|
* We tell gcc that all these registers could change,
|
|
* which means we don't have to save and restore them in
|
|
--
|
|
cgit v0.12
|
|
|