|
|
1.1 root 1: \ *****************************************************************************
2: \ * Copyright (c) 2011 IBM Corporation
3: \ * All rights reserved.
4: \ * This program and the accompanying materials
5: \ * are made available under the terms of the BSD License
6: \ * which accompanies this distribution, and is available at
7: \ * http://www.opensource.org/licenses/bsd-license.php
8: \ *
9: \ * Contributors:
10: \ * IBM Corporation - initial implementation
11: \ ****************************************************************************/
12:
13: \ ." Populating " pwd cr
14:
15: s" block" device-type
16:
17: FALSE VALUE initialized?
18:
19: \ Required interface for deblocker
20:
21: 200 CONSTANT block-size
22: 8000 CONSTANT max-transfer
23:
24: INSTANCE VARIABLE deblocker
25:
26: /vd-len BUFFER: virtiodev
27: virtiodev virtio-setup-vd
28:
29: \ Quiesce the virtqueue of this device so that no more background
30: \ transactions can be pending.
31: : shutdown ( -- )
32: virtiodev virtio-blk-shutdown
33: FALSE to initialized?
34: ;
35:
36: \ Basic device initialization - which has only to be done once
37: : init ( -- )
38: virtiodev virtio-blk-init
39: TRUE to initialized?
40: ['] shutdown add-quiesce-xt
41: ;
42:
43: \ Read multiple blocks - called by deblocker package
44: : read-blocks ( addr block# #blocks -- #read )
45: virtiodev virtio-blk-read
46: ;
47:
48: \ Standard node "open" function
49: : open ( -- okay? )
50: open 0= IF false EXIT THEN
51: 0 0 s" deblocker" $open-package dup deblocker ! dup IF
52: s" disk-label" find-package IF
53: my-args rot interpose
54: THEN
55: THEN
56: dup initialized? 0= AND IF
57: init
58: THEN
59: 0<>
60: ;
61:
62: \ Standard node "close" function
63: : close ( -- )
64: deblocker @ close-package
65: close
66: ;
67:
68: \ Standard node "seek" function
69: : seek ( pos.lo pos.hi -- status )
70: s" seek" deblocker @ $call-method
71: ;
72:
73: \ Standard node "read" function
74: : read ( addr len -- actual )
75: s" read" deblocker @ $call-method
76: ;
77:
78: \ Set disk alias if none is set yet
79: : (set-alias)
80: s" disk" find-alias 0= IF
81: s" disk" get-node node>path set-alias
82: ELSE
83: drop
84: THEN
85: ;
86: (set-alias)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.