1
0
Fork 0

x86: Remove unused real mode code

This code is pretty old and we want to support only 32-bit systems now.

Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: Graeme Russ <graeme.russ@gmail.com>
utp
Simon Glass 2013-02-14 17:38:30 +00:00
parent 588a13f742
commit 96dfc0633a
12 changed files with 0 additions and 1799 deletions

5
README
View File

@ -3820,11 +3820,6 @@ Low Level (hardware related) configuration options:
If defined, the x86 reset vector code is included. This is not
needed when U-Boot is running from Coreboot.
- CONFIG_X86_NO_REAL_MODE
If defined, x86 real mode code is omitted. This assumes a
32-bit environment where such code is not needed. You will
need to do this when U-Boot is running from Coreboot.
Freescale QE/FMAN Firmware Support:
-----------------------------------

View File

@ -1,36 +0,0 @@
/*
* (C) Copyright 2002
* Daniel Engström, Omicron Ceti AB, daniel@omicron.se
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program 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 2 of
* the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#ifndef __ASM_REALMODE_H_
#define __ASM_REALMODE_H_
#include <asm/ptrace.h>
extern ulong __realmode_start;
extern ulong __realmode_size;
extern char realmode_enter;
int bios_setup(void);
int enter_realmode(u16 seg, u16 off, struct pt_regs *in, struct pt_regs *out);
int enter_realmode_int(u8 lvl, struct pt_regs *in, struct pt_regs *out);
#endif

View File

@ -25,16 +25,6 @@ include $(TOPDIR)/config.mk
LIB = $(obj)lib$(ARCH).o
ifeq ($(CONFIG_X86_NO_REAL_MODE),)
SOBJS-$(CONFIG_SYS_PC_BIOS) += bios.o
SOBJS-$(CONFIG_SYS_PCI_BIOS) += bios_pci.o
COBJS-y += realmode.o
SOBJS-y += realmode_switch.o
COBJS-$(CONFIG_SYS_PC_BIOS) += bios_setup.o
COBJS-$(CONFIG_VIDEO_VGA) += video_bios.o
endif
COBJS-y += board.o
COBJS-y += bootm.o
COBJS-y += cmd_boot.o

View File

@ -1,569 +0,0 @@
/*
* (C) Copyright 2002
* Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program 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 2 of
* the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* Based on msbios.c from rolo 1.6:
*----------------------------------------------------------------------
* (C) Copyright 2000
* Sysgo Real-Time Solutions GmbH
* Klein-Winternheim, Germany
*----------------------------------------------------------------------
*/
#include "bios.h"
/*
* During it's initialization phase, before switching to protected
* mode, the Linux Kernel makes a few BIOS calls. This won't work
* if the board does not have a BIOS.
*
* This is a very minimalisic BIOS that supplies just enough
* functionality to keep the Linux Kernel happy. It is NOT
* a general purpose replacement for a real BIOS !!
*/
.section .bios, "ax"
.code16
.org 0
/* a call to f000:0 should warmboot */
jmp realmode_reset
.globl rm_int00
.hidden rm_int00
.type rm_int00, @function
rm_int00:
pushw $0
jmp any_interrupt16
.globl rm_int01
.hidden rm_int01
.type rm_int01, @function
rm_int01:
pushw $1
jmp any_interrupt16
.globl rm_int02
.hidden rm_int02
.type rm_int02, @function
rm_int02:
pushw $2
jmp any_interrupt16
.globl rm_int03
.hidden rm_int03
.type rm_int03, @function
rm_int03:
pushw $3
jmp any_interrupt16
.globl rm_int04
.hidden rm_int04
.type rm_int04, @function
rm_int04:
pushw $4
jmp any_interrupt16
.globl rm_int05
.hidden rm_int05
.type rm_int05, @function
rm_int05:
pushw $5
jmp any_interrupt16
.globl rm_int06
.hidden rm_int06
.type rm_int06, @function
rm_int06:
pushw $6
jmp any_interrupt16
.globl rm_int07
.hidden rm_int07
.type rm_int07, @function
rm_int07:
pushw $7
jmp any_interrupt16
.globl rm_int08
.hidden rm_int08
.type rm_int08, @function
rm_int08:
pushw $8
jmp any_interrupt16
.globl rm_int09
.hidden rm_int09
.type rm_int09, @function
rm_int09:
pushw $9
jmp any_interrupt16
.globl rm_int0a
.hidden rm_int0a
.type rm_int0a, @function
rm_int0a:
pushw $10
jmp any_interrupt16
.globl rm_int0b
.hidden rm_int0b
.type rm_int0b, @function
rm_int0b:
pushw $11
jmp any_interrupt16
.globl rm_int0c
.hidden rm_int0c
.type rm_int0c, @function
rm_int0c:
pushw $12
jmp any_interrupt16
.globl rm_int0d
.hidden rm_int0d
.type rm_int0d, @function
rm_int0d:
pushw $13
jmp any_interrupt16
.globl rm_int0e
.hidden rm_int0e
.type rm_int0e, @function
rm_int0e:
pushw $14
jmp any_interrupt16
.globl rm_int0f
.hidden rm_int0f
.type rm_int0f, @function
rm_int0f:
pushw $15
jmp any_interrupt16
.globl rm_int10
.hidden rm_int10
.type rm_int10, @function
rm_int10:
pushw $16
jmp any_interrupt16
.globl rm_int11
.hidden rm_int11
.type rm_int11, @function
rm_int11:
pushw $17
jmp any_interrupt16
.globl rm_int12
.hidden rm_int12
.type rm_int12, @function
rm_int12:
pushw $18
jmp any_interrupt16
.globl rm_int13
.hidden rm_int13
.type rm_int13, @function
rm_int13:
pushw $19
jmp any_interrupt16
.globl rm_int14
.hidden rm_int14
.type rm_int14, @function
rm_int14:
pushw $20
jmp any_interrupt16
.globl rm_int15
.hidden rm_int15
.type rm_int15, @function
rm_int15:
pushw $21
jmp any_interrupt16
.globl rm_int16
.hidden rm_int16
.type rm_int16, @function
rm_int16:
pushw $22
jmp any_interrupt16
.globl rm_int17
.hidden rm_int17
.type rm_int17, @function
rm_int17:
pushw $23
jmp any_interrupt16
.globl rm_int18
.hidden rm_int18
.type rm_int18, @function
rm_int18:
pushw $24
jmp any_interrupt16
.globl rm_int19
.hidden rm_int19
.type rm_int19, @function
rm_int19:
pushw $25
jmp any_interrupt16
.globl rm_int1a
.hidden rm_int1a
.type rm_int1a, @function
rm_int1a:
pushw $26
jmp any_interrupt16
.globl rm_int1b
.hidden rm_int1b
.type rm_int1b, @function
rm_int1b:
pushw $27
jmp any_interrupt16
.globl rm_int1c
.hidden rm_int1c
.type rm_int1c, @function
rm_int1c:
pushw $28
jmp any_interrupt16
.globl rm_int1d
.hidden rm_int1d
.type rm_int1d, @function
rm_int1d:
pushw $29
jmp any_interrupt16
.globl rm_int1e
.hidden rm_int1e
.type rm_int1e, @function
rm_int1e:
pushw $30
jmp any_interrupt16
.globl rm_int1f
.hidden rm_int1f
.type rm_int1f, @function
rm_int1f:
pushw $31
jmp any_interrupt16
.globl rm_def_int
.hidden rm_def_int
.type rm_def_int, @function
rm_def_int:
iret
/*
* All interrupt jumptable entries jump to here after pushing the
* interrupt vector number onto the stack.
*/
any_interrupt16:
MAKE_BIOS_STACK
gs movw OFFS_VECTOR(%bp), %ax
cmpw $0x10, %ax
je Lint_10h
cmpw $0x11, %ax
je Lint_11h
cmpw $0x12, %ax
je Lint_12h
cmpw $0x13, %ax
je Lint_13h
cmpw $0x15, %ax
je Lint_15h
cmpw $0x16, %ax
je Lint_16h
cmpw $0x1a, %ax
je Lint_1ah
movw $0xffff, %ax
jmp Lout
Lint_10h:
/* VGA BIOS services */
call bios_10h
jmp Lout
Lint_11h:
call bios_11h
jmp Lout
Lint_12h:
call bios_12h
jmp Lout
Lint_13h:
/* BIOS disk services */
call bios_13h
jmp Lout
Lint_15h:
/* Misc. BIOS services */
call bios_15h
jmp Lout
Lint_16h:
/* keyboard services */
call bios_16h
jmp Lout
Lint_1ah:
/* PCI bios */
call bios_1ah
jmp Lout
Lout:
cmpw $0, %ax
je Lhandeled
/*
* Insert code for unhandeled INTs here.
*
* ROLO prints a message to the console we could do that but then
* we're in 16bit mode so we'll have to get back into 32bit mode
* to use the console I/O routines (if we do this we should make
* int 0x10 and int 0x16 work as well)
*/
Lhandeled:
RESTORE_CALLERS_STACK
/* dump vector number */
addw $2,%sp
/* return from interrupt */
iret
/*
************************************************************
* BIOS interrupt 10h -- VGA services
************************************************************
*/
bios_10h:
gs movw OFFS_AX(%bp), %ax
shrw $8, %ax
cmpw $0x3, %ax
je Lcur_pos
cmpw $0xf, %ax
je Lvid_state
cmpw $0x12, %ax
je Lvid_cfg
movw $0xffff, %ax
ret
Lcur_pos:
/* Read Cursor Position and Size */
gs movw $0, OFFS_CX(%bp)
gs movw $0, OFFS_DX(%bp)
xorw %ax, %ax
ret
Lvid_state:
/* Get Video State - 80 columns, 80x25, 16 colors */
gs movw $(80 << 8|0x03), OFFS_AX(%bp)
gs movw $0, OFFS_BX(%bp)
xorw %ax, %ax
ret
Lvid_cfg:
/* Video Subsystem Configuration (EGA/VGA) - indicate CGA/MDA/HGA */
gs movw $0x10, OFFS_BX(%bp)
xorw %ax, %ax
ret
/*
************************************************************
* BIOS interrupt 11h -- Equipment determination
************************************************************
*/
bios_11h:
cs movw bios_equipment, %ax
gs movw %ax, OFFS_AX(%bp)
xorw %ax, %ax
ret
/*
************************************************************
* BIOS interrupt 12h -- Get Memory Size
************************************************************
*/
bios_12h:
cs movw ram_in_64kb_chunks, %ax
cmpw $0xa, %ax
ja b12_more_than_640k
shlw $6, %ax
jmp b12_return
b12_more_than_640k:
movw $0x280, %ax
b12_return:
/* return number of kilobytes in ax */
gs movw %ax, OFFS_AX(%bp)
gs movw OFFS_FLAGS(%bp), %ax
/* clear carry -- function succeeded */
andw $0xfffe, %ax
gs movw %ax, OFFS_FLAGS(%bp)
xorw %ax, %ax
ret
/*
************************************************************
* BIOS interrupt 13h -- Disk services
************************************************************
*/
bios_13h:
gs movw OFFS_AX(%bp), %ax
shrw $8, %ax
cmpw $0x15, %ax
je Lfunc_15h
movw $0xffff, %ax
ret
Lfunc_15h:
gs movw OFFS_AX(%bp), %ax
/* return AH=0->drive not present */
andw $0x00ff, %ax
gs movw %ax, OFFS_AX(%bp)
xorw %ax, %ax
ret
/*
***********************************************************
* BIOS interrupt 15h -- Miscellaneous services
***********************************************************
*/
bios_15h:
gs movw OFFS_AX(%bp), %ax
shrw $8, %ax
cmpw $0xc0, %ax
je Lfunc_c0h
cmpw $0xe8, %ax
je Lfunc_e8h
cmpw $0x88, %ax
je Lfunc_88h
movw $0xffff, %ax
ret
Lfunc_c0h:
/* Return System Configuration Parameters (PS2 only) */
gs movw OFFS_FLAGS(%bp), %ax
/* return carry -- function not supported */
orw $1, %ax
gs movw %ax, OFFS_FLAGS(%bp)
xorw %ax, %ax
ret
Lfunc_e8h:
gs movw OFFS_AX(%bp), %ax
andw $0xff, %ax
cmpw $1, %ax
je Lfunc_e801h
gs movw OFFS_FLAGS(%bp), %ax
/* return carry -- function not supported */
orw $1, %ax
gs movw %ax, OFFS_FLAGS(%bp)
xorw %ax, %ax
ret
Lfunc_e801h:
/* Get memory size for >64M Configurations */
cs movw ram_in_64kb_chunks, %ax
cmpw $0x100, %ax
ja e801_more_than_16mb
/* multiply by 64 */
shlw $6, %ax
/* 1st meg does not count */
subw $0x400, %ax
/* return memory size between 1M and 16M in 1kb chunks in AX and CX */
gs movw %ax, OFFS_AX(%bp)
gs movw %ax, OFFS_CX(%bp)
/* set BX and DX to 0*/
gs movw $0, OFFS_BX(%bp)
gs movw $0, OFFS_DX(%bp)
gs movw OFFS_FLAGS(%bp), %ax
/* clear carry -- function succeeded */
andw $0xfffe, %ax
gs movw %ax, OFFS_FLAGS(%bp)
xorw %ax, %ax
ret
e801_more_than_16mb:
/* subtract 16MB */
subw $0x100, %ax
/* return 0x3c00 (16MB-1MB) in AX and CX */
gs movw $0x3c00, OFFS_AX(%bp)
gs movw $0x3c00, OFFS_CX(%bp)
/* set BX and DX to number of 64kb chunks above 16MB */
gs movw %ax, OFFS_BX(%bp)
gs movw %ax, OFFS_DX(%bp)
gs movw OFFS_FLAGS(%bp), %ax
/* clear carry -- function succeeded */
andw $0xfffe, %ax
gs movw %ax, OFFS_FLAGS(%bp)
xorw %ax, %ax
ret
Lfunc_88h:
cs movw ram_in_64kb_chunks, %ax
cmpw $0x100, %ax
jna b88_not_more_than16
movw $0x100, %ax
b88_not_more_than16:
shlw $6, %ax
/* 1st meg does not count */
subw $0x400, %ax
/* return number of kilobytes between 16MB and 16MB in ax */
gs movw %ax, OFFS_AX(%bp)
gs movw OFFS_FLAGS(%bp), %ax
/* clear carry -- function succeeded */
andw $0xfffe, %ax
gs movw %ax, OFFS_FLAGS(%bp)
xorw %ax, %ax
ret
/*
************************************************************
* BIOS interrupt 16h -- keyboard services
************************************************************
*/
bios_16h:
gs movw OFFS_AX(%bp), %ax
shrw $8, %ax
cmpw $0x03, %ax
je Lfunc_03h
movw $0xffff, %ax
ret
Lfunc_03h:
/* do nothing -- function not supported */
xorw %ax, %ax
ret
/*
************************************************************
* BIOS interrupt 1ah -- PCI bios
************************************************************
*/
bios_1ah:
gs movw OFFS_AX(%bp), %ax
cmpb $0xb1, %ah
je Lfunc_b1h
movw $0xffff, %ax
ret
Lfunc_b1h:
call realmode_pci_bios
/* do nothing -- function not supported */
xorw %ax, %ax
ret
.globl ram_in_64kb_chunks
.hidden ram_in_64kb_chunks
.type ram_in_64kb_chunks, @function
ram_in_64kb_chunks:
.word 0
.globl bios_equipment
.hidden bios_equipment
.type bios_equipment, @function
bios_equipment:
.word 0

