All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexander van Heukelum <heukelum@mailshack.com>
To: Ingo Molnar <mingo@elte.hu>, Ian Campbell <ijc@hellion.org.uk>
Cc: Alexander van Heukelum <heukelum@fastmail.fm>,
	"H. Peter Anvin" <hpa@zytor.com>, Andi Kleen <ak@suse.de>,
	Thomas Gleixner <tglx@linutronix.de>,
	Jeremy Fitzhardinge <jeremy@goop.org>,
	Mark McLoughlin <markmc@redhat.com>,
	LKML <linux-kernel@vger.kernel.org>
Subject: [RFC] use realmode code to reserve end-of-conventional-memory to 1MB
Date: Thu, 28 Feb 2008 14:28:23 +0100	[thread overview]
Message-ID: <20080228132822.GA25278@mailshack.com> (raw)
In-Reply-To: <20080228131341.GA25213@mailshack.com>

Instead of using early reservations inside the kernel code,
we could use the realmode code to modify the e820 memmap.
This patch shows what that would look like. I have not looked
at the case where the BIOS does not provide an e820 memmap
yet. Probably a full solution would need to create a fake
e820 memmap in that case.

Comments?

Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm>

diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c
index e77d89f..522920a 100644
--- a/arch/x86/boot/memory.c
+++ b/arch/x86/boot/memory.c
@@ -23,6 +23,7 @@ static int detect_memory_e820(void)
 	int count = 0;
 	u32 next = 0;
 	u32 size, id;
+	u32 lowmem, ebda_addr;
 	u8 err;
 	struct e820entry *desc = boot_params.e820_map;
 
@@ -50,13 +51,51 @@ static int detect_memory_e820(void)
 		   just return failure. */
 		if (id != SMAP) {
 			count = 0;
-			break;
+			goto out;
 		}
 
 		count++;
 		desc++;
