Annotation of qemu/roms/openbios/libopenbios/fcode_load.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * FCode boot loader
        !             3:  */
        !             4: 
        !             5: #include "config.h"
        !             6: #include "kernel/kernel.h"
        !             7: #include "libopenbios/bindings.h"
        !             8: #include "libopenbios/fcode_load.h"
        !             9: #include "libopenbios/sys_info.h"
        !            10: #include "libc/diskio.h"
        !            11: #define printf printk
        !            12: #define debug printk
        !            13: 
        !            14: static int fd;
        !            15: 
        !            16: int 
        !            17: is_fcode(unsigned char *fcode)
        !            18: {
        !            19:        return (fcode[0] == 0xf0        // start0
        !            20:                || fcode[0] == 0xf1     // start1 
        !            21:                || fcode[0] == 0xf2     // start2
        !            22:                || fcode[0] == 0xf3     // start4
        !            23:                || fcode[0] == 0xfd);   // version1
        !            24: }
        !            25: 
        !            26: int 
        !            27: fcode_load(ihandle_t dev)
        !            28: {
        !            29:     int retval = -1;
        !            30:     uint8_t fcode_header[8];
        !            31:     unsigned long start, size;
        !            32:     unsigned int offset;
        !            33: 
        !            34:     /* Mark the saved-program-state as invalid */
        !            35:     feval("0 state-valid !");
        !            36: 
        !            37:     fd = open_ih(dev);
        !            38:     if (fd == -1) {
        !            39:         goto out;
        !            40:     }
        !            41: 
        !            42:     for (offset = 0; offset < 16 * 512; offset += 512) {
        !            43:         seek_io(fd, offset);
        !            44:         if (read_io(fd, &fcode_header, sizeof(fcode_header))
        !            45:             != sizeof(fcode_header)) {
        !            46:             debug("Can't read FCode header from ihandle " FMT_ucellx "\n", dev);
        !            47:             retval = LOADER_NOT_SUPPORT;
        !            48:             goto out;
        !            49:         }
        !            50: 
        !            51:        if (is_fcode(fcode_header))
        !            52:             goto found;
        !            53:     }
        !            54: 
        !            55:     debug("Not a bootable FCode image\n");
        !            56:     retval = LOADER_NOT_SUPPORT;
        !            57:     goto out;
        !            58: 
        !            59:  found:
        !            60:     size = (fcode_header[4] << 24) | (fcode_header[5] << 16) |
        !            61:         (fcode_header[6] << 8) | fcode_header[7];
        !            62: 
        !            63:     fword("load-base");
        !            64:     start = POP();
        !            65: 
        !            66:     printf("\nLoading FCode image...\n");
        !            67: 
        !            68:     seek_io(fd, offset);
        !            69: 
        !            70:     if ((size_t)read_io(fd, (void *)start, size) != size) {
        !            71:         printf("Can't read file (size 0x%lx)\n", size);
        !            72:         goto out;
        !            73:     }
        !            74: 
        !            75:     debug("Loaded %lu bytes\n", size);
        !            76:     debug("entry point is %#lx\n", start);
        !            77:     
        !            78:     // Initialise saved-program-state
        !            79:     PUSH(start);
        !            80:     feval("saved-program-state >sps.entry !");
        !            81:     PUSH(size);
        !            82:     feval("saved-program-state >sps.file-size !");
        !            83:     feval("fcode saved-program-state >sps.file-type !");
        !            84: 
        !            85:     feval("-1 state-valid !");
        !            86: 
        !            87: out:
        !            88:     close_io(fd);
        !            89:     return retval;
        !            90: }
        !            91: 
        !            92: void 
        !            93: fcode_init_program(void)
        !            94: {
        !            95:        /* If the payload is Fcode then we execute it immediately */
        !            96:        ucell address;
        !            97:        uint8_t fcode_header[8];
        !            98: 
        !            99:        fword("load-base");
        !           100:        address = POP();
        !           101: 
        !           102:        if (!is_fcode((unsigned char *)address)) {
        !           103:                debug("Not a valid Fcode memory image\n");
        !           104:                return;
        !           105:        }
        !           106: 
        !           107:        PUSH(address + sizeof(fcode_header));
        !           108:        PUSH(1);
        !           109:        fword("byte-load");
        !           110: }

unix.superglobalmegacorp.com

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