xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* define BOOT_TRAMPOLINE and stack based on result of probing EBDA area by INT12
@ 2011-08-31  8:47 Lin-bao Zhang
  2011-08-31  8:55 ` Keir Fraser
  2011-08-31  9:52 ` Lin-bao Zhang
  0 siblings, 2 replies; 7+ messages in thread
From: Lin-bao Zhang @ 2011-08-31  8:47 UTC (permalink / raw)
  To: keir.xen@gmail.com, xen-devel@lists.xensource.com

Hi Keir , 

we have discussed how to avoid to overlap with EBDA area in subject "xen-kernel and EDD".
at last, in RHEL5.7s ,we define BOOT_TRAMPOLINE 0x7c000 ,and 
-        mov     $0x98000,%esp
+        mov     $(BOOT_TRAMPOLINE + 0x4000),%esp
but some days passed, I finally feel that this modification is somewhat the best choice for avoid EBDA overwritten. 
For EBDA , I have been always discussing with our BIOS colleagues,BIOS guys' suggestion is like this:
To guarantee to never run into this problem again, the e820 memory map must be
parsed to find a valid memory range before using it.  Not the easiest
thing to do in assembly code without a stack, which is why the early loader
folks took the easy route and hardcoded the stack.  On most platforms that
works, but to guarantee it works on all, the e820 map must be parsed, and
reserved areas must not be corrupted by the OS.in fact, our xen-hypervisor has parsed e820 map successfully, but why we don't make use of e820 map result to judge EBDA bottom ? 
from BIOS-provided physical RAM map: BIOS-e820: 0000000000010000 - 0000000000090400 (usable) BIOS-e820: 0000000000090400 - 0000000000a0000 (reserved)We have known that EBDA area is 90400 ~ 0xa0000 . when programming, EBDA area is certainly different on different BIOS .we can determine the size of the EBDA by using BIOS function INT 12h, or (often) by examining the word at 0x40E in the BDA .Both of those methods will tell you the location of the bottom of the EBDA. http://wiki.osdev.org/Memory_Map_(x86)#.22Low.22_memory_.28.3C_1_MiB.29  

1,define a variable named "EBDA_bottom". 
2, get EBDA_bottom by above method.
3, stack should equals EBDA_bottom (or EBDA_bottom -1 safely)
4, mov     $(EBDA_bottom -1),%esp
in most case , EBDA area is 1K,but we define 0x7c000(this is absolutely safe),but we will waste too much memory space.

I did test, it can work .Certainly, I am familiar with assembler code, I just hard code to test:mov     0x903ff , %esp thanks for your corrections , I have not read over all histories and stories about them, if I am wrong , I am sorry first.

thanks very much!


-Bob


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-08-31 20:14 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-31  8:47 define BOOT_TRAMPOLINE and stack based on result of probing EBDA area by INT12 Lin-bao Zhang
2011-08-31  8:55 ` Keir Fraser
2011-08-31 16:09   ` djmagee
2011-08-31 19:25   ` Alan Cox
2011-08-31 19:57     ` Keir Fraser
2011-08-31 20:14       ` Keir Fraser
2011-08-31  9:52 ` Lin-bao Zhang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).