blob: de42cc723ee344f0733636e20abd2e18e173dfdd [file] [log] [blame]
\ *****************************************************************************
\ * Copyright (c) 2016 IBM Corporation
\ * All rights reserved.
\ * This program and the accompanying materials
\ * are made available under the terms of the BSD License
\ * which accompanies this distribution, and is available at
\ * http://www.opensource.org/licenses/bsd-license.php
\ *
\ * Contributors:
\ * IBM Corporation - initial implementation
\ ****************************************************************************/
s" serial" device-type
FALSE VALUE initialized?
virtio-setup-vd VALUE virtiodev
\ Quiescence the virtqueue of this device so that no more background
\ transactions can be pending.
: shutdown ( -- )
initialized? IF
virtiodev virtio-serial-shutdown
FALSE to initialized?
0 to virtiodev
THEN
;
: virtio-serial-term-emit
virtiodev SWAP virtio-serial-putchar
;
: virtio-serial-term-key? virtiodev virtio-serial-haschar ;
: virtio-serial-term-key BEGIN virtio-serial-term-key? UNTIL virtiodev virtio-serial-getchar ;
\ Basic device initialization - which has only to be done once
: init ( -- )
virtiodev virtio-serial-init drop
TRUE to initialized?
\ virtiodev must be shutdown at quiesce so the device is reset properly.
\ The read and write methods can be called after quiesce so must handle
\ virtiodev being closed.
['] shutdown add-quiesce-xt
;
0 VALUE open-count
\ Standard node "open" function
: open ( -- okay? )
open-count 0= IF
open IF initialized? 0= IF init THEN
true
ELSE false exit
THEN
ELSE true THEN
open-count 1 + to open-count
;
: close
open-count 0> IF
open-count 1 - dup to open-count
0= IF shutdown THEN
close
THEN
;
: write ( addr len -- actual )
virtiodev 0= IF 2drop 0 EXIT THEN
tuck
0 ?DO
dup c@ virtiodev SWAP virtio-serial-putchar
1 +
LOOP
drop
;
: read ( addr len -- actual )
0= IF drop 0 EXIT THEN
virtiodev 0= IF drop 0 EXIT THEN
virtiodev virtio-serial-haschar 0= IF 0 swap c! -2 EXIT THEN
virtiodev virtio-serial-getchar swap c! 1
;
: setup-alias
" vsterm" find-alias 0= IF
" vsterm" get-node node>path set-alias
ELSE drop THEN
;
setup-alias