|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.