summaryrefslogtreecommitdiffstats
path: root/protomsg.S
diff options
context:
space:
mode:
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