1 /* 2 * PROJECT: FreeLoader 3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) 4 * PURPOSE: APM BIOS detection routines 5 * COPYRIGHT: Copyright 2004 Eric Kohl (eric.kohl@reactos.org) 6 */ 7 8 #include <freeldr.h> 9 10 #include <debug.h> 11 DBG_DEFAULT_CHANNEL(HWDETECT); 12 13 static BOOLEAN 14 FindApmBios(VOID) 15 { 16 REGS RegsIn, RegsOut; 17 18 /* APM BIOS - Installation check */ 19 #if defined(SARCH_PC98) 20 RegsIn.w.ax = 0x9A00; 21 RegsIn.w.bx = 0x0000; 22 Int386(0x1F, &RegsIn, &RegsOut); 23 #else 24 RegsIn.w.ax = 0x5300; 25 RegsIn.w.bx = 0x0000; 26 Int386(0x15, &RegsIn, &RegsOut); 27 #endif 28 if (INT386_SUCCESS(RegsOut) && RegsOut.w.bx == 'PM') 29 { 30 TRACE("Found APM BIOS\n"); 31 TRACE("AH: %x\n", RegsOut.b.ah); 32 TRACE("AL: %x\n", RegsOut.b.al); 33 TRACE("BH: %x\n", RegsOut.b.bh); 34 TRACE("BL: %x\n", RegsOut.b.bl); 35 TRACE("CX: %x\n", RegsOut.w.cx); 36 37 return TRUE; 38 } 39 40 TRACE("No APM BIOS found\n"); 41 42 return FALSE; 43 } 44 45 VOID 46 DetectApmBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) 47 { 48 PCONFIGURATION_COMPONENT_DATA BiosKey; 49 PCM_PARTIAL_RESOURCE_LIST PartialResourceList; 50 ULONG Size; 51 52 if (!FindApmBios()) 53 return; 54 55 Size = sizeof(CM_PARTIAL_RESOURCE_LIST) - 56 sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); 57 58 /* Set 'Configuration Data' value */ 59 PartialResourceList = FrLdrHeapAlloc(Size, TAG_HW_RESOURCE_LIST); 60 if (PartialResourceList == NULL) 61 { 62 ERR("Failed to allocate resource descriptor\n"); 63 return; 64 } 65 RtlZeroMemory(PartialResourceList, Size); 66 PartialResourceList->Version = 0; 67 PartialResourceList->Revision = 0; 68 PartialResourceList->Count = 0; 69 70 /* FIXME: Add configuration data */ 71 72 /* Create new bus key */ 73 FldrCreateComponentKey(SystemKey, 74 AdapterClass, 75 MultiFunctionAdapter, 76 0x0, 77 0, 78 0xFFFFFFFF, 79 "APM", 80 PartialResourceList, 81 Size, 82 &BiosKey); 83 84 /* Increment bus number */ 85 (*BusNumber)++; 86 } 87 88 /* EOF */ 89