Annotation of coherent/d/conf/old_tboot/l.out.c, revision 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: #ifdef VERBOSE
        !            24:        puts("Reading the l.out header.\r\n");
        !            25: #endif /* VERBOSE */
        !            26: 
        !            27:        /* Read the header.  */
        !            28:        iread(ip, &imageheader,
        !            29:              (fsize_t) 0, (uint16) sizeof(struct ldheader));
        !            30: 
        !            31: 
        !            32:        /* Canonicalize the header.  */
        !            33:        canint(imageheader.l_magic);
        !            34:        canint(imageheader.l_flag);
        !            35:        canint(imageheader.l_machine);
        !            36:        canvaddr(imageheader.l_entry);
        !            37:        for(i = 0; i < NLSEG; ++i) {
        !            38:                cansize(imageheader.l_ssize[i]);
        !            39:        }
        !            40: 
        !            41:        /* Copy the l.out header info into table.  */
        !            42: 
        !            43: #define L_TEXT table[0]
        !            44: #define L_DATA table[1]
        !            45:        /* Calculate remaining entries.  */
        !            46:        if (imageheader.l_flag & LF_SEP) { /* if sep i/d executable */
        !            47: #ifdef VERBOSE
        !            48:                puts("Generating table for sep i/d l.out.\r\n");
        !            49: #endif /* VERBOSE */
        !            50:                L_TEXT.valid = (1==1);
        !            51:                L_TEXT.message = "\r\nLoading l.out code segments...\r\n";
        !            52:                /* Load the shared and private code segments as one.  */
        !            53:                L_TEXT.load_toseg = sys_base; /* This is where we want the OS.  */
        !            54:                L_TEXT.load_tooffset = 0;
        !            55:                L_TEXT.load_offset = sizeof(struct ldheader); /* Skip the header.  */
        !            56:                L_TEXT.load_length = imageheader.l_ssize[L_SHRI] + /* Both segments as one.  */
        !            57:                              imageheader.l_ssize[L_PRVI];
        !            58: 
        !            59:                
        !            60:                L_DATA.valid = (1==1);
        !            61:                L_DATA.message = "\r\nLoading l.out data segments...\r\n";
        !            62:                /* Load both data segments.  */
        !            63: 
        !            64:                /* Round up to next 16 byte paragraph.  */
        !            65:                L_DATA.load_toseg = (sys_base +
        !            66:                        (imageheader.l_ssize[L_SHRI] + /* Shared code */
        !            67:                        imageheader.l_ssize[L_PRVI] +  /* Private code */
        !            68:                        15) / 16);
        !            69:                L_DATA.load_tooffset = 0;
        !            70:                L_DATA.load_offset = (fsize_t) sizeof(struct ldheader) + /* l.out header */
        !            71:                        imageheader.l_ssize[L_SHRI] + /* Shared code */
        !            72:                        imageheader.l_ssize[L_PRVI]; /* Private code */
        !            73:                L_DATA.load_length = imageheader.l_ssize[L_SHRD] + /* Both segments as one.  */
        !            74:                        imageheader.l_ssize[L_PRVD];
        !            75: 
        !            76:                table[2].valid = (1==2);        /* Terminate the list.  */
        !            77:                
        !            78:                *data_seg = (uint16) (sys_base +
        !            79:                        (imageheader.l_ssize[L_SHRI] +  /* Shared code */
        !            80:                         imageheader.l_ssize[L_PRVI] +  /* Private code */
        !            81:                         15) / 16);     /* Rounded up a paragraph.  */
        !            82: 
        !            83:        } else { /* if not sep i/d executable */
        !            84: #define SEGMENT table[0]
        !            85:                
        !            86: #ifdef VERBOSE
        !            87:                puts("Generating table for non-sep i/d l.out.\r\n");
        !            88: #endif /* VERBOSE */
        !            89: 
        !            90:                SEGMENT.valid = (1==1);
        !            91:                SEGMENT.message = "\r\nLoading all l.out segments...\r\n";
        !            92:                /* Load the shared and private code segments as one.  */
        !            93:                SEGMENT.load_toseg = sys_base; /* This is where we      */
        !            94:                SEGMENT.load_tooffset = 0;      /* want the OS.         */
        !            95:                /* Skip the header.  */
        !            96:                SEGMENT.load_offset = (fsize_t) sizeof(struct ldheader);
        !            97:                /* Load all segments as one.  */
        !            98:                SEGMENT.load_length = imageheader.l_ssize[L_SHRI] +
        !            99:                       imageheader.l_ssize[L_PRVI] +
        !           100:                       imageheader.l_ssize[L_SHRD] +
        !           101:                       imageheader.l_ssize[L_PRVD];
        !           102: 
        !           103:                table[1].valid = (1==2);        /* Terminate the list.  */
        !           104: 
        !           105:                /* Tiny model: ds = cs */
        !           106:                *data_seg = sys_base;
        !           107:        } /* if not sep i/d executable */
        !           108: 
        !           109:        return (1==1);
        !           110: }
        !           111: 
        !           112: 
        !           113: /*
        !           114:  * Get entries from l.out name list.
        !           115:  */
        !           116: 
        !           117: void
        !           118: l_out_nlist(fn, nlp)
        !           119: char *fn;
        !           120: struct nlist *nlp;
        !           121: {
        !           122:        register struct nlist *np;
        !           123:        register int ntodo = 0;
        !           124:        int lfp;
        !           125:        struct ldheader lh;
        !           126:        struct ldsym ste;
        !           127:        fsize_t symsize;
        !           128:        register int n;
        !           129: 
        !           130:        for (np = nlp; np->n_name[0] != '\0'; np++) {
        !           131:                np->n_type = np->n_value = 0;
        !           132:                ntodo++;
        !           133:        }
        !           134:        
        !           135:        if ((lfp = open(fn, 0)) == -1)
        !           136:                return;
        !           137: 
        !           138: 
        !           139:        n = read(lfp, &lh, sizeof lh);
        !           140: 
        !           141:        canint(lh.l_magic);
        !           142:        if (n!=sizeof(lh) || lh.l_magic!=L_MAGIC) {
        !           143:                puts("L.out bad MAGIC.\r\n");
        !           144:                close(lfp);
        !           145:                return;
        !           146:        }
        !           147:        for (n=0; n<=L_SYM; n++)
        !           148:                cansize(lh.l_ssize[n]);
        !           149:        symsize = sizeof lh + lh.l_ssize[L_SHRI] + lh.l_ssize[L_SHRD]
        !           150:            + lh.l_ssize[L_PRVI] + lh.l_ssize[L_PRVD] + lh.l_ssize[L_DEBUG];
        !           151:        lseek(lfp, symsize, 0);
        !           152:        symsize = lh.l_ssize[L_SYM];
        !           153:        for ( ; symsize>0 && ntodo; symsize -= sizeof ste) {
        !           154:                if (read(lfp, &ste, sizeof ste) != sizeof(ste))
        !           155:                        break;
        !           156:                for (np = nlp; np->n_name[0] != '\0'; np++)
        !           157:                        if (strncmp(np->n_name, ste.ls_id, NCPLN) == 0) {
        !           158:                                canint(ste.ls_type);
        !           159:                                canvaddr(ste.ls_addr);
        !           160:                                np->n_type = ste.ls_type;
        !           161:                                np->n_value = ste.ls_addr;
        !           162:                                if (--ntodo == 0)
        !           163:                                        break;
        !           164:                        }
        !           165:        }
        !           166:        close(lfp);
        !           167: }

unix.superglobalmegacorp.com

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