View File

@ -145,9 +145,6 @@ extern void *rm_int1e;
extern void *rm_int1f;
extern void *rm_def_int;
extern void *realmode_reset;
extern void *realmode_pci_bios_call_entry;
#define RELOC_16_LONG(seg, off) (*(u32 *)(seg << 4 | (u32)&off))
#define RELOC_16_WORD(seg, off) (*(u16 *)(seg << 4 | (u32)&off))
#define RELOC_16_BYTE(seg, off) (*(u8 *)(seg << 4 | (u32)&off))

View File

@ -1,447 +0,0 @@
/*
* (C) Copyright 2002
* Daniel Engström, Omicron Ceti AB, daniel@omicron.se
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program 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 2 of
* the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* x86 realmode assembly implementation of a PCI BIOS
* for platforms that use one PCI hose and configuration
* access type 1. (The common case for low-end PC's)
*/
#include "bios.h"
#define PCI_BIOS_DEBUG
.section .bios, "ax"
.code16
.globl realmode_pci_bios_call_entry
.hidden realmode_pci_bios_call_entry
.type realmode_pci_bios_call_entry, @function
realmode_pci_bios_call_entry:
MAKE_BIOS_STACK
call realmode_pci_bios
RESTORE_CALLERS_STACK
ret
.globl realmode_pci_bios
realmode_pci_bios:
gs movw OFFS_AX(%bp), %ax
cmpb $1, %al
je pci_bios_present
cmpb $2, %al
je pci_bios_find_device
cmpb $3, %al
je pci_bios_find_class
cmpb $6, %al
je pci_bios_generate_special_cycle
cmpb $8, %al
je pci_bios_read_cfg_byte
cmpb $9, %al
je pci_bios_read_cfg_word
cmpb $10, %al
je pci_bios_read_cfg_dword
cmpb $11, %al
je pci_bios_write_cfg_byte
cmpb $12, %al
je pci_bios_write_cfg_word
cmpb $13, %al
je pci_bios_write_cfg_dword
cmpb $14, %al
je pci_bios_get_irq_routing
cmpb $15, %al
je pci_bios_set_irq
jmp unknown_function
/*****************************************************************************/
pci_bios_present:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_present
#endif
movl $0x20494350, %eax
gs movl %eax, OFFS_EDX(%bp)
/* We support cfg type 1 version 2.10 */
movb $0x01, %al
gs movb %al, OFFS_AL(%bp)
movw $0x0210, %ax
gs movw %ax, OFFS_BX(%bp)
/* last bus number */
cs movb pci_last_bus, %al
gs movb %al, OFFS_CL(%bp)
jmp clear_carry
/*****************************************************************************/
/* device 0-31, function 0-7 */
pci_bios_find_device:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_find_device
#endif
gs movw OFFS_CX(%bp), %di
shll $16, %edi
gs movw OFFS_DX(%bp), %di
/* edi now holds device in upper 16 bits and vendor in lower 16 bits */
gs movw OFFS_SI(%bp), %si
/* start at bus 0 dev 0 function 0 */
xorw %bx, %bx
pfd_loop:
/* dword 0 is vendor/device */
xorw %ax, %ax
call __pci_bios_select_register
movw $0xcfc, %dx
inl %dx, %eax
/* our device ? */
cmpl %edi, %eax
je pfd_found_one
pfd_next_dev:
/* check for multi function devices */
movw %bx, %ax
andw $3, %ax
jnz pfd_function_not_zero
movw $0x000c, %ax
call __pci_bios_select_register
movw $0xcfe, %dx
inb %dx, %al
andb $0x80, %al
jz pfd_not_multi_function
pfd_function_not_zero:
/* next function, overflows in to device number, then bus number */
incw %bx
jmp pfd_check_bus
pfd_not_multi_function:
/* remove function bits */
andw $0xfff8, %bx
/* next device, overflows in to bus number */
addw $0x0008, %bx
pfd_check_bus:
cs movb pci_last_bus, %ah
cmpb %ah, %bh
ja pfd_not_found
jmp pfd_loop
pfd_found_one:
decw %si
js pfd_done
jmp pfd_next_dev
pfd_done:
gs movw %bx, OFFS_BX(%bp)
jmp clear_carry
pfd_not_found:
/* device not found */
movb $0x86, %ah
jmp set_carry
/*****************************************************************************/
pci_bios_find_class:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_find_class
#endif
gs movl OFFS_ECX(%bp), %edi
/* edi now holds class-code in lower 24 bits */
andl $0x00ffffff, %edi
gs movw OFFS_SI(%bp), %si
/* start at bus 0 dev 0 function 0 */
xorw %bx, %bx
pfc_loop:
/* dword 8 is class-code high 24bits */
movw $8, %ax
call __pci_bios_select_register
movw $0xcfc, %dx
inl %dx, %eax
shrl $8, %eax
andl $0x00ffffff, %eax
/* our device ? */
cmpl %edi, %eax
je pfc_found_one
pfc_next_dev:
/* check for multi function devices */
andw $3, %bx
jnz pfc_function_not_zero
movw $0x000c, %ax
call __pci_bios_select_register
movw $0xcfe, %dx
inb %dx, %al
andb $0x80, %al
jz pfc_not_multi_function
pfc_function_not_zero:
/* next function, overflows in to device number, then bus number */
incw %bx
jmp pfc_check_bus
pfc_not_multi_function:
/* remove function bits */
andw $0xfff8, %bx
/* next device, overflows in to bus number */
addw $0x0008, %bx
pfc_check_bus:
cs movb pci_last_bus, %ah
cmpb %ah, %bh
ja pfc_not_found
jmp pfc_loop
pfc_found_one:
decw %si
js pfc_done
jmp pfc_next_dev
pfc_done:
gs movw %bx, OFFS_BX(%bp)
jmp clear_carry
pfc_not_found:
/* device not found */
movb $0x86, %ah
jmp set_carry
/*****************************************************************************/
pci_bios_generate_special_cycle:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_generate_special_cycle
#endif
/* function not supported */
movb $0x81, %ah
jmp set_carry
/*****************************************************************************/
pci_bios_read_cfg_byte:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_read_cfg_byte
#endif
call pci_bios_select_register
gs movw OFFS_DI(%bp), %dx
andw $3, %dx
addw $0xcfc, %dx
inb %dx, %al
gs movb %al, OFFS_CL(%bp)
jmp clear_carry
/*****************************************************************************/
pci_bios_read_cfg_word:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_read_cfg_word
#endif
call pci_bios_select_register
gs movw OFFS_DI(%bp), %dx
andw $2, %dx
addw $0xcfc, %dx
inw %dx, %ax
gs movw %ax, OFFS_CX(%bp)
jmp clear_carry
/*****************************************************************************/
pci_bios_read_cfg_dword:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_read_cfg_dword
#endif
call pci_bios_select_register
movw $0xcfc, %dx
inl %dx, %eax
gs movl %eax, OFFS_ECX(%bp)
jmp clear_carry
/*****************************************************************************/
pci_bios_write_cfg_byte:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_write_cfg_byte
#endif
call pci_bios_select_register
gs movw OFFS_DI(%bp), %dx
gs movb OFFS_CL(%bp), %al
andw $3, %dx
addw $0xcfc, %dx
outb %al, %dx
jmp clear_carry
/*****************************************************************************/
pci_bios_write_cfg_word:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_write_cfg_word
#endif
call pci_bios_select_register
gs movw OFFS_DI(%bp), %dx
gs movw OFFS_CX(%bp), %ax
andw $2, %dx
addw $0xcfc, %dx
outw %ax, %dx
jmp clear_carry
/*****************************************************************************/
pci_bios_write_cfg_dword:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_write_cfg_dword
#endif
call pci_bios_select_register
gs movl OFFS_ECX(%bp), %eax
movw $0xcfc, %dx
outl %eax, %dx
jmp clear_carry
/*****************************************************************************/
pci_bios_get_irq_routing:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_get_irq_routing
#endif
/* function not supported */
movb $0x81, %ah
jmp set_carry
/*****************************************************************************/
pci_bios_set_irq:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_set_irq
#endif
/* function not supported */
movb $0x81, %ah
jmp set_carry
/*****************************************************************************/
unknown_function:
#ifdef PCI_BIOS_DEBUG
cs incl num_pci_bios_unknown_function
#endif
/* function not supported */
movb $0x81, %ah
jmp set_carry
/*****************************************************************************/
pci_bios_select_register:
gs movw OFFS_BX(%bp), %bx
gs movw OFFS_DI(%bp), %ax
/* destroys eax, dx */
__pci_bios_select_register:
/* BX holds device id, AX holds register index */
pushl %ebx
andl $0xfc, %eax
andl $0xffff, %ebx
shll $8, %ebx
orl %ebx, %eax
orl $0x80000000, %eax
movw $0xcf8, %dx
outl %eax, %dx
popl %ebx
ret
clear_carry:
gs movw OFFS_FLAGS(%bp), %ax
/* clear carry -- function succeeded */
andw $0xfffe, %ax
gs movw %ax, OFFS_FLAGS(%bp)
xorw %ax, %ax
gs movb %ah, OFFS_AH(%bp)
ret
set_carry:
gs movb %ah, OFFS_AH(%bp)
gs movw OFFS_FLAGS(%bp), %ax
/* return carry -- function not supported */
orw $1, %ax
gs movw %ax, OFFS_FLAGS(%bp)
movw $-1, %ax
ret
/*****************************************************************************/
.globl pci_last_bus
pci_last_bus:
.byte 0
#ifdef PCI_BIOS_DEBUG
.globl num_pci_bios_present
num_pci_bios_present:
.long 0
.globl num_pci_bios_find_device
num_pci_bios_find_device:
.long 0
.globl num_pci_bios_find_class
num_pci_bios_find_class:
.long 0
.globl num_pci_bios_generate_special_cycle
num_pci_bios_generate_special_cycle:
.long 0
.globl num_pci_bios_read_cfg_byte
num_pci_bios_read_cfg_byte:
.long 0
.globl num_pci_bios_read_cfg_word
num_pci_bios_read_cfg_word:
.long 0
.globl num_pci_bios_read_cfg_dword
num_pci_bios_read_cfg_dword:
.long 0
.globl num_pci_bios_write_cfg_byte
num_pci_bios_write_cfg_byte:
.long 0
.globl num_pci_bios_write_cfg_word
num_pci_bios_write_cfg_word:
.long 0
.globl num_pci_bios_write_cfg_dword
num_pci_bios_write_cfg_dword:
.long 0
.globl num_pci_bios_get_irq_routing
num_pci_bios_get_irq_routing:
.long 0
.globl num_pci_bios_set_irq
num_pci_bios_set_irq:
.long 0
.globl num_pci_bios_unknown_function
num_pci_bios_unknown_function:
.long 0
#endif

