summaryrefslogtreecommitdiffstats
path: root/qemu/roms/ipxe/src/arch/i386/transitions/liba20.S
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/ipxe/src/arch/i386/transitions/liba20.S')
-rw-r--r--qemu/roms/ipxe/src/arch/i386/transitions/liba20.S313
1 files changed, 0 insertions, 313 deletions
diff --git a/qemu/roms/ipxe/src/arch/i386/transitions/liba20.S b/qemu/roms/ipxe/src/arch/i386/transitions/liba20.S
deleted file mode 100644
index 6c1e1f62f..000000000
--- a/qemu/roms/ipxe/src/arch/i386/transitions/liba20.S
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright (C) 2010 Michael Brown <mbrown@fensystems.co.uk>.
- *
- * 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 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., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
- *
- * You can also choose to distribute this program under the terms of
- * the Unmodified Binary Distribution Licence (as given in the file
- * COPYING.UBDL), provided that you have satisfied its requirements.
- *
- */
-
-FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
-
- .arch i386
-
-/****************************************************************************
- * test_a20_short, test_a20_long
- *
- * Check to see if A20 line is enabled
- *
- * Parameters:
- * none
- * Returns:
- * CF set if A20 line is not enabled
- * Corrupts:
- * none
- ****************************************************************************
- */
-#define TEST_A20_SHORT_MAX_RETRIES 0x20
-#define TEST_A20_LONG_MAX_RETRIES 0x200000
- .section ".text16.early", "awx", @progbits
- .code16
-test_a20_short:
- pushl %ecx
- movl $TEST_A20_SHORT_MAX_RETRIES, %ecx
- jmp 1f
- .size test_a20_short, . - test_a20_short
-test_a20_long:
- pushl %ecx
- movl $TEST_A20_LONG_MAX_RETRIES, %ecx
-1: pushw %ax
- pushw %ds
- pushw %es
-
- /* Set up segment registers for access across the 1MB boundary */
- xorw %ax, %ax
- movw %ax, %ds
- decw %ax
- movw %ax, %es
-
-2: /* Modify and check test pattern; succeed if we see a difference */
- pushfw
- cli
- xchgw %ds:0, %cx
- movw %es:0x10, %ax
- xchgw %ds:0, %cx
- popfw
- cmpw %ax, %cx
- clc
- jnz 99f
-
- /* Delay and retry */
- outb %al, $0x80
- addr32 loop 2b
- stc
-
-99: /* Restore registers and return */
- popw %es
- popw %ds
- popw %ax
- popl %ecx
- ret
- .size test_a20_long, . - test_a20_long
-
-/****************************************************************************
- * enable_a20_bios
- *
- * Try enabling A20 line via BIOS
- *
- * Parameters:
- * none
- * Returns:
- * CF set if A20 line is not enabled
- * Corrupts:
- * none
- ****************************************************************************
- */
- .section ".text16.early", "awx", @progbits
- .code16
-enable_a20_bios:
-
- /* Preserve registers. Be very paranoid, since some BIOSes
- * are reported to clobber %ebx
- */
- pushal
-
- /* Attempt INT 15,2401 */
- movw $0x2401, %ax
- int $0x15
- jc 99f
-
- /* Check that success was really successful */
- call test_a20_short
-
-99: /* Restore registers and return */
- popal
- ret
- .size enable_a20_bios, . - enable_a20_bios
-
-/****************************************************************************
- * enable_a20_kbc
- *
- * Try enabling A20 line via keyboard controller
- *
- * Parameters:
- * none
- * Returns:
- * CF set if A20 line is not enabled
- * Corrupts:
- * none
- ****************************************************************************
- */
-#define KC_RDWR 0x60
-#define KC_RDWR_SET_A20 0xdf
-#define KC_CMD 0x64
-#define KC_CMD_WOUT 0xd1
-#define KC_CMD_NULL 0xff
-#define KC_STATUS 0x64
-#define KC_STATUS_OBUF_FULL 0x01
-#define KC_STATUS_IBUF_FULL 0x02
-#define KC_MAX_RETRIES 100000
- .section ".text16.early", "awx", @progbits
- .code16
-enable_a20_kbc:
- /* Preserve registers */
- pushw %ax
-
- /* Try keyboard controller */
- call empty_kbc
- movb $KC_CMD_WOUT, %al
- outb %al, $KC_CMD
- call empty_kbc
- movb $KC_RDWR_SET_A20, %al
- outb %al, $KC_RDWR
- call empty_kbc
- movb $KC_CMD_NULL, %al
- outb %al, $KC_CMD
- call empty_kbc
-
- /* Check to see if it worked */
- call test_a20_long
-
- /* Restore registers and return */
- popw %ax
- ret
- .size enable_a20_kbc, . - enable_a20_kbc
-
- .section ".text16.early", "awx", @progbits
- .code16
-empty_kbc:
- /* Preserve registers */
- pushl %ecx
- pushw %ax
-
- /* Wait for KBC to become empty */
- movl $KC_MAX_RETRIES, %ecx
-1: outb %al, $0x80
- inb $KC_STATUS, %al
- testb $( KC_STATUS_OBUF_FULL | KC_STATUS_IBUF_FULL ), %al
- jz 99f
- testb $KC_STATUS_OBUF_FULL, %al
- jz 2f
- outb %al, $0x80
- inb $KC_RDWR, %al
-2: addr32 loop 1b
-
-99: /* Restore registers and return */
- popw %ax
- popl %ecx
- ret
- .size empty_kbc, . - empty_kbc
-
-/****************************************************************************
- * enable_a20_fast
- *
- * Try enabling A20 line via "Fast Gate A20"
- *
- * Parameters:
- * none
- * Returns:
- * CF set if A20 line is not enabled
- * Corrupts:
- * none
- ****************************************************************************
- */
-#define SCP_A 0x92
- .section ".text16.early", "awx", @progbits
- .code16
-enable_a20_fast:
- /* Preserve registers */
- pushw %ax
-
- /* Try "Fast Gate A20" */
- inb $SCP_A, %al
- orb $0x02, %al
- andb $~0x01, %al
- outb %al, $SCP_A
-
- /* Check to see if it worked */
- call test_a20_long
-
- /* Restore registers and return */
- popw %ax
- ret
- .size enable_a20_fast, . - enable_a20_fast
-
-/****************************************************************************
- * enable_a20
- *
- * Try enabling A20 line via any available method
- *
- * Parameters:
- * none
- * Returns:
- * CF set if A20 line is not enabled
- * Corrupts:
- * none
- ****************************************************************************
- */
-#define ENABLE_A20_RETRIES 255
- .section ".text16.early", "awx", @progbits
- .code16
- .globl enable_a20
-enable_a20:
- /* Preserve registers */
- pushl %ecx
- pushw %ax
-
- /* Check to see if A20 is already enabled */
- call test_a20_short
- jnc 99f
-
- /* Use known working method, if we have one */
- movw %cs:enable_a20_method, %ax
- testw %ax, %ax
- jz 1f
- call *%ax
- jmp 99f
-1:
- /* Try all methods in turn until one works */
- movl $ENABLE_A20_RETRIES, %ecx
-2: movw $enable_a20_bios, %ax
- movw %ax, %cs:enable_a20_method
- call *%ax
- jnc 99f
- movw $enable_a20_kbc, %ax
- movw %ax, %cs:enable_a20_method
- call *%ax
- jnc 99f
- movw $enable_a20_fast, %ax
- movw %ax, %cs:enable_a20_method
- call *%ax
- jnc 99f
- addr32 loop 2b
- /* Failure; exit with carry set */
- movw $0, %cs:enable_a20_method
- stc
-
-99: /* Restore registers and return */
- popw %ax
- popl %ecx
- ret
-
- .section ".text16.early.data", "aw", @progbits
- .align 2
-enable_a20_method:
- .word 0
- .size enable_a20_method, . - enable_a20_method
-
-/****************************************************************************
- * access_highmem (real mode far call)
- *
- * Open up access to high memory with A20 enabled
- *
- * Parameters:
- * none
- * Returns:
- * CF set if high memory could not be accessed
- * Corrupts:
- * none
- ****************************************************************************
- */
- .section ".text16.early", "awx", @progbits
- .code16
- .globl access_highmem
-access_highmem:
- /* Enable A20 line */
- call enable_a20
- lret
- .size access_highmem, . - access_highmem