Annotation of coherent/d/conf/tboot/l.out.c, revision 1.1.1.1

1.1       root        1: /* l.out.c -- routines for manipulating l.out executable files.  */
                      2: 
                      3: #include <l.out.h>
                      4: #include <canon.h>
                      5: #include <sys/types.h>
                      6: 
                      7: #include "tboot.h"
                      8: 
                      9: /* Convert l.out to load table.
                     10:  * Used to generate loading instructions for use by tboot main().
                     11:  * Returns true on successful translation.
                     12:  */
                     13: 
                     14: int
                     15: lout2load(ip, table, data_seg)
                     16:        struct inode *ip;               /* input: File to read.         */
                     17:        struct load_segment table[];    /* output: How to read it.      */
                     18:        uint16 *data_seg;       /* output: Where to point es.   */
                     19: {
                     20:        int i;                          /* Loop counter.  */
                     21:        struct ldheader imageheader;    /* l.out header for boot image.  */
                     22: 
                     23:        VERBOSE( puts("Reading the l.out header.\r\n"); );
                     24: 
                     25:        /* Read the header.  */
                     26:        iread(ip, &imageheader,
                     27:              (fsize_t) 0, (uint16) sizeof(struct ldheader));
                     28: 
                     29: 
                     30:        /* Canonicalize the header.  */
                     31:        canint(imageheader.l_magic);
                     32:        canint(imageheader.l_flag);
                     33:        canint(imageheader.l_machine);
                     34:        canvaddr(imageheader.l_entry);
                     35:        for(i = 0; i < NLSEG; ++i) {
                     36:                cansize(imageheader.l_ssize[i]);
                     37:        }
                     38: 
                     39:        /* Copy the l.out header info into table.  */
                     40: 
                     41: #define L_TEXT table[0]
                     42: #define L_DATA table[1]
                     43:        /* Calculate remaining entries.  */
                     44:        if (imageheader.l_flag & LF_SEP) { /* if sep i/d executable */
                     45:                VERBOSE( puts("Generating table for sep i/d l.out.\r\n"); );
                     46:                L_TEXT.valid = (1==1);
                     47:                L_TEXT.message = "\r\nLoading 286 COHERENT...\r\n";
                     48:                /* Load the shared and private code segments as one.  */
                     49:                L_TEXT.load_toseg = sys_base; /* This is where we want the OS.  */
                     50:                L_TEXT.load_tooffset = 0;
                     51:                L_TEXT.load_offset = sizeof(struct ldheader); /* Skip the header.  */
                     52:                L_TEXT.load_length = imageheader.l_ssize[L_SHRI] + /* Both segments as one.  */
                     53:                              imageheader.l_ssize[L_PRVI];
                     54: 
                     55:                
                     56:                L_DATA.valid = (1==1);
                     57:                L_DATA.message = "\r\nLoading 286 COHERENT data...\r\n";
                     58:                /* Load both data segments.  */
                     59: 
                     60:                /* Round up to next 16 byte paragraph.  */
                     61:                L_DATA.load_toseg = (sys_base +
                     62:                        (imageheader.l_ssize[L_SHRI] + /* Shared code */
                     63:                        imageheader.l_ssize[L_PRVI] +  /* Private code */
                     64:                        15) / 16);
                     65:                L_DATA.load_tooffset = 0;
                     66:                L_DATA.load_offset = (fsize_t) sizeof(struct ldheader) + /* l.out header */
                     67:                        imageheader.l_ssize[L_SHRI] + /* Shared code */
                     68:                        imageheader.l_ssize[L_PRVI]; /* Private code */
                     69:                L_DATA.load_length = imageheader.l_ssize[L_SHRD] + /* Both segments as one.  */
                     70:                        imageheader.l_ssize[L_PRVD];
                     71: 
                     72:                table[2].valid = (1==2);        /* Terminate the list.  */
                     73:                
                     74:                *data_seg = (uint16) (sys_base +
                     75:                        (imageheader.l_ssize[L_SHRI] +  /* Shared code */
                     76:                         imageheader.l_ssize[L_PRVI] +  /* Private code */
                     77:                         15) / 16);     /* Rounded up a paragraph.  */
                     78: 
                     79:        } else { /* if not sep i/d executable */
                     80: #define SEGMENT table[0]
                     81:                
                     82:                VERBOSE( puts("Generating table for non-sep i/d l.out.\r\n"); );
                     83: 
                     84:                SEGMENT.valid = (1==1);
                     85:                SEGMENT.message = "\r\nLoading ancient COHERENT...\r\n";
                     86:                /* Load the shared and private code segments as one.  */
                     87:                SEGMENT.load_toseg = sys_base; /* This is where we      */
                     88:                SEGMENT.load_tooffset = 0;      /* want the OS.         */
                     89:                /* Skip the header.  */
                     90:                SEGMENT.load_offset = (fsize_t) sizeof(struct ldheader);
                     91:                /* Load all segments as one.  */
                     92:                SEGMENT.load_length = imageheader.l_ssize[L_SHRI] +
                     93:                       imageheader.l_ssize[L_PRVI] +
                     94:                       imageheader.l_ssize[L_SHRD] +
                     95:                       imageheader.l_ssize[L_PRVD];
                     96: 
                     97:                table[1].valid = (1==2);        /* Terminate the list.  */
                     98: 
                     99:                /* Tiny model: ds = cs */
                    100:                *data_seg = sys_base;
                    101:        } /* if not sep i/d executable */
                    102: 
                    103:        return (1==1);
                    104: }
                    105: 
                    106: 
                    107: /*
                    108:  * Wrapper for l_out_nlist() to make it look palitable.
                    109:  */
                    110: unsigned int
                    111: wrap_l_out_nlist(filename, symbol)
                    112:        char *filename;
                    113:        char *symbol;
                    114: {
                    115:        struct nlist nlp[2];    /* For talking with l_out_nlist().  */
                    116: 
                    117:        strcpy(nlp[0].n_name, symbol);
                    118:        strcat(nlp[0].n_name, "_");
                    119:        nlp[1].n_name[0] = '\0';
                    120:        l_out_nlist(filename, nlp);
                    121:        return( nlp[0].n_value );
                    122: }
                    123: 
                    124: /*
                    125:  * Get entries from l.out name list.
                    126:  */
                    127: void
                    128: l_out_nlist(fn, nlp)
                    129: char *fn;
                    130: struct nlist *nlp;
                    131: {
                    132:        register struct nlist *np;
                    133:        register int ntodo = 0;
                    134:        int lfp;
                    135:        struct ldheader lh;
                    136:        struct ldsym ste;
                    137:        fsize_t symsize;
                    138:        register int n;
                    139: 
                    140:        for (np = nlp; np->n_name[0] != '\0'; np++) {
                    141:                np->n_type = np->n_value = 0;
                    142:                ntodo++;
                    143:        }
                    144:        
                    145:        if ((lfp = open(fn, 0)) == -1)
                    146:                return;
                    147: 
                    148: 
                    149:        n = read(lfp, &lh, sizeof lh);
                    150: 
                    151:        canint(lh.l_magic);
                    152:        if (n!=sizeof(lh) || lh.l_magic!=L_MAGIC) {
                    153:                puts("L.out bad MAGIC.\r\n");
                    154:                close(lfp);
                    155:                return;
                    156:        }
                    157:        for (n=0; n<=L_SYM; n++)
                    158:                cansize(lh.l_ssize[n]);
                    159:        symsize = sizeof lh + lh.l_ssize[L_SHRI] + lh.l_ssize[L_SHRD]
                    160:            + lh.l_ssize[L_PRVI] + lh.l_ssize[L_PRVD] + lh.l_ssize[L_DEBUG];
                    161:        lseek(lfp, symsize, 0);
                    162:        symsize = lh.l_ssize[L_SYM];
                    163:        for ( ; symsize>0 && ntodo; symsize -= sizeof ste) {
                    164:                if (read(lfp, &ste, sizeof ste) != sizeof(ste))
                    165:                        break;
                    166:                for (np = nlp; np->n_name[0] != '\0'; np++)
                    167:                        if (strncmp(np->n_name, ste.ls_id, NCPLN) == 0) {
                    168:                                canint(ste.ls_type);
                    169:                                canvaddr(ste.ls_addr);
                    170:                                np->n_type = ste.ls_type;
                    171:                                np->n_value = ste.ls_addr;
                    172:                                if (--ntodo == 0)
                    173:                                        break;
                    174:                        }
                    175:        }
                    176:        close(lfp);
                    177: }

unix.superglobalmegacorp.com

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