View File

@ -1,179 +0,0 @@
/*
* (C) Copyright 2002
* Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program 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 2 of
* the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* Partly based on msbios.c from rolo 1.6:
*----------------------------------------------------------------------
* (C) Copyright 2000
* Sysgo Real-Time Solutions GmbH
* Klein-Winternheim, Germany
*----------------------------------------------------------------------
*/
#include <common.h>
#include <pci.h>
#include <asm/realmode.h>
#include <asm/io.h>
#include "bios.h"
DECLARE_GLOBAL_DATA_PTR;
#define NUMVECTS 256
static int set_jmp_vector(int entry_point, void *target)
{
if (entry_point & ~0xffff)
return -1;
if (((u32)target - 0xf0000) & ~0xffff)
return -1;
printf("set_jmp_vector: 0xf000:%04x -> %p\n",
entry_point, target);
/* jmp opcode */
writeb(0xea, 0xf0000 + entry_point);
/* offset */
writew(((u32)target-0xf0000), 0xf0000 + entry_point + 1);
/* segment */
writew(0xf000, 0xf0000 + entry_point + 3);
return 0;
}
/* Install an interrupt vector */
static void setvector(int vector, u16 segment, void *handler)
{
u16 *ptr = (u16 *)(vector * 4);
ptr[0] = ((u32)handler - (segment << 4)) & 0xffff;
ptr[1] = segment;
#if 0
printf("setvector: int%02x -> %04x:%04x\n",
vector, ptr[1], ptr[0]);
#endif
}
int bios_setup(void)
{
/* The BIOS section is not relocated and still in the ROM. */
ulong bios_start = (ulong)&__bios_start;
ulong bios_size = (ulong)&__bios_size;
static int done;
int vector;
#ifdef CONFIG_PCI
struct pci_controller *pri_hose;
#endif
if (done)
return 0;
done = 1;
if (bios_size > 65536) {
printf("BIOS too large (%ld bytes, max is 65536)\n",
bios_size);
return -1;
}
memcpy(BIOS_BASE, (void *)bios_start, bios_size);
/* clear bda */
memset(BIOS_DATA, 0, BIOS_DATA_SIZE);
/* enter some values to the bda */
writew(0x3f8, BIOS_DATA); /* com1 addr */
writew(0x2f8, BIOS_DATA+2); /* com2 addr */
writew(0x3e8, BIOS_DATA+4); /* com3 addr */
writew(0x2e8, BIOS_DATA+6); /* com4 addr */
writew(0x278, BIOS_DATA+8); /* lpt1 addr */
/*
* The kernel wants to read the base memory size
* from 40:13. Put a zero there to avoid an error message
*/
writew(0, BIOS_DATA+0x13); /* base memory size */
/* setup realmode interrupt vectors */
for (vector = 0; vector < NUMVECTS; vector++)
setvector(vector, BIOS_CS, &rm_def_int);
setvector(0x00, BIOS_CS, &rm_int00);
setvector(0x01, BIOS_CS, &rm_int01);
setvector(0x02, BIOS_CS, &rm_int02);
setvector(0x03, BIOS_CS, &rm_int03);
setvector(0x04, BIOS_CS, &rm_int04);
setvector(0x05, BIOS_CS, &rm_int05);
setvector(0x06, BIOS_CS, &rm_int06);
setvector(0x07, BIOS_CS, &rm_int07);
setvector(0x08, BIOS_CS, &rm_int08);
setvector(0x09, BIOS_CS, &rm_int09);
setvector(0x0a, BIOS_CS, &rm_int0a);
setvector(0x0b, BIOS_CS, &rm_int0b);
setvector(0x0c, BIOS_CS, &rm_int0c);
setvector(0x0d, BIOS_CS, &rm_int0d);
setvector(0x0e, BIOS_CS, &rm_int0e);
setvector(0x0f, BIOS_CS, &rm_int0f);
setvector(0x10, BIOS_CS, &rm_int10);
setvector(0x11, BIOS_CS, &rm_int11);
setvector(0x12, BIOS_CS, &rm_int12);
setvector(0x13, BIOS_CS, &rm_int13);
setvector(0x14, BIOS_CS, &rm_int14);
setvector(0x15, BIOS_CS, &rm_int15);
setvector(0x16, BIOS_CS, &rm_int16);
setvector(0x17, BIOS_CS, &rm_int17);
setvector(0x18, BIOS_CS, &rm_int18);
setvector(0x19, BIOS_CS, &rm_int19);
setvector(0x1a, BIOS_CS, &rm_int1a);
setvector(0x1b, BIOS_CS, &rm_int1b);
setvector(0x1c, BIOS_CS, &rm_int1c);
setvector(0x1d, BIOS_CS, &rm_int1d);
setvector(0x1e, BIOS_CS, &rm_int1e);
setvector(0x1f, BIOS_CS, &rm_int1f);
set_jmp_vector(0xfff0, &realmode_reset);
set_jmp_vector(0xfe6e, &realmode_pci_bios_call_entry);
/* fill in data area */
RELOC_16_WORD(0xf000, ram_in_64kb_chunks) = gd->ram_size >> 16;
RELOC_16_WORD(0xf000, bios_equipment) = 0; /* FixMe */
/* If we assume only one PCI hose, this PCI hose
* will own PCI bus #0, and the last PCI bus of
* that PCI hose will be the last PCI bus in the
* system.
* (This, ofcause break on multi hose systems,
* but our PCI BIOS only support one hose anyway)
*/
#ifdef CONFIG_PCI
pri_hose = pci_bus_to_hose(0);
if (NULL != pri_hose) {
/* fill in last pci bus number for use by the realmode
* PCI BIOS */
RELOC_16_BYTE(0xf000, pci_last_bus) = pri_hose->last_busno;
}
#endif
return 0;
}

