summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2013-03-22 18:46:07 (GMT)
committerH. Peter Anvin <hpa@zytor.com>2013-03-22 18:46:07 (GMT)
commite151e0aa23f83ead8c24f80695fec07f85496afe (patch)
treea3a657234c6fffcc098b79af57d8fe57f7da66a7
parentf607910df425aef3bffb99655cccaf99f74d310a (diff)
downloadvirtio9p-e151e0aa23f83ead8c24f80695fec07f85496afe.zip
virtio9p-e151e0aa23f83ead8c24f80695fec07f85496afe.tar.gz
virtio9p-e151e0aa23f83ead8c24f80695fec07f85496afe.tar.bz2
virtio9p-e151e0aa23f83ead8c24f80695fec07f85496afe.tar.xz
Common skeleton for the various open variants
Create a common wrapper for all the open variants. Sadly we still need to turn them into "open" and "create" messages for 9P, sigh.
-rw-r--r--Makefile2
-rw-r--r--fxn.asm27
-rw-r--r--open.asm85
-rw-r--r--v9fs.h6
4 files changed, 92 insertions, 28 deletions
diff --git a/Makefile b/Makefile
index 9ca18a5..1e3956b 100644
--- a/Makefile
+++ b/Makefile
@@ -37,7 +37,7 @@ XTOOLS := $(wildcard ../dostools/*.com ../dostools/*.exe)
OBJS = header.o start.o printmsg.o \
int2f.o acc.o fxn.o \
- diskspc.o readdir.o \
+ diskspc.o readdir.o open.o \
utf.o datetime.o \
message.o protomsg.o pathname.o
diff --git a/fxn.asm b/fxn.asm
index 06d03cb..f49bdd7 100644
--- a/fxn.asm
+++ b/fxn.asm
@@ -87,15 +87,6 @@ GPROC(fxn_commitfile)
END(fxn_commitfile)
/* ------------------------------------------------------------------------- *
- * fxn_create
- * ------------------------------------------------------------------------- */
-
-GPROC(fxn_create)
- stc
- retw
-END(fxn_create)
-
-/* ------------------------------------------------------------------------- *
* fxn_delete
* ------------------------------------------------------------------------- */
@@ -144,15 +135,6 @@ GPROC(fxn_mkdir)
END(fxn_mkdir)
/* ------------------------------------------------------------------------- *
- * fxn_open
- * ------------------------------------------------------------------------- */
-
-GPROC(fxn_open)
- stc
- retw
-END(fxn_open)
-
-/* ------------------------------------------------------------------------- *
* fxn_readfile
* ------------------------------------------------------------------------- */
@@ -198,15 +180,6 @@ GPROC(fxn_skfmend)
END(fxn_skfmend)
/* ------------------------------------------------------------------------- *
- * fxn_spopenfile
- * ------------------------------------------------------------------------- */
-
-GPROC(fxn_spopenfile)
- stc
- retw
-END(fxn_spopenfile)
-
-/* ------------------------------------------------------------------------- *
* fxn_unknown_2d
* ------------------------------------------------------------------------- */
diff --git a/open.asm b/open.asm
new file mode 100644
index 0000000..db5e7c2
--- /dev/null
+++ b/open.asm
@@ -0,0 +1,85 @@
+/* -----------------------------------------------------------------------
+ *
+ * Copyright 2013 H. Peter Anvin - All Rights Reserved
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall
+ * be included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * ----------------------------------------------------------------------- */
+
+/* ------------------------------------------------------------------------- *
+ * fxn_create
+ * ------------------------------------------------------------------------- */
+
+GPROC(fxn_create)
+ lfsw dos_sdafn,%si
+ movb $0x21,%al /* Action: create or truncate */
+ testb $1,F_TOSH
+ jz 1f
+ movb $0x01,%al /* Action: create only (= O_EXCL) */
+ movw $0x0002,%dx /* Open mode: compatibility + read/write */
+ call do_open
+ retw
+END(fxn_create)
+
+/* ------------------------------------------------------------------------- *
+ * fxn_open
+ * ------------------------------------------------------------------------- */
+
+GPROC(fxn_open)
+ lfsw dos_sdafcb,%bx
+ movb $0x10,%al /* Action: open */
+ movw %fs:SDF_OPENMODE(%bx),%dx /* Open mode */
+ call do_open
+ retw
+END(fxn_open)
+
+/* ------------------------------------------------------------------------- *
+ * fxn_spopenfile
+ * ------------------------------------------------------------------------- */
+
+GPROC(fxn_spopenfile)
+ lfsw dos_sdafcb,%si
+ movw %fs:SPN_SPCACTION(%si),%ax /* Open action */
+ movw %fs:SPN_SPCMODE(%si),%dx /* Open mode */
+ call do_open
+ andw %ax,%ax
+ jnz 1f
+ movw %cx,F_CX /* Status return */
+1:
+ retw
+END(fxn_spopenfile)
+
+/* ------------------------------------------------------------------------- *
+ * do_open
+ *
+ * Common interface to all the open variants. Take the extended open
+ * action code in %ax and the open mode in %dx. SDN_FN1 contains the
+ * fully qualified filename.
+ *
+ * On return, the status code is in %(e)ax and on success an extended
+ * open result code is in %cx.
+ * ------------------------------------------------------------------------- */
+
+LPROC(do_open)
+ movw $0x08030002,%eax
+ retw
+END(do_open)
diff --git a/v9fs.h b/v9fs.h
index ade70b0..2588a84 100644
--- a/v9fs.h
+++ b/v9fs.h
@@ -270,6 +270,11 @@
#define SDF_DIRSRCH 0x022 /* Directory search attributes */
#define SDF_OPENMODE 0x023 /* File open mode */
+/* These are DOS 4+ specific; base them on SDF for consistency */
+#define SDF_SPCACTION (0x2dd-0x22b) /* Special open action */
+#define SDF_SPCATTRIB (0x2df-0x22b) /* Special open file attributes */
+#define SDF_SPCMODE (0x2e1-0x22b) /* Special open mode */
+
/*
* Fields in the DOS Current Directory Structure (CDS)
*
@@ -334,6 +339,7 @@
#define F_CS %gs:42(%bp)
#define F_FLAGS %gs:44(%bp)
#define F_TOS %gs:46(%bp) /* Word on stack before INT 2F */
+#define F_TOSH %gs:47(%bp) /* Word on stack before INT 2F - high byte */
/* Magic number we store in the CDS */
#define CDS_MAGIC 0xe882