-	} while (next && count < E820MAX);
-
+	} while (next && count < (E820MAX - 1));
+
+	/* Some BIOSes do not reserve the EBDA/XBDA area correctly in.
+	   The e820-map. Find out where the EBDA resides by looking at
+	   the BIOS data area and reserve the EBDA and the following
+	   legacy adapter area explicitly. */
+#define BIOS_EBDA_SEGMENT 0x40E
+#define BIOS_LOWMEM_KILOBYTES 0x413
+
+	/* end of low (conventional) memory */
+	set_fs(0);
+	lowmem = rdfs16(BIOS_LOWMEM_KILOBYTES);
+	lowmem <<= 10;
+
+	/* start of EBDA area */
+	ebda_addr = rdfs16(BIOS_EBDA_SEGMENT);
+	ebda_addr <<= 4;
+
+	/* Fixup: bios puts an EBDA in the top 64K segment */
+	/* of conventional memory, but does not adjust lowmem. */
+	if ((lowmem - ebda_addr) <= 0x10000)
+		lowmem = ebda_addr;
+
+	/* Fixup: bios does not report an EBDA at all. */
+	/* Some old Dells seem to need 4k anyhow (bugzilla 2990) */
+	if ((ebda_addr == 0) && (lowmem >= 0x9f000))
+		lowmem = 0x9f000;
+
+	/* Paranoia: should never happen, but... */
+	if (lowmem >= 0x100000)
+		lowmem = 0xa0000;
+
+	/* reserve all memory between lowmem and the 1MB mark */
+	desc->addr = lowmem;
+	desc->size = 0x100000 - lowmem;
+	desc->type = E820_RESERVED;
+	count++;
+	desc++;
+
+out:
 	return boot_params.e820_entries = count;
 }
 


  reply	other threads:[~2008-02-28 13:32 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-24 17:46 [PATCH] Fix alignment of early reservation for EBDA Alexander van Heukelum
2008-02-24 19:27 ` Andi Kleen
2008-02-24 19:41 ` Ingo Molnar
2008-02-24 20:53   ` Alexander van Heukelum
2008-02-25  2:18 ` H. Peter Anvin
2008-02-25 16:54   ` Alexander van Heukelum
2008-02-25 17:01     ` Ingo Molnar
2008-02-25 18:07       ` [PATCH] reserve_early end-of-conventional-memory to 1MB Alexander van Heukelum
2008-02-25 18:13         ` H. Peter Anvin
2008-02-25 19:46           ` Alexander van Heukelum
2008-02-25 21:17             ` H. Peter Anvin
2008-02-26  9:30             ` Ingo Molnar
2008-02-27 14:26               ` Andi Kleen
2008-02-27 14:38               ` [PATCH] reserve_early end-of-conventional-memory to 1MB II - some numbers to put it into perspective Andi Kleen
2008-02-27 16:44                 ` H. Peter Anvin
2008-02-27 20:01                 ` Alexander van Heukelum
2008-02-28 13:13         ` [PATCH] reserve end-of-conventional-memory to 1MB on 32-bit Alexander van Heukelum
2008-02-28 13:28           ` Alexander van Heukelum [this message]
2008-02-28 21:12             ` [RFC] use realmode code to reserve end-of-conventional-memory to 1MB Ian Campbell
2008-02-28 21:14               ` H. Peter Anvin
2008-02-28 23:16                 ` Ian Campbell
2008-02-29 20:00                   ` Ingo Molnar
2008-03-04 11:41                   ` Mark McLoughlin
2008-03-04 14:33                     ` Ingo Molnar
2008-03-04 15:12                       ` Ian Campbell
2008-03-04 15:13                       ` Jeremy Fitzhardinge
2008-03-04 15:25                         ` Ingo Molnar
2008-03-04 16:02                           ` Jeremy Fitzhardinge
2008-03-04 16:15                             ` Ingo Molnar
2008-03-04 16:15                       ` Mark McLoughlin
2008-03-04 16:23                         ` Ingo Molnar
2008-03-04 17:44                   ` Jeremy Fitzhardinge
2008-03-05 15:59                   ` Eduardo Habkost
2008-03-05 16:08                     ` H. Peter Anvin
2008-03-05 16:53                       ` Eduardo Habkost
2008-03-05 17:28                         ` H. Peter Anvin
2008-03-05 17:28                           ` Jeremy Fitzhardinge
2008-03-05 17:38                             ` H. Peter Anvin
2008-03-05 16:38                     ` Jeremy Fitzhardinge
2008-03-05 17:27                       ` H. Peter Anvin
2008-02-28 21:09           ` [PATCH] reserve end-of-conventional-memory to 1MB on 32-bit Ian Campbell
2008-02-29 11:49             ` Alexander van Heukelum
2008-02-29 17:14               ` Mark McLoughlin
2008-02-29 18:38                 ` Alexander van Heukelum
2008-02-29 18:44                   ` H. Peter Anvin
2008-02-29 18:56                     ` Alexander van Heukelum
2008-02-29 22:06                   ` Mark McLoughlin
2008-02-29 22:26                     ` Alexander van Heukelum
2008-03-01 16:09                     ` [PATCH] reserve end-of-conventional-memory to 1MB on 32-bit v2 Alexander van Heukelum
2008-03-01 16:12                       ` [PATCH] reserve end-of-conventional-memory to 1MB on 64-bit add-on Alexander van Heukelum
2008-03-04 11:44                       ` [PATCH] reserve end-of-conventional-memory to 1MB on 32-bit v2 Mark McLoughlin
2008-03-04 13:31                         ` Alexander van Heukelum
2008-03-04 14:49                         ` Ingo Molnar
2008-03-04 15:16                           ` Mark McLoughlin
2008-03-04 15:24                             ` Ingo Molnar
2008-03-04 15:18                         ` Jeremy Fitzhardinge
2008-03-04 16:51                           ` Alexander van Heukelum
2008-03-04 17:05                             ` H. Peter Anvin
2008-03-04 17:11                             ` Jeremy Fitzhardinge
2008-03-04 18:57                               ` [PATCH] reserve end-of-conventional-memory to 1MB, 32-bit, use paravirt_enabled Alexander van Heukelum
2008-03-04 19:12                                 ` [PATCH] reserve end-of-conventional-memory to 1MB, 64-bit, " Alexander van Heukelum
2008-02-27 14:25     ` [PATCH] Fix alignment of early reservation for EBDA Andi Kleen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080228132822.GA25278@mailshack.com \
    --to=heukelum@mailshack.com \
    --cc=ak@suse.de \
    --cc=heukelum@fastmail.fm \
    --cc=hpa@zytor.com \
    --cc=ijc@hellion.org.uk \
    --cc=jeremy@goop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=markmc@redhat.com \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.