View File

@ -1,93 +0,0 @@
/*
* (C) Copyright 2002
* Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program 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 2 of
* the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <asm/io.h>
#include <asm/ptrace.h>
#include <asm/realmode.h>
#define REALMODE_MAILBOX ((char *)0xe00)
int realmode_setup(void)
{
/* The realmode section is not relocated and still in the ROM. */
ulong realmode_start = (ulong)&__realmode_start;
ulong realmode_size = (ulong)&__realmode_size;
/* copy the realmode switch code */
if (realmode_size > (REALMODE_MAILBOX - (char *)REALMODE_BASE)) {
printf("realmode switch too large (%ld bytes, max is %d)\n",
realmode_size,
(int)(REALMODE_MAILBOX - (char *)REALMODE_BASE));
return -1;
}
memcpy((char *)REALMODE_BASE, (void *)realmode_start, realmode_size);
asm("wbinvd\n");
return 0;
}
int enter_realmode(u16 seg, u16 off, struct pt_regs *in, struct pt_regs *out)
{
/* setup out thin bios emulation */
if (bios_setup())
return -1;
if (realmode_setup())
return -1;
in->eip = off;
in->xcs = seg;
if ((in->esp & 0xffff) < 4)
printf("Warning: entering realmode with sp < 4 will fail\n");
memcpy(REALMODE_MAILBOX, in, sizeof(struct pt_regs));
asm("wbinvd\n");
__asm__ volatile (
"lcall $0x20,%0\n" : : "i" (&realmode_enter));
asm("wbinvd\n");
memcpy(out, REALMODE_MAILBOX, sizeof(struct pt_regs));
return out->eax;
}
/*
* This code is supposed to access a realmode interrupt
* it does currently not work for me
*/
int enter_realmode_int(u8 lvl, struct pt_regs *in, struct pt_regs *out)
{
/* place two instructions at 0x700 */
writeb(0xcd, 0x700); /* int $lvl */
writeb(lvl, 0x701);
writeb(0xcb, 0x702); /* lret */
asm("wbinvd\n");
enter_realmode(0x00, 0x700, in, out);
return out->eflags & 0x00000001;
}

