From daf90fcb1ba193cf77c6980ede34ed072cf2d3b9 Mon Sep 17 00:00:00 2001 From: Michael Shalayeff Date: Wed, 13 Aug 1997 03:23:40 +0000 Subject: inline calls --- sys/arch/i386/stand/libsa/machdep.c | 152 ++++++++++++++++++++++++------------ 1 file changed, 102 insertions(+), 50 deletions(-) (limited to 'sys/arch/i386/stand/libsa/machdep.c') diff --git a/sys/arch/i386/stand/libsa/machdep.c b/sys/arch/i386/stand/libsa/machdep.c index 8adffedd699..a2e9d907eae 100644 --- a/sys/arch/i386/stand/libsa/machdep.c +++ b/sys/arch/i386/stand/libsa/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.8 1997/08/12 21:51:30 mickey Exp $ */ +/* $OpenBSD: machdep.c,v 1.9 1997/08/13 03:23:39 mickey Exp $ */ /* * Copyright (c) 1997 Michael Shalayeff @@ -32,69 +32,120 @@ * */ +/* + * If you want to know the specification of APM BIOS, see the following + * documentations, + * + * [1] Intel Corporation and Microsoft Corporation, "Advanced Power + * Management, The Next Generation, Version 1.0", Feb.,1992. + * + * [2] Intel Corporation and Microsoft Corporation, "Advanced Power + * Management (APM) BIOS Interface Specification Revision 1.1", + * Sep.,1993, Intel Order Number: 241704-001, Microsoft Part + * Number: 781-110-X01 + * + * or contact + * + * APM Support Desk (Intel Corporation, US) + * TEL: (800)628-8686 + * FAX: (916)356-6100. + */ + #include "libsa.h" -#include #include +#undef APM_DISCONNECT /* XXX temp hack */ +#include #include "debug.h" struct apm_connect_info apminfo; -void -machdep() -{ #ifdef DEBUG - *(u_int16_t*)0xb8148 = 0x4730; +#define CKPT(c) (*(u_int16_t*)0xb8148 = 0x4700 + (c)) +#else +#define CKPT(c) /* c */ #endif - gateA20(1); + +#ifdef BOOT_APM +static u_int +apm_init() +{ + u_int detail; + u_int8_t f; + __asm __volatile(DOINT(0x15) "\n\t" + "setc %b0\n\t" + "shll $16, %%ecx\n\t" + "movzwl %%ax, %1\n\t" + "orl %%ecx, %1" + : "=d" (f), "=a" (detail) + : "1" (APM_INSTCHECK), "b" (PMDV_APMBIOS) + : "%ecx", "cc"); + if (f || BIOS_regs.biosr_bx != 0x504d /* "PM" */ ) { #ifdef DEBUG - *(u_int16_t*)0xb8148 = 0x4731; + printf("apm_init: %x, %x, %x\n", f, BIOS_regs.biosr_bx, detail); #endif - debug_init(); -#ifdef DEBUG - *(u_int16_t*)0xb8148 = 0x4732; + return 0; + } else + return detail; +} + +static __inline int +apm_disconnect() { + register u_int16_t rv; + __asm __volatile(DOINT(0x15) "\n\t" + "setc %b0" + : "=a" (rv) + : "a" (APM_DISCONNECT), "b" (PMDV_APMBIOS) + : "%ecx", "%edx", "cc"); + return (rv & 0xff)? rv >> 8 : 0; +} + +static __inline int +apm_connect(struct apm_connect_info *apminfo) +{ + register u_int16_t f; + __asm __volatile (DOINT(0x15) "\n\t" + "setc %b0\n\t" + "movb %%ah, %h0\n\t" + "movzwl %%ax, %%eax\n\tshll $4, %1\n\t" + "movzwl %%cx, %%ecx\n\tshll $4, %2\n\t" + "movzwl %%dx, %%edx\n\tshll $4, %3\n\t" + : "=b" (f), + "=a" (apminfo->apm_code32_seg_base), + "=c" (apminfo->apm_code16_seg_base), + "=d" (apminfo->apm_data_seg_base) + : "a" (APM_PROT32CONNECT), "b" (PMDV_APMBIOS) + : "cc"); + apminfo->apm_entrypt = BIOS_regs.biosr_bx; +#if 0 + apminfo->apm_code32_seg_len = BIOS_regs.biosr_si & 0xffff; + apminfo->apm_data_seg_len = BIOS_regs.biosr_di & 0xffff; +#else + apminfo->apm_code32_seg_len = 0x10000; + apminfo->apm_data_seg_len = 0x10000; #endif - cninit(); /* call console init before doing any io */ -#ifdef DEBUG - *(u_int16_t*)0xb8148 = 0x4733; + return (f & 0xff)? f >> 8 : 0; +} #endif + +void +machdep() +{ + /* here */ CKPT('0'); + gateA20(1); CKPT('1'); + debug_init(); CKPT('2'); + /* call console init before doing any io */ + cninit(); CKPT('3'); #ifndef _TEST - memprobe(); + memprobe(); CKPT('4'); #endif -#ifdef DEBUG - *(u_int16_t*)0xb8148 = 0x4f34; -#endif -#ifdef BOOT_APM - printf("apm_init: "); - switch(apminfo.apm_detail = apm_init()) { - case APMINI_CANTFIND: - printf("not supported"); - break; - - case APMINI_NOT32BIT: - printf("no 32 bit interface"); - break; - - case APMINI_CONNECTERR: - printf("connect error"); - break; - case APMINI_BADVER: - printf("bad version"); - break; +#ifdef BOOT_APM + if ((apminfo.apm_detail = apm_init())) { - default: - /* valid: detail, dx, bx */ - apminfo.apm_code32_seg_base = (BIOS_regs.biosr_ax & 0xffff)<< 4; - apminfo.apm_code16_seg_base = (BIOS_regs.biosr_cx & 0xffff)<< 4; - apminfo.apm_data_seg_base = (BIOS_regs.biosr_dx & 0xffff)<< 4; -#if 0 - apminfo.apm_code32_seg_len = BIOS_regs.biosr_si & 0xffff; - apminfo.apm_data_seg_len = BIOS_regs.biosr_di & 0xffff; -#else - apminfo.apm_code32_seg_len = 0x10000; - apminfo.apm_data_seg_len = 0x10000; -#endif - apminfo.apm_entrypt = BIOS_regs.biosr_bx; + printf("apm: "); + apm_disconnect(); + if (apm_connect(&apminfo) != 0) + printf("connect error\n"); #ifdef DEBUG printf("%x text=%x/%x[%x] data=%x[%x] @ %x", apminfo.apm_detail, @@ -105,9 +156,10 @@ machdep() apminfo.apm_data_seg_len, apminfo.apm_entrypt); #else - printf("APM detected"); + printf("present"); #endif + putchar('\n'); } - putchar('\n'); #endif + CKPT('9'); } -- cgit v1.2.3