Date: Wed, 7 Feb 2007 15:24:23 +0900
From: Horms <horms@verge.net.au>
To: linux-ia64@vger.kernel.org
Cc: Jack Steiner <steiner@sgi.com>, Tony Luck <tony.luck@intel.com>,
	Magnus Damm <magnus.damm@gmail.com>
Subject: Re: [PATCH 2/2] [IA64] Add phys_efi command line option
Message-ID: <20070207062420.GB29959@verge.net.au>
References: <20070207061904.GA29959@verge.net.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20070207061904.GA29959@verge.net.au>
User-Agent: mutt-ng/devel-r804 (Debian)

*** Updated for a8d91b8477aa433ee0131b031d782411976e1726 ***

Hi,

I am resending this patch, which builds on the patch sent earlier
in this thread to allow physical mode SAL/EFI to work.

-- 
Simon Horman (Horms)
  horms@verge.net.au
  http://verge.net.au/~horms/

[IA64] Add phys_efi command line option

This patch adds a command line option, phys_efi, which forces
EFI calls to stay in physical mode. This is mainly for the purpose
of being able to test the physical mode code path.

I believe that it may also be needed in order to kexec between
OS/hypervisors with different memory layouts, such as Linux->Xen and vice
versa, which have 0xe000... and 0xf000... as their page offset respecively.
However, I am still working on verifying this.

Signed-Off-By: Simon Horman <horms@verge.net.au>
 

 Documentation/kernel-parameters.txt |    4 ++++
 arch/ia64/kernel/efi.c              |    9 ++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

Index: linux-2.6/arch/ia64/kernel/efi.c
===================================================================
--- linux-2.6.orig/arch/ia64/kernel/efi.c	2007-02-14 14:39:38.000000000 +0900
+++ linux-2.6/arch/ia64/kernel/efi.c	2007-02-14 14:41:43.000000000 +0900
@@ -413,6 +413,7 @@
 	efi_config_table_t *config_tables;
 	efi_char16_t *c16;
 	u64 efi_desc_size;
+	int phys_efi = 0;
 	char *cp, vendor[100] = "unknown";
 	int phys_efi = 0;
 	int i;
@@ -425,6 +426,9 @@
 			max_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
 		} else if (memcmp(cp, "min_addr=", 9) == 0) {
 			min_addr = GRANULEROUNDDOWN(memparse(cp + 9, &cp));
+		} else if (memcmp(cp, "phys_efi", 8) == 0) {
+			phys_efi = 1;
+			cp+=8;
 		} else {
 			while (*cp != ' ' && *cp)
 				++cp;
@@ -529,7 +533,10 @@
 #endif
 
 	efi_map_pal_code();
-	efi_enter_virtual_mode();
+	if (phys_efi)
+		printk("Forcing EFI to stay in physical mode\n");
+	else
+		efi_enter_virtual_mode();
 }
 
 void
Index: linux-2.6/Documentation/kernel-parameters.txt
===================================================================
--- linux-2.6.orig/Documentation/kernel-parameters.txt	2007-02-14 10:58:20.000000000 +0900
+++ linux-2.6/Documentation/kernel-parameters.txt	2007-02-14 14:41:43.000000000 +0900
@@ -1276,6 +1276,10 @@
 	pg.		[PARIDE]
 			See Documentation/paride.txt.
 
+	phys_efi	[IA-64] Force EFI, PAL and SAL calls to be made
+			in physical mode. Otherwise, if possible virtual mode
+			calls are made.
+
 	pirq=		[SMP,APIC] Manual mp-table setup
 			See Documentation/i386/IO-APIC.txt.
 
