From cebb902036cb182fbe4ad751d62a397d0f59ee8b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 17 Jun 2011 08:49:22 +0000 Subject: [PATCH] [FREELDR] Fix build with good old rbuild svn path=/trunk/; revision=52293 --- reactos/boot/freeldr/freeldr/CMakeLists.txt | 2 +- .../boot/freeldr/freeldr/arch/i386/i386pnp.S | 102 ++++++++-- .../freeldr/freeldr/arch/i386/i386pnp.cmake.S | 181 ++++++++++++++++++ 3 files changed, 270 insertions(+), 15 deletions(-) create mode 100644 reactos/boot/freeldr/freeldr/arch/i386/i386pnp.cmake.S diff --git a/reactos/boot/freeldr/freeldr/CMakeLists.txt b/reactos/boot/freeldr/freeldr/CMakeLists.txt index 8fe1ebdd8af..1559a5d2b13 100644 --- a/reactos/boot/freeldr/freeldr/CMakeLists.txt +++ b/reactos/boot/freeldr/freeldr/CMakeLists.txt @@ -13,11 +13,11 @@ if(ARCH MATCHES i386) arch/i386/entry.S arch/i386/i386idt.c arch/i386/i386trap.S + arch/i386/i386pnp.cmake.S arch/i386/i386bug.c) if(NOT MSVC) list(APPEND FREELDR_BASE64K_SOURCE arch/i386/drvmap.S - arch/i386/i386pnp.S arch/i386/linux.S arch/i386/multiboot.S arch/i386/mb.S) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386pnp.S b/reactos/boot/freeldr/freeldr/arch/i386/i386pnp.S index 4c5f0b27209..b66b51adbab 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386pnp.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386pnp.S @@ -28,6 +28,11 @@ * * RETURNS: */ +_pnp_bios_entry_point: + .long 0 +_pnp_bios_data_segment: + .word 0 + PUBLIC _PnpBiosSupported _PnpBiosSupported: @@ -77,11 +82,11 @@ pnp_loop: mov ax, [esi + 15] shl eax, 16 mov ax, [esi + 0x0D] - mov [BSS_PnpBiosEntryPoint], eax + mov _pnp_bios_entry_point, eax /* Store bios data segment */ mov ax, [esi + 0x1B] - mov word ptr ds:[BSS_PnpBiosDataSegment], ax + mov _pnp_bios_data_segment, ax pnp_not_found: mov eax, edi @@ -99,6 +104,13 @@ pnp_not_found: * * RETURNS: */ +_pnp_result: + .long 0 +_pnp_node_size: + .word 0 +_pnp_node_count: + .word 0 + PUBLIC _PnpBiosGetDeviceNodeCount _PnpBiosGetDeviceNodeCount: @@ -108,16 +120,39 @@ _PnpBiosGetDeviceNodeCount: pusha push es - mov bx, FNID_PnpBiosGetDeviceNodeCount - call i386CallRealMode + 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 esi, [ebp + 8] - mov ax, [BSS_PnpNodeSize] + mov ax, _pnp_node_size movzx ecx, ax mov [esi], ecx mov esi, [ebp + 12] - mov ax, [BSS_PnpNodeCount] + mov ax, _pnp_node_count movzx ecx, ax mov [esi], eax @@ -127,7 +162,7 @@ _PnpBiosGetDeviceNodeCount: mov esp, ebp pop ebp - mov eax, dword ptr [BSS_PnpResult] + mov eax, _pnp_result ret @@ -137,6 +172,14 @@ _PnpBiosGetDeviceNodeCount: * * RETURNS: */ +_pnp_buffer_segment: + .word 0 +_pnp_buffer_offset: + .word 0 + +_pnp_node_number: + .byte 0 + EXTERN(_PnpBiosGetDeviceNode) .code32 @@ -149,23 +192,54 @@ EXTERN(_PnpBiosGetDeviceNode) /* get current node number */ mov esi, [ebp + 8] mov al, [esi] - mov [BSS_PnpNodeNumber], al + mov _pnp_node_number, al /* convert pointer to node buffer to segment/offset */ mov eax, [ebp + 12] shr eax, 4 and eax, 0xf000 - mov word ptr [BSS_PnpBiosBufferSegment], ax + mov _pnp_buffer_segment, ax mov eax, [ebp + 12] and eax, 0xffff - mov [BSS_PnpBiosBufferOffset], ax + mov _pnp_buffer_offset, ax - mov bx, FNID_PnpBiosGetDeviceNode - call i386CallRealMode + 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 /* update node number */ mov esi, [ebp + 8] - mov al, [BSS_PnpNodeNumber] + mov al, _pnp_node_number mov [esi], al pop es @@ -174,7 +248,7 @@ EXTERN(_PnpBiosGetDeviceNode) mov esp, ebp pop ebp - mov eax, [BSS_PnpResult] + mov eax, _pnp_result ret diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386pnp.cmake.S b/reactos/boot/freeldr/freeldr/arch/i386/i386pnp.cmake.S new file mode 100644 index 00000000000..4c5f0b27209 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386pnp.cmake.S @@ -0,0 +1,181 @@ +/* + * FreeLoader + * Copyright (C) 2003 Eric Kohl + * + * 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. + */ + +#include +#include + +.code32 + + +/* + * U32 PnpBiosSupported(VOID); + * + * RETURNS: + */ +PUBLIC _PnpBiosSupported +_PnpBiosSupported: + + push edi + push esi + push ecx + push edx + + xor edi, edi + + /* init esi */ + mov esi, HEX(0F0000) + +pnp_again: + mov eax, [esi] + cmp eax, HEX(506E5024) /* "$PnP" */ + je pnp_found + + cmp esi, HEX(0FFFF0) + je pnp_not_found + +pnp_add: + add esi, 16 + jmp pnp_again + +pnp_found: + /* first calculate the checksum */ + push esi + + push HEX(21) + pop ecx + xor edx, edx + +pnp_loop: + lodsb + add dl, al + loop pnp_loop + + test dl, dl + pop esi + jnz pnp_add + + mov edi, esi + + /* Calculate the bios entry point (far pointer) */ + xor eax, eax + mov ax, [esi + 15] + shl eax, 16 + mov ax, [esi + 0x0D] + mov [BSS_PnpBiosEntryPoint], eax + + /* Store bios data segment */ + mov ax, [esi + 0x1B] + mov word ptr ds:[BSS_PnpBiosDataSegment], ax + +pnp_not_found: + mov eax, edi + + pop edx + pop ecx + pop esi + pop edi + + ret + + +/* + * U32 PnpBiosGetDeviceNodeCount(U32 *NodeSize, U32 *NodeCount); + * + * RETURNS: + */ +PUBLIC _PnpBiosGetDeviceNodeCount +_PnpBiosGetDeviceNodeCount: + + push ebp + mov ebp, esp + + pusha + push es + + mov bx, FNID_PnpBiosGetDeviceNodeCount + call i386CallRealMode + + mov esi, [ebp + 8] + mov ax, [BSS_PnpNodeSize] + movzx ecx, ax + mov [esi], ecx + + mov esi, [ebp + 12] + mov ax, [BSS_PnpNodeCount] + movzx ecx, ax + mov [esi], eax + + pop es + popa + + mov esp, ebp + pop ebp + + mov eax, dword ptr [BSS_PnpResult] + + ret + + +/* + * U32 PnpBiosGetDeviceNode(U8 *NodeId, U8 *NodeBuffer); + * + * RETURNS: + */ +EXTERN(_PnpBiosGetDeviceNode) + .code32 + + push ebp + mov ebp, esp + + pusha + push es + + /* get current node number */ + mov esi, [ebp + 8] + mov al, [esi] + mov [BSS_PnpNodeNumber], al + + /* convert pointer to node buffer to segment/offset */ + mov eax, [ebp + 12] + shr eax, 4 + and eax, 0xf000 + mov word ptr [BSS_PnpBiosBufferSegment], ax + mov eax, [ebp + 12] + and eax, 0xffff + mov [BSS_PnpBiosBufferOffset], ax + + mov bx, FNID_PnpBiosGetDeviceNode + call i386CallRealMode + + /* update node number */ + mov esi, [ebp + 8] + mov al, [BSS_PnpNodeNumber] + mov [esi], al + + pop es + popa + + mov esp, ebp + pop ebp + + mov eax, [BSS_PnpResult] + + ret + +/* EOF */