Annotation of Net2/arch/i386/netboot/misc.c, revision 1.1.1.1

1.1       root        1: /* netboot
                      2:  *
                      3:  * misc.c,v
                      4:  * Revision 1.1  1993/07/08  16:04:03  brezak
                      5:  * Diskless boot prom code from Jim McKim ([email protected])
                      6:  *
                      7:  * Revision 1.3  1993/06/30  20:17:54  mckim
                      8:  * Exit to BIOS in exit().
                      9:  *
                     10:  * Revision 1.2  1993/06/08  14:22:37  mckim
                     11:  * Fast in line assembly bcopy(), bzero().
                     12:  *
                     13:  * Revision 1.1.1.1  1993/05/28  11:41:07  mckim
                     14:  * Initial version.
                     15:  *
                     16:  */
                     17: 
                     18: #include "proto.h"
                     19: 
                     20: #if defined(DEBUG)
                     21: 
                     22: void
                     23: DUMP_STRUCT(char *s, u_char *p, u_int ps) {
                     24:   int i;
                     25:   printf("struct %s (@0x%x %d bytes): ", s, p, ps);
                     26:   for (i=0; i<ps; i++)
                     27:     printf("%x ", *(p+i));
                     28:   printf("\n");
                     29: }
                     30: 
                     31: #else
                     32: 
                     33: void
                     34: DUMP_STRUCT(char *s, u_char *p, u_int ps) {
                     35: }
                     36: 
                     37: 
                     38: #endif
                     39: 
                     40: 
                     41: char *
                     42: strncpy(char *dst, const char *src, int len) {
                     43:   char *p=dst;
                     44:   while (*src && len--)
                     45:     *p++ = *src++;
                     46:   *p = 0;
                     47:   return dst;
                     48: }
                     49: 
                     50: 
                     51: int
                     52: strlen(const char *s) {
                     53:   int len = 0;
                     54:   while (*s++)
                     55:     len++;
                     56:   return len;
                     57: }
                     58: 
                     59: 
                     60: char *
                     61: strncat(char *s, const char *append, int len) {
                     62:   int offset = strlen(s);
                     63:   strncpy(s+offset, append, len);
                     64:   return s;
                     65: }
                     66: 
                     67: 
                     68: int
                     69: strcmp(const char *s, const char *t) {
                     70:   while (*s == *t++)
                     71:     if (*s++ == '\0')
                     72:       return 0;
                     73:   return *s - *--t;
                     74: }
                     75: 
                     76: 
                     77: int
                     78: bcmp(const void *p, const void *q, int len) {
                     79:   while (len--)
                     80:     if (*((const char *)p)++ != *((const char *)q)++)
                     81:       return 1;
                     82:   return 0;
                     83: }
                     84: 
                     85: 
                     86: void volatile exit(int v) {
                     87: #ifdef DEBUG
                     88:   L: goto L;
                     89: #else
                     90:   ExitToBios();
                     91: #endif
                     92: }
                     93: 
                     94: 
                     95: #define RTC_ADDR 0x70
                     96: #define RTC_DATA 0x71
                     97: 
                     98: #define RTC_SECONDS 0x00
                     99: #define RTC_MINUTES 0x02
                    100: #define RTC_HOURS 0x04
                    101: #define RTC_STATUS_A 0x0a
                    102: #define RTC_BASEMEM_LO 0x15
                    103: #define RTC_BASEMEM_HI 0x16
                    104: #define RTC_EXPMEM_LO 0x30
                    105: #define RTC_EXPMEM_HI 0x31
                    106: 
                    107: static u_char
                    108: ReadRtcRam(u_short addr) {
                    109:   for (;;) {
                    110:     /* wait if updating */
                    111:     outb(RTC_ADDR, RTC_STATUS_A);
                    112:     if (!(inb(RTC_DATA) & 0x80))
                    113:       break;
                    114:   }
                    115:   outb(RTC_ADDR, addr);
                    116:   return inb(RTC_DATA);
                    117: }
                    118: 
                    119: static void
                    120: getrtc(u_long *hrs, u_long *mins, u_long *secs) {
                    121: /* TBD - replace args with single arg - struct or sec of day */
                    122:   /*
                    123:    * Get real time clock values (they are in BCD)
                    124:    */
                    125: #ifdef USE_BIOS
                    126:   asm("
                    127:        call    _prot_to_real
                    128:        movb    $0x02,%ah               # read real time clock
                    129:        int     $0x1a
                    130:        .byte   0x66
                    131:        call    _real_to_prot
                    132: 
                    133:        xor     %eax, %eax
                    134:        movb    %dh, %al
                    135:        mov     %%eax, %0
                    136:        movb    %cl, %al
                    137:        mov     %eax, %1
                    138:        movb    %ch, %al
                    139:        mov     %eax, %2
                    140:        " : "=g" (secs), "=g" (mins), "=g" (hrs));
                    141: #else
                    142:   *secs = ReadRtcRam(RTC_SECONDS);
                    143:   *mins = ReadRtcRam(RTC_MINUTES);
                    144:   *hrs = ReadRtcRam(RTC_HOURS);
                    145: #endif
                    146: }
                    147: 
                    148: static inline u_long
                    149: bcd2dec(u_long arg) {
                    150:   return ((arg & 0xF0) >> 4) * 10 + (arg & 0x0F);
                    151: }
                    152: 
                    153: 
                    154: u_long
                    155: timer(void) {
                    156: /* TBD - replace with StartCountdown()/CountdownAtZero() routines,
                    157:    isolate the span-midnight problem to inside these routines
                    158:    */
                    159:   /*
                    160:    * Return the current time in seconds
                    161:    */
                    162: 
                    163:   u_long sec, min, hour;
                    164: 
                    165:   /* BIOS time is stored in bcd */
                    166:   getrtc(&hour, &min, &sec);
                    167:   sec = bcd2dec(sec);
                    168:   min = bcd2dec(min);
                    169:   hour = bcd2dec(hour);
                    170: #if 0
                    171: printe("time h%d m%d s%d = sum%d\n", hour, min, sec, hour * 3600L + min * 60L + sec);
                    172: #endif
                    173:   return hour * 3600L + min * 60L + sec;
                    174: }
                    175: 
                    176: /*
                    177:  * Simple random generator
                    178:  */
                    179: static u_long next = 1;
                    180: 
                    181: void
                    182: srand(u_int seed) {
                    183:   next = seed;
                    184: }
                    185: 
                    186: int
                    187: rand(void) {
                    188:   next = next * 1103515245L + 12345;
                    189:   return (u_int)(next / 65536) % 32768;
                    190: }
                    191: 
                    192: u_short
                    193: GetMemSize(u_short s) {
                    194: #ifdef USE_BIOS
                    195:   u_short result;
                    196:   asm("
                    197:        push    %%ebx
                    198:        mov     %1, %%ebx
                    199:        call    _prot_to_real
                    200:        cmpb    $0x1, %%bl
                    201:        .byte   0x66
                    202:        je      1f      
                    203:        sti
                    204:        int     $0x12
                    205:        cli
                    206:        .byte   0x66
                    207:        jmp     2f
                    208: 1:     movb    $0x88, %%ah
                    209:        sti
                    210:        int     $0x15
                    211:        cli
                    212: 2:     mov     %%eax, %%ebx
                    213:        .byte   0x66
                    214:        call    _real_to_prot
                    215:        mov     %%bx, %0
                    216:        pop     %%ebx
                    217:        " : "=g" (result) : "g" (s));
                    218:   return result;
                    219: #else
                    220:   u_long result;
                    221:   if (s)
                    222:     result = ((u_long)ReadRtcRam(RTC_EXPMEM_HI)<<8) + ReadRtcRam(RTC_EXPMEM_LO);
                    223:   else
                    224:     result = ((u_long)ReadRtcRam(RTC_BASEMEM_HI)<<8) + ReadRtcRam(RTC_BASEMEM_LO);
                    225:   return result;
                    226: #endif
                    227: }
                    228: 
                    229: void
                    230: ResetCpu(void) {
                    231: #ifdef USE_BIOS
                    232:   asm("
                    233:        call    _prot_to_real           # enter real mode
                    234:        int     $0x19
                    235:        " );
                    236: #else
                    237:   while (inb(0x64)&2); /* wait input ready */
                    238:   outb(0x64, 0xFE);    /* Reset Command */
                    239: #endif
                    240: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.