View File

@ -1,232 +0,0 @@
/*
* (C) Copyright 2002
* Daniel Engström, Omicron Ceti AB, daniel@omicron.se
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program 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 2 of
* the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/* 32bit -> 16bit -> 32bit mode switch code */
/*
* Stack frame at 0xe00
* e00 ebx;
* e04 ecx;
* e08 edx;
* e0c esi;
* e10 edi;
* e14 ebp;
* e18 eax;
* e1c ds;
* e20 es;
* e24 fs;
* e28 gs;
* e2c orig_eax;
* e30 eip;
* e34 cs;
* e38 eflags;
* e3c esp;
* e40 ss;
*/
#define a32 .byte 0x67; /* address size prefix 32 */
#define o32 .byte 0x66; /* operand size prefix 32 */
.section .realmode, "ax"
.code16
/* 16bit protected mode code here */
.globl realmode_enter
realmode_enter:
o32 pusha
o32 pushf
cli
sidt saved_idt
sgdt saved_gdt
movl %esp, %eax
movl %eax, saved_protected_mode_esp
movl $0x10, %eax
movl %eax, %esp
movw $0x28, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %fs
movw %ax, %gs
lidt realmode_idt_ptr
/* Go back into real mode by clearing PE to 0 */
movl %cr0, %eax
andl $0x7ffffffe, %eax
movl %eax, %cr0
/* switch to real mode */
ljmp $0x0,$do_realmode
do_realmode:
/* realmode code from here */
movw %cs,%ax
movw %ax,%ds
movw %ax,%es
movw %ax,%fs
movw %ax,%gs
/* create a temporary stack */
movw $0xc0, %ax
movw %ax, %ss
movw $0x200, %ax
movw %ax, %sp
popl %ebx
popl %ecx
popl %edx
popl %esi
popl %edi
popl %ebp
popl %eax
movl %eax, temp_eax
popl %eax
movw %ax, %ds
popl %eax
movw %ax, %es
popl %eax
movw %ax, %fs
popl %eax
movw %ax, %gs
popl %eax /* orig_eax */
popl %eax
cs movw %ax, temp_ip
popl %eax
cs movw %ax, temp_cs
o32 popf
popl %eax
popw %ss
movl %eax, %esp
cs movl temp_eax, %eax
/* self-modifying code, better flush the cache */
wbinvd
.byte 0x9a /* lcall */
temp_ip:
.word 0 /* new ip */
temp_cs:
.word 0 /* new cs */
realmode_ret:
/* save eax, esp and ss */
cs movl %eax, saved_eax
movl %esp, %eax
cs movl %eax, saved_esp
movw %ss, %ax
cs movw %ax, saved_ss
/*
* restore the stack, note that we set sp to 0x244;
* pt_regs is 0x44 bytes long and we push the structure
* backwards on to the stack, bottom first
*/
movw $0xc0, %ax
movw %ax, %ss
movw $0x244, %ax
movw %ax, %sp
xorl %eax,%eax
cs movw saved_ss, %ax
pushl %eax
cs movl saved_esp, %eax
pushl %eax
o32 pushf
xorl %eax,%eax
cs movw temp_cs, %ax
pushl %eax
cs movw temp_ip, %ax
pushl %eax
pushl $0
movw %gs, %ax
pushl %eax
movw %fs, %ax
pushl %eax
movw %es, %ax
pushl %eax
movw %ds, %ax
pushl %eax
movl saved_eax, %eax
pushl %eax
pushl %ebp
pushl %edi
pushl %esi
pushl %edx
pushl %ecx
pushl %ebx
o32 cs lidt saved_idt
o32 cs lgdt saved_gdt
/* Go back into protected mode reset PE to 1 */
movl %cr0, %eax
orl $1,%eax
movl %eax, %cr0
/* flush prefetch queue */
jmp next_line
next_line:
movw $return_ptr, %ax
movw %ax,%bp
o32 cs ljmp *(%bp)
.code32
protected_mode:
/* Reload segment registers */
movl $0x18, %eax
movw %ax, %fs
movw %ax, %ds
movw %ax, %gs
movw %ax, %es
movw %ax, %ss
movl saved_protected_mode_esp, %eax
movl %eax, %esp
popf
popa
ret
temp_eax:
.long 0
saved_ss:
.word 0
saved_esp:
.long 0
saved_eax:
.long 0
realmode_idt_ptr:
.word 0x400
.word 0x0, 0x0
saved_gdt:
.word 0, 0, 0, 0
saved_idt:
.word 0, 0, 0, 0
saved_protected_mode_esp:
.long 0
return_ptr:
.long protected_mode
.word 0x10

