[BACK]Return to smpprobe.c CVS log [TXT][DIR] Up to [local] / sys / arch / i386 / stand / libsa

Annotation of sys/arch/i386/stand/libsa/smpprobe.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: smpprobe.c,v 1.6 2004/03/09 19:12:13 tom Exp $        */
                      2:
                      3: /*
                      4:  * Copyright (c) 1997 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
                     18:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     19:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     20:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     21:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     22:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     24:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     25:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     26:  * SUCH DAMAGE.
                     27:  *
                     28:  */
                     29:
                     30: #include <sys/param.h>
                     31: #include <machine/biosvar.h>
                     32: #include "libsa.h"
                     33:
                     34: extern int debug;
                     35:
                     36: extern u_int cnvmem, extmem;
                     37: #define        MP_FLOAT_SIG    0x5F504D5F      /* _MP_ */
                     38: #define        MP_CONF_SIG     0x504D4350      /* PCMP */
                     39:
                     40: typedef struct _mp_float {
                     41:        u_int32_t signature;
                     42:        u_int32_t conf_addr;
                     43:        u_int8_t length;
                     44:        u_int8_t spec_rev;
                     45:        u_int8_t checksum;
                     46:        u_int8_t feature[5];
                     47: } mp_float_t;
                     48:
                     49:
                     50: static __inline int
                     51: mp_checksum(u_int8_t *ptr, int len)
                     52: {
                     53:        register int i, sum = 0;
                     54:
                     55: #ifdef DEBUG
                     56:        printf("Checksum %p for %d\n", ptr, len);
                     57: #endif
                     58:
                     59:        for (i = 0; i < len; i++)
                     60:                sum += *(ptr + i);
                     61:
                     62:        return (!(sum & 0xff));
                     63: }
                     64:
                     65:
                     66: static mp_float_t *
                     67: mp_probefloat(u_int8_t *ptr, int len)
                     68: {
                     69:        mp_float_t *mpp = NULL;
                     70:        int i;
                     71:
                     72: #ifdef DEBUG
                     73:        if (debug)
                     74:                printf("Checking %p for %d\n", ptr, len);
                     75: #endif
                     76:        for (i = 0; i < 1024; i++) {
                     77:                mp_float_t *tmp = (mp_float_t*)(ptr + i);
                     78:
                     79:                if (tmp->signature == MP_FLOAT_SIG) {
                     80:                        printf("Found possible MP signature at: %p\n", ptr);
                     81:
                     82:                        mpp = tmp;
                     83:                        break;
                     84:                }
                     85:                if ((tmp->signature == MP_FLOAT_SIG) &&
                     86:                    mp_checksum((u_int8_t *)tmp, tmp->length*16)) {
                     87: #ifdef DEBUG
                     88:                        if (debug)
                     89:                                printf("Found valid MP signature at: %p\n",
                     90:                                    ptr);
                     91: #endif
                     92:                        mpp = tmp;
                     93:                        break;
                     94:                }
                     95:        }
                     96:
                     97:        return mpp;
                     98: }
                     99:
                    100:
                    101: void
                    102: smpprobe(void)
                    103: {
                    104:        mp_float_t *mp = NULL;
                    105:
                    106:        /* Check EBDA */
                    107:        if (!(mp = mp_probefloat((void *)((*((u_int32_t*)0x4e)) * 16), 1024)) &&
                    108:                /* Check BIOS ROM 0xE0000 - 0xFFFFF */
                    109:            !(mp = mp_probefloat((void *)(0xE0000), 0x1FFFF)) &&
                    110:                /* Check last 1K of base RAM */
                    111:            !(mp = mp_probefloat((void *)(cnvmem * 1024), 1024)) &&
                    112:                /* Check last 1K of extended RAM XXX */
                    113:            !(mp = mp_probefloat((void *)(extmem * 1024 - 1024), 1024))) {
                    114:                /* No valid MP signature found */
                    115: #if DEBUG
                    116:                if (debug)
                    117:                        printf("No valid MP signature found.\n");
                    118: #endif
                    119:                return;
                    120:        }
                    121:
                    122:        /* Valid MP signature found */
                    123:        printf(" smp");
                    124:
                    125: #if DEBUG
                    126:        if (debug)
                    127:                printf("Floating Structure:\n"
                    128:                    "\tSignature: %x\n"
                    129:                    "\tConfig at: %x\n"
                    130:                    "\tLength: %d\n"
                    131:                    "\tRev: 1.%d\n"
                    132:                    "\tFeature: %x %x %x %x %x\n",
                    133:                    mp->signature, mp->conf_addr, mp->length, mp->spec_rev,
                    134:                    mp->feature[0], mp->feature[1], mp->feature[2],
                    135:                    mp->feature[3], mp->feature[4]);
                    136: #endif
                    137: }

CVSweb