root/arch/i386/stand/libsa/biosprobe.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. getSYSCONFaddr
  2. getEBDAaddr

    1 /*      $OpenBSD: biosprobe.c,v 1.4 2004/03/09 19:12:12 tom Exp $       */
    2 
    3 /*
    4  * Copyright (c) 2002 Tobias Weingartner
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   26  */
   27 
   28 #include <sys/param.h>
   29 #include <machine/biosvar.h>
   30 #include <machine/pio.h>
   31 #include <dev/cons.h>
   32 #include <sys/disklabel.h>
   33 #include "disk.h"
   34 #include "debug.h"
   35 #include "libsa.h"
   36 #include "biosdev.h"
   37 
   38 
   39 void *
   40 getSYSCONFaddr(void)
   41 {
   42         u_int32_t status;
   43         u_int8_t *vers;
   44 
   45         __asm __volatile(DOINT(0x15) "\n\t"
   46             "setc %%al\n\t"
   47             : "=a" (status)
   48             : "0" (0xC000)
   49             : "%ebx", "%ecx", "%edx", "%esi", "%edi", "cc");
   50 
   51         /* On failure we go for a NULL */
   52         if (status)
   53                 return NULL;
   54 
   55         /* Calculate where the version bytes are */
   56         vers = (void*)((BIOS_regs.biosr_es << 4) | BIOS_regs.biosr_bx);
   57         return vers;
   58 }
   59 
   60 void *
   61 getEBDAaddr(void)
   62 {
   63         u_int32_t status;
   64         u_int8_t *info;
   65 
   66         info = getSYSCONFaddr();
   67 
   68         if (!info)
   69                 return NULL;
   70 
   71         __asm __volatile(DOINT(0x15) "\n\t"
   72             "setc %%al"
   73             : "=a" (status)
   74             : "0" (0xC100)
   75             : "%ebx", "%ecx", "%edx", "%esi", "%edi", "cc");
   76 
   77         if (status)
   78                 return NULL;
   79 
   80         info = (void *)(BIOS_regs.biosr_es << 4);
   81 
   82         return info;
   83 }

/* [<][>][^][v][top][bottom][index][help] */