View File

@ -26,7 +26,6 @@
#include <stdio_dev.h>
#include <i8042.h>
#include <asm/ptrace.h>
#include <asm/realmode.h>
#include <asm/io.h>
#include <asm/pci.h>
@ -222,10 +221,5 @@ int video_init(void)
int drv_video_init(void)
{
#ifndef CONFIG_X86_NO_REAL_MODE
if (video_bios_init())
return 1;
#endif
return video_init();
}

View File

@ -1,196 +0,0 @@
/*
* (C) Copyright 2002
* Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program 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 2 of
* the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <pci.h>
#include <malloc.h>
#include <asm/ptrace.h>
#include <asm/realmode.h>
#include <asm/io.h>
#include <asm/pci.h>
#include "bios.h"
#undef PCI_BIOS_DEBUG
#undef VGA_BIOS_DEBUG
#ifdef VGA_BIOS_DEBUG
#define PRINTF(fmt, args...) printf(fmt, ##args)
#else
#define PRINTF(fmt, args...)
#endif
#define PCI_CLASS_VIDEO 3
#define PCI_CLASS_VIDEO_STD 0
#define PCI_CLASS_VIDEO_PROG_IF_VGA 0
DEFINE_PCI_DEVICE_TABLE(supported) = {
{PCI_VIDEO_VENDOR_ID, PCI_VIDEO_DEVICE_ID},
{}
};
static u32 probe_pci_video(void)
{
struct pci_controller *hose;
pci_dev_t devbusfn = pci_find_devices(supported, 0);
if ((devbusfn != -1)) {
u32 old;
u32 addr;
/* PCI video device detected */
printf("Found PCI VGA device at %02x.%02x.%x\n",
PCI_BUS(devbusfn),
PCI_DEV(devbusfn),
PCI_FUNC(devbusfn));
/* Enable I/O decoding as well, PCI viudeo boards
* support I/O accesses, but they provide no
* bar register for this since the ports are fixed.
*/
pci_write_config_word(devbusfn,
PCI_COMMAND,
PCI_COMMAND_MEMORY |
PCI_COMMAND_IO |
PCI_COMMAND_MASTER);
/* Test the ROM decoder, do the device support a rom? */
pci_read_config_dword(devbusfn, PCI_ROM_ADDRESS, &old);
pci_write_config_dword(devbusfn, PCI_ROM_ADDRESS,
(u32)PCI_ROM_ADDRESS_MASK);
pci_read_config_dword(devbusfn, PCI_ROM_ADDRESS, &addr);
pci_write_config_dword(devbusfn, PCI_ROM_ADDRESS, old);
if (!addr) {
printf("PCI VGA have no ROM?\n");
return 0;
}
/* device have a rom */
if (pci_shadow_rom(devbusfn, (void *)0xc0000)) {
printf("Shadowing of PCI VGA BIOS failed\n");
return 0;
}
/* Now enable lagacy VGA port access */
hose = pci_bus_to_hose(PCI_BUS(devbusfn));
if (pci_enable_legacy_video_ports(hose)) {
printf("PCI VGA enable failed\n");
return 0;
}
/* return the pci device info, that we'll need later */
return PCI_BUS(devbusfn) << 8 |
PCI_DEV(devbusfn) << 3 | (PCI_FUNC(devbusfn) & 7);
}
return 0;
}
static int probe_isa_video(void)
{
u32 ptr;
char *buf;
ptr = isa_map_rom(0xc0000, 0x8000);
if (!ptr)
return -1;
buf = malloc(0x8000);
if (!buf) {
isa_unmap_rom(ptr);
return -1;
}
if (readw(ptr) != 0xaa55) {
free(buf);
isa_unmap_rom(ptr);
return -1;
}
/* shadow the rom */
memcpy(buf, (void *)ptr, 0x8000);
isa_unmap_rom(ptr);
memcpy((void *)0xc0000, buf, 0x8000);
free(buf);
return 0;
}
int video_bios_init(void)
{
struct pt_regs regs;
int size;
int i;
u8 sum;
/* clear the video bios area in case we warmbooted */
memset((void *)0xc0000, 0, 0x8000);
memset(&regs, 0, sizeof(struct pt_regs));
if (probe_isa_video())
/* No ISA board found, try the PCI bus */
regs.eax = probe_pci_video();
/* Did we succeed in mapping any video bios */
if (readw(0xc0000) == 0xaa55) {
PRINTF("Found video bios signature\n");
size = readb(0xc0002) * 512;
PRINTF("size %d\n", size);
sum = 0;
for (i = 0; i < size; i++)
sum += readb(0xc0000 + i);
PRINTF("Checksum is %sOK\n", sum ? "NOT " : "");
if (sum)
return 1;
/*
* Some video bioses (ATI Mach64) seem to think that
* the original int 10 handler is always at
* 0xf000:0xf065 , place an iret instruction there
*/
writeb(0xcf, 0xff065);
regs.esp = 0x8000;
regs.xss = 0x2000;
enter_realmode(0xc000, 3, &regs, &regs);
PRINTF("INT 0x10 vector after: %04x:%04x\n",
readw(0x42), readw(0x40));
PRINTF("BIOS returned %scarry\n",
regs.eflags & 0x00000001 ? "" : "NOT ");
#ifdef PCI_BIOS_DEBUG
print_bios_bios_stat();
#endif
return regs.eflags & 0x00000001;
}
return 1;
}

