Annotation of qemu/roms/openbios/arch/unix/blk.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  <arch/unix/blk.c>
        !             3:  *
        !             4:  *     block device emulation for unix hosts
        !             5:  *
        !             6:  *   Copyright (C) 2004 Stefan Reinauer <[email protected]>
        !             7:  *
        !             8:  *   This program is free software; you can redistribute it and/or
        !             9:  *   modify it under the terms of the GNU General Public License
        !            10:  *   version 2
        !            11:  *
        !            12:  */
        !            13: 
        !            14: #include "config.h"
        !            15: #include "libopenbios/bindings.h"
        !            16: #include "blk.h"
        !            17: 
        !            18: typedef struct {
        !            19:        int     unit;
        !            20:        int     channel;
        !            21: } blk_data_t;
        !            22: 
        !            23: 
        !            24: DECLARE_NODE( blk, INSTALL_OPEN, sizeof(blk_data_t), "+/unix/block/disk" );
        !            25: 
        !            26: static void
        !            27: blk_open( blk_data_t *pb )
        !            28: {
        !            29:        phandle_t ph;
        !            30: 
        !            31:        fword("my-unit");
        !            32: 
        !            33:        pb->unit = POP();
        !            34:        pb->channel = 0;        /* FIXME */
        !            35: 
        !            36:        selfword("open-deblocker");
        !            37: 
        !            38:        /* interpose disk-label */
        !            39:        ph = find_dev("/packages/disk-label");
        !            40:        fword("my-args");
        !            41:        PUSH_ph( ph );
        !            42:        fword("interpose");
        !            43: 
        !            44:        /* printk("osi-blk: open %d\n", pb->unit ); */
        !            45: 
        !            46:        PUSH( -1 );
        !            47: }
        !            48: 
        !            49: static void
        !            50: blk_close( __attribute__((unused)) blk_data_t *pb )
        !            51: {
        !            52:        selfword("close-deblocker");
        !            53: }
        !            54: 
        !            55: 
        !            56: /* ( buf blk nblks -- actual ) */
        !            57: static void
        !            58: blk_read_blocks( blk_data_t *pb )
        !            59: {
        !            60:        cell i, n = POP();
        !            61:        cell blk = POP();
        !            62:        char *dest = (char*)POP();
        !            63: 
        !            64:        // printk("blk_read_blocks %x block=%d n=%d\n", (ucell)dest, blk, n );
        !            65: 
        !            66:        for( i=0; i<n; ) {
        !            67:                char buf[4096];
        !            68:                ucell m = MIN( n-i, sizeof(buf)/512 );
        !            69: 
        !            70:                if( read_from_disk(pb->channel, pb->unit, blk+i, (ucell)buf, m*512) < 0 ) {
        !            71:                        printk("read_from_disk: error\n");
        !            72:                        RET(0);
        !            73:                }
        !            74:                memcpy( dest, buf, m * 512 );
        !            75:                i += m;
        !            76:                dest += m * 512;
        !            77:        }
        !            78:        PUSH( n );
        !            79: }
        !            80: 
        !            81: /* ( -- bs ) */
        !            82: static void
        !            83: blk_block_size( __attribute__((unused)) blk_data_t *pb )
        !            84: {
        !            85:        PUSH( 512 );
        !            86: }
        !            87: 
        !            88: /* ( -- maxbytes ) */
        !            89: static void
        !            90: blk_max_transfer( __attribute__((unused)) blk_data_t *pb )
        !            91: {
        !            92:        PUSH( 1024*1024 );
        !            93: }
        !            94: 
        !            95: static void
        !            96: blk_initialize( __attribute__((unused)) blk_data_t *pb )
        !            97: {
        !            98:        fword("is-deblocker");
        !            99: }
        !           100: 
        !           101: 
        !           102: NODE_METHODS( blk ) = {
        !           103:        { NULL,                 blk_initialize  },
        !           104:        { "open",               blk_open        },
        !           105:        { "close",              blk_close       },
        !           106:        { "read-blocks",        blk_read_blocks },
        !           107:        { "block-size",         blk_block_size  },
        !           108:        { "max-transfer",       blk_max_transfer},
        !           109: };
        !           110: 
        !           111: void
        !           112: blk_init( void )
        !           113: {
        !           114:        REGISTER_NODE( blk );
        !           115: }

unix.superglobalmegacorp.com

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