[FREELDR]

- Use new relmode code for PnpBios stuff

svn path=/trunk/; revision=52292
This commit is contained in:
Timo Kreuzer
2011-06-17 08:36:49 +00:00
parent 285734917e
commit 2372dd2207
6 changed files with 131 additions and 107 deletions
@@ -28,11 +28,6 @@
*
* RETURNS:
*/
_pnp_bios_entry_point:
.long 0
_pnp_bios_data_segment:
.word 0
PUBLIC _PnpBiosSupported
_PnpBiosSupported:
@@ -82,11 +77,11 @@ pnp_loop:
mov ax, [esi + 15]
shl eax, 16
mov ax, [esi + 0x0D]
mov _pnp_bios_entry_point, eax
mov [BSS_PnpBiosEntryPoint], eax
/* Store bios data segment */
mov ax, [esi + 0x1B]
mov _pnp_bios_data_segment, ax
mov word ptr ds:[BSS_PnpBiosDataSegment], ax
pnp_not_found:
mov eax, edi
@@ -104,13 +99,6 @@ pnp_not_found:
*
* RETURNS:
*/
_pnp_result:
.long 0
_pnp_node_size:
.word 0
_pnp_node_count:
.word 0
PUBLIC _PnpBiosGetDeviceNodeCount
_PnpBiosGetDeviceNodeCount:
@@ -120,39 +108,16 @@ _PnpBiosGetDeviceNodeCount:
pusha
push es
call switch_to_real
.code16
mov ax, word ptr [_pnp_bios_data_segment]
push ax
push cs
mov ax, offset _pnp_node_size
push ax
push cs
mov ax, offset _pnp_node_count
push ax
push 0
call dword ptr [_pnp_bios_entry_point]
add sp, 12
movzx ecx, ax
mov _pnp_result, ecx
call switch_to_prot
.code32
mov bx, FNID_PnpBiosGetDeviceNodeCount
call i386CallRealMode
mov esi, [ebp + 8]
mov ax, _pnp_node_size
mov ax, [BSS_PnpNodeSize]
movzx ecx, ax
mov [esi], ecx
mov esi, [ebp + 12]
mov ax, _pnp_node_count
mov ax, [BSS_PnpNodeCount]
movzx ecx, ax
mov [esi], eax
@@ -162,7 +127,7 @@ _PnpBiosGetDeviceNodeCount:
mov esp, ebp
pop ebp
mov eax, _pnp_result
mov eax, dword ptr [BSS_PnpResult]
ret
@@ -172,14 +137,6 @@ _PnpBiosGetDeviceNodeCount:
*
* RETURNS:
*/
_pnp_buffer_segment:
.word 0
_pnp_buffer_offset:
.word 0
_pnp_node_number:
.byte 0
EXTERN(_PnpBiosGetDeviceNode)
.code32
@@ -192,54 +149,23 @@ EXTERN(_PnpBiosGetDeviceNode)
/* get current node number */
mov esi, [ebp + 8]
mov al, [esi]
mov _pnp_node_number, al
mov [BSS_PnpNodeNumber], al
/* convert pointer to node buffer to segment/offset */
mov eax, [ebp + 12]
shr eax, 4
and eax, 0xf000
mov _pnp_buffer_segment, ax
mov word ptr [BSS_PnpBiosBufferSegment], ax
mov eax, [ebp + 12]
and eax, 0xffff
mov _pnp_buffer_offset, ax
mov [BSS_PnpBiosBufferOffset], ax
call switch_to_real
.code16
/* push bios segment */
mov ax, word ptr [_pnp_bios_data_segment]
push ax
/* push control flag */
push 1
/* push pointer to node buffer (segment/offset) */
mov ax, word ptr [_pnp_buffer_segment]
push ax
mov ax, word ptr [_pnp_buffer_offset]
push ax
/* push pointer to node number (segment/offset) */
push cs
mov ax, offset _pnp_node_number
push ax
/* push function number */
push 1
/* call entry point */
call dword ptr [_pnp_bios_entry_point]
add sp, 14
movzx ecx, ax
mov _pnp_result, ecx
call switch_to_prot
.code32
mov bx, FNID_PnpBiosGetDeviceNode
call i386CallRealMode
/* update node number */
mov esi, [ebp + 8]
mov al, _pnp_node_number
mov al, [BSS_PnpNodeNumber]
mov [esi], al
pop es
@@ -248,7 +174,7 @@ EXTERN(_PnpBiosGetDeviceNode)
mov esp, ebp
pop ebp
mov eax, _pnp_result
mov eax, [BSS_PnpResult]
ret
@@ -123,11 +123,15 @@ pm_offset:
nop
// FIXME: use ljmp16 PMODE_CS:inpmode + hexed 32bit jump
callback_table:
.word Int386
.word SoftReboot
.word ChainLoadBiosBootSectorCode
.word PxeCallApi
.word PnpBiosGetDeviceNodeCount
.word PnpBiosGetDeviceNode
/* 16-bit stack pointer */
@@ -180,6 +184,8 @@ rmode_idtptr:
//.org 1024
#include "int386.inc"
#include "pxe.inc"
#include "pnp.inc"
#include "helpers.inc"
.org (FREELDR_PE_BASE - FREELDR_BASE)
@@ -0,0 +1,58 @@
PnpBiosGetDeviceNodeCount:
mov ax, word ptr [BSS_PnpBiosDataSegment]
push ax
push cs
mov ax, BSS_PnpNodeSize
push ax
push cs
mov ax, BSS_PnpNodeCount
push ax
push 0
call dword ptr [BSS_PnpBiosEntryPoint]
add sp, 12
movzx ecx, ax
mov dword ptr [BSS_PnpResult], ecx
ret
PnpBiosGetDeviceNode:
/* push bios segment */
mov ax, word ptr [BSS_PnpBiosDataSegment]
push ax
/* push control flag */
push 1
/* push pointer to node buffer (segment/offset) */
mov ax, word ptr [BSS_PnpBiosBufferSegment]
push ax
mov ax, word ptr [BSS_PnpBiosBufferOffset]
push ax
/* push pointer to node number (segment/offset) */
push cs
mov ax, BSS_PnpNodeNumber
push ax
/* push function number */
push 1
/* call entry point */
call dword ptr [BSS_PnpBiosEntryPoint]
add sp, 14
movzx ecx, ax
mov [BSS_PnpResult], ecx
ret
@@ -0,0 +1,33 @@
/*
* FreeLoader
* Copyright (C) 2011 Hervé Poussineau
*
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
PxeCallApi:
mov ax, [BSS_PxeBufferSegment]
push ax
mov ax, [BSS_PxeBufferOffset]
push ax
mov ax, [BSS_PxeFunction]
push ax
call dword ptr [BSS_PxeEntryPoint]
add esp, 6
mov [BSS_PxeResult], ax
ret
@@ -71,15 +71,6 @@ VOID DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber);
/* hwpci.c */
VOID DetectPciBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber);
/* i386cpu.S */
ULONG CpuidSupported(VOID);
VOID GetCpuid(ULONG Level,
ULONG *eax,
ULONG *ebx,
ULONG *ecx,
ULONG *edx);
ULONGLONG RDTSC(VOID);
/* i386pnp.S */
ULONG_PTR PnpBiosSupported(VOID);
ULONG PnpBiosGetDeviceNodeCount(ULONG *NodeSize,
@@ -22,16 +22,24 @@
#define DISKREADBUFFER_SIZE 512
/* These addresses specify the realmode "BSS section" layout */
#define BSS_RealModeEntry (BSS_START + 0)
#define BSS_CallbackAddress (BSS_START + 4)
#define BSS_CallbackReturn (BSS_START + 8)
#define BSS_RegisterSet (BSS_START + 16) /* size = 36 */
#define BSS_IntVector (BSS_START + 52)
#define BSS_PxeEntryPoint (BSS_START + 56)
#define BSS_PxeBufferSegment (BSS_START + 60)
#define BSS_PxeBufferOffset (BSS_START + 64)
#define BSS_PxeFunction (BSS_START + 68)
#define BSS_PxeResult (BSS_START + 72)
#define BSS_RealModeEntry (BSS_START + 0)
#define BSS_CallbackAddress (BSS_START + 4)
#define BSS_CallbackReturn (BSS_START + 8)
#define BSS_RegisterSet (BSS_START + 16) /* size = 36 */
#define BSS_IntVector (BSS_START + 52)
#define BSS_PxeEntryPoint (BSS_START + 56)
#define BSS_PxeBufferSegment (BSS_START + 60)
#define BSS_PxeBufferOffset (BSS_START + 64)
#define BSS_PxeFunction (BSS_START + 68)
#define BSS_PxeResult (BSS_START + 72)
#define BSS_PnpBiosEntryPoint (BSS_START + 76)
#define BSS_PnpBiosDataSegment (BSS_START + 80)
#define BSS_PnpBiosBufferSegment (BSS_START + 84)
#define BSS_PnpBiosBufferOffset (BSS_START + 88)
#define BSS_PnpNodeSize (BSS_START + 92)
#define BSS_PnpNodeCount (BSS_START + 96)
#define BSS_PnpNodeNumber (BSS_START + 100)
#define BSS_PnpResult (BSS_START + 104)
/* Realmode function IDs */
@@ -39,6 +47,8 @@
#define FNID_SoftReboot 1
#define FNID_ChainLoadBiosBootSectorCode 2
#define FNID_PxeCallApi 3
#define FNID_PnpBiosGetDeviceNodeCount 4
#define FNID_PnpBiosGetDeviceNode 5
/* Layout of the REGS structure */
#define REGS_EAX 0