View File

@ -33,7 +33,6 @@
#include <asm/io.h>
#include <asm/ptrace.h>
#include <asm/zimage.h>
#include <asm/realmode.h>
#include <asm/byteorder.h>
#include <asm/bootparam.h>
#ifdef CONFIG_SYS_COREBOOT
@ -175,16 +174,9 @@ struct boot_params *load_zimage(char *image, unsigned long kernel_size,
else
*load_address = (void *)ZIMAGE_LOAD_ADDR;
#if (defined CONFIG_ZBOOT_32 || defined CONFIG_X86_NO_REAL_MODE)
printf("Building boot_params at 0x%8.8lx\n", (ulong)setup_base);
memset(setup_base, 0, sizeof(*setup_base));
setup_base->hdr = params->hdr;
#else
/* load setup */
printf("Moving Real-Mode Code to 0x%8.8lx (%d bytes)\n",
(ulong)setup_base, setup_size);
memmove(setup_base, image, setup_size);
#endif
if (bootproto >= 0x0204)
kernel_size = hdr->syssize * 16;
@ -241,10 +233,8 @@ int setup_zimage(struct boot_params *setup_base, char *cmd_line, int auto_boot,
struct setup_header *hdr = &setup_base->hdr;
int bootproto = get_boot_protocol(hdr);
#if (defined CONFIG_ZBOOT_32 || defined CONFIG_X86_NO_REAL_MODE)
setup_base->e820_entries = install_e820_map(
ARRAY_SIZE(setup_base->e820_map), setup_base->e820_map);
#endif
if (bootproto == 0x0100) {
setup_base->screen_info.cl_magic = COMMAND_LINE_MAGIC;
@ -300,7 +290,6 @@ void boot_zimage(void *setup_base, void *load_address)
#ifdef CONFIG_SYS_COREBOOT
timestamp_add_now(TS_U_BOOT_START_KERNEL);
#endif
#if defined CONFIG_ZBOOT_32
/*
* Set %ebx, %ebp, and %edi to 0, %esi to point to the boot_params
* structure, and then jump to the kernel. We assume that %cs is
@ -317,18 +306,6 @@ void boot_zimage(void *setup_base, void *load_address)
"b"(0), "D"(0)
: "%ebp"
);
#else
struct pt_regs regs;
memset(&regs, 0, sizeof(struct pt_regs));
regs.xds = (u32)setup_base >> 4;
regs.xes = regs.xds;
regs.xss = regs.xds;
regs.esp = 0x9000;
regs.eflags = 0;
enter_realmode(((u32)setup_base + SETUP_START_OFFSET) >> 4, 0,
&regs, &regs);
#endif
}
void setup_pcat_compatibility(void)