merge mainline into intwrap
This commit is contained in:
commit
069c9c5fda
137 changed files with 8057 additions and 3591 deletions
|
@ -40,9 +40,6 @@
|
|||
extern char _start[];
|
||||
extern char _end[];
|
||||
|
||||
grub_addr_t grub_os_area_addr;
|
||||
grub_size_t grub_os_area_size;
|
||||
|
||||
grub_uint32_t
|
||||
grub_get_rtc (void)
|
||||
{
|
||||
|
@ -93,20 +90,7 @@ grub_machine_init (void)
|
|||
}
|
||||
}
|
||||
|
||||
if (addr == GRUB_MEMORY_MACHINE_UPPER_START
|
||||
|| (addr >= GRUB_MEMORY_MACHINE_LOWER_SIZE
|
||||
&& addr <= GRUB_MEMORY_MACHINE_UPPER_START
|
||||
&& (addr + size > GRUB_MEMORY_MACHINE_UPPER_START)))
|
||||
{
|
||||
grub_size_t quarter = size >> 2;
|
||||
|
||||
grub_os_area_addr = addr;
|
||||
grub_os_area_size = size - quarter;
|
||||
grub_mm_init_region ((void *) (grub_os_area_addr + grub_os_area_size),
|
||||
quarter);
|
||||
}
|
||||
else
|
||||
grub_mm_init_region ((void *) (grub_addr_t) addr, (grub_size_t) size);
|
||||
grub_mm_init_region ((void *) (grub_addr_t) addr, (grub_size_t) size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -85,7 +85,3 @@ codestart:
|
|||
*/
|
||||
#include "../realmode.S"
|
||||
|
||||
/*
|
||||
* Routines needed by Linux and Multiboot loaders.
|
||||
*/
|
||||
#include "../loader.S"
|
||||
|
|
|
@ -63,7 +63,3 @@ codestart:
|
|||
*/
|
||||
#include "../realmode.S"
|
||||
|
||||
/*
|
||||
* Routines needed by Linux and Multiboot loaders.
|
||||
*/
|
||||
#include "../loader.S"
|
||||
|
|
|
@ -1,124 +0,0 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007,2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* GRUB is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GRUB is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Note: These functions defined in this file may be called from C.
|
||||
* Be careful of that you must not modify some registers. Quote
|
||||
* from gcc-2.95.2/gcc/config/i386/i386.h:
|
||||
|
||||
1 for registers not available across function calls.
|
||||
These must include the FIXED_REGISTERS and also any
|
||||
registers that can be used without being saved.
|
||||
The latter must include the registers where values are returned
|
||||
and the register where structure-value addresses are passed.
|
||||
Aside from that, you can include as many other registers as you like.
|
||||
|
||||
ax,dx,cx,bx,si,di,bp,sp,st,st1,st2,st3,st4,st5,st6,st7,arg
|
||||
{ 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
|
||||
*/
|
||||
|
||||
/*
|
||||
* Note: GRUB is compiled with the options -mrtd and -mregparm=3.
|
||||
* So the first three arguments are passed in %eax, %edx, and %ecx,
|
||||
* respectively, and if a function has a fixed number of arguments
|
||||
* and the number if greater than three, the function must return
|
||||
* with "ret $N" where N is ((the number of arguments) - 3) * 4.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is the area for all of the special variables.
|
||||
*/
|
||||
|
||||
#include <grub/i386/floppy.h>
|
||||
|
||||
.p2align 2 /* force 4-byte alignment */
|
||||
|
||||
/*
|
||||
* void grub_linux_boot_zimage (void)
|
||||
*/
|
||||
VARIABLE(grub_linux_prot_size)
|
||||
.long 0
|
||||
VARIABLE(grub_linux_tmp_addr)
|
||||
.long 0
|
||||
VARIABLE(grub_linux_real_addr)
|
||||
.long 0
|
||||
VARIABLE(grub_linux_is_bzimage)
|
||||
.long 0
|
||||
|
||||
FUNCTION(grub_linux16_real_boot)
|
||||
/* Must be done before zImage copy. */
|
||||
call EXT_C(grub_dl_unload_all)
|
||||
|
||||
movl EXT_C(grub_linux_is_bzimage), %ebx
|
||||
test %ebx, %ebx
|
||||
jne bzimage
|
||||
|
||||
/* copy the kernel */
|
||||
movl EXT_C(grub_linux_prot_size), %ecx
|
||||
addl $3, %ecx
|
||||
shrl $2, %ecx
|
||||
movl $GRUB_LINUX_BZIMAGE_ADDR, %esi
|
||||
movl $GRUB_LINUX_ZIMAGE_ADDR, %edi
|
||||
cld
|
||||
rep
|
||||
movsl
|
||||
|
||||
bzimage:
|
||||
movl EXT_C(grub_linux_real_addr), %ebx
|
||||
|
||||
/* copy the real mode code */
|
||||
movl EXT_C(grub_linux_tmp_addr), %esi
|
||||
movl %ebx, %edi
|
||||
movl $GRUB_LINUX_SETUP_MOVE_SIZE, %ecx
|
||||
cld
|
||||
rep
|
||||
movsb
|
||||
|
||||
/* change %ebx to the segment address */
|
||||
shrl $4, %ebx
|
||||
movl %ebx, %eax
|
||||
addl $0x20, %eax
|
||||
movw %ax, linux_setup_seg
|
||||
|
||||
/* XXX new stack pointer in safe area for calling functions */
|
||||
movl $0x4000, %esp
|
||||
movw $GRUB_FLOPPY_REG_DIGITAL_OUTPUT, %dx
|
||||
xorb %al, %al
|
||||
outb %al, %dx
|
||||
|
||||
/* final setup for linux boot */
|
||||
call prot_to_real
|
||||
.code16
|
||||
|
||||
cli
|
||||
movw %bx, %ss
|
||||
movw $GRUB_LINUX_SETUP_STACK, %sp
|
||||
|
||||
movw %bx, %ds
|
||||
movw %bx, %es
|
||||
movw %bx, %fs
|
||||
movw %bx, %gs
|
||||
|
||||
/* ljmp */
|
||||
.byte 0xea
|
||||
.word 0
|
||||
linux_setup_seg:
|
||||
.word 0
|
||||
.code32
|
||||
|
|
@ -45,9 +45,6 @@ struct mem_region
|
|||
static struct mem_region mem_regions[MAX_REGIONS];
|
||||
static int num_regions;
|
||||
|
||||
grub_addr_t grub_os_area_addr;
|
||||
grub_size_t grub_os_area_size;
|
||||
|
||||
static char *
|
||||
make_install_device (void)
|
||||
{
|
||||
|
@ -220,25 +217,9 @@ grub_machine_init (void)
|
|||
|
||||
compact_mem_regions ();
|
||||
|
||||
/* Add the memory regions to free memory, except for the region starting
|
||||
from 1MB. This region is partially used for loading OS images.
|
||||
For now, 1/4 of this is added to free memory. */
|
||||
for (i = 0; i < num_regions; i++)
|
||||
if (mem_regions[i].addr == 0x100000)
|
||||
{
|
||||
grub_size_t quarter = mem_regions[i].size >> 2;
|
||||
|
||||
grub_os_area_addr = mem_regions[i].addr;
|
||||
grub_os_area_size = mem_regions[i].size - quarter;
|
||||
grub_mm_init_region ((void *) (grub_os_area_addr + grub_os_area_size),
|
||||
quarter);
|
||||
}
|
||||
else
|
||||
grub_mm_init_region ((void *) mem_regions[i].addr, mem_regions[i].size);
|
||||
|
||||
if (! grub_os_area_addr)
|
||||
grub_fatal ("no upper memory");
|
||||
|
||||
grub_tsc_init ();
|
||||
}
|
||||
|
||||
|
|
|
@ -474,8 +474,6 @@ FUNCTION(grub_chainloader_real_boot)
|
|||
pushl %edx
|
||||
pushl %eax
|
||||
|
||||
call EXT_C(grub_dl_unload_all)
|
||||
|
||||
/* Turn off Gate A20 */
|
||||
xorl %eax, %eax
|
||||
call EXT_C(grub_gate_a20)
|
||||
|
@ -491,8 +489,6 @@ FUNCTION(grub_chainloader_real_boot)
|
|||
ljmp $0, $GRUB_MEMORY_MACHINE_BOOT_LOADER_ADDR
|
||||
.code32
|
||||
|
||||
#include "../loader.S"
|
||||
|
||||
/*
|
||||
* void grub_console_putchar (int c)
|
||||
*
|
||||
|
|
|
@ -67,6 +67,11 @@ grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uin
|
|||
GRUB_MACHINE_MEMORY_AVAILABLE))
|
||||
return 1;
|
||||
|
||||
if (hook ((grub_addr_t) _end,
|
||||
0xa0000 - (grub_addr_t) _end,
|
||||
GRUB_MACHINE_MEMORY_AVAILABLE))
|
||||
return 1;
|
||||
|
||||
if (hook (GRUB_MEMORY_MACHINE_UPPER,
|
||||
0x100000 - GRUB_MEMORY_MACHINE_UPPER,
|
||||
GRUB_MACHINE_MEMORY_RESERVED))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue