summaryrefslogtreecommitdiffstats
path: root/protomsg.S
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2013-02-26 20:44:02 -0800
committerH. Peter Anvin <hpa@zytor.com>2013-02-26 20:44:02 -0800
commit584879fbf448b06be153ef09422626d489ae0702 (patch)
tree03c855a225d02eeb05c10d1d83d45689eda96d5d /protomsg.S
parent40d6f2b0c1e594899ca94821012fa84679700b75 (diff)
downloadvirtio9p-584879fbf448b06be153ef09422626d489ae0702.tar.gz
virtio9p-584879fbf448b06be153ef09422626d489ae0702.tar.xz
virtio9p-584879fbf448b06be153ef09422626d489ae0702.zip
Code to generate a walk message; errno constants
Code to convert pathnames and to actually generate a walk message. The Rlerror message contains Linux errno constants, include them as macros.
Diffstat (limited to 'protomsg.S')
-rw-r--r--protomsg.S46
1 files changed, 46 insertions, 0 deletions
diff --git a/protomsg.S b/protomsg.S
new file mode 100644
index 0000000..034ea0e
--- /dev/null
+++ b/protomsg.S
@@ -0,0 +1,46 @@
+#include "v9fs.h"
+
+ .code16
+ .section ".rtext","ax"
+
+/* ------------------------------------------------------------------------- *
+ * path_walk
+ *
+ * Issue a walk message for the path in FS:SI.
+ * BX marks the end of the path to convert, and EAX is the new fid.
+ * ------------------------------------------------------------------------- */
+
+ .globl path_walk
+path_walk:
+ movw msgbuf7,%di
+ movl $ROOT_FID,(%di)
+ movl %eax,4(%di)
+ addw $8,%di
+ pushw %di
+ call genpath
+ popw %si
+ pushw (%di) /* Number of pathname chunks */
+ movb $P9_TWALK,%al
+ call simple_message
+ jc 1f /* Message error */
+ popw %dx
+ movw (%di),%cx /* %ax = nwqid */
+ imul $13,%cx,%bx /* Each qid is 13 bytes */
+ movb $-11(%bx,%di),%al /* Type of the final QID */
+ cmpw %dx,%cx
+ jne 2f
+ clc /* All good */
+1:
+ retw
+2:
+ /*
+ * We receieved a subset of the desired qids. If the final
+ * component is a directory, this is ENOENT, otherwise ENOTDIR.
+ */
+ testb $P9_QTDIR,%al
+ movw $L_ENOENT,%ax
+ je 3f
+ movw $L_ENOTDIR,%ax
+3:
+ stc
+ retw