Annotation of qemu/roms/openbios/arch/ppc/mol/osi-blk.c, revision 1.1

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

unix.superglobalmegacorp.com

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