diff --git a/src/syscall/fs_wasip1.go b/src/syscall/fs_wasip1.go
index fc361ee898978f0165aa79ceabc2949700e3a067..c249891dd2181c6721c64d1077b4d6a1fab6f16a 100644
--- a/src/syscall/fs_wasip1.go
+++ b/src/syscall/fs_wasip1.go
@@ -542,6 +542,14 @@ func Open(path string, openmode int, perm uint32) (int, error) {
 		rights = fileRights
 	}
 
+	if (openmode & O_DIRECTORY) != 0 {
+		if openmode&(O_WRONLY|O_RDWR) != 0 {
+			return -1, EISDIR
+		}
+		oflags |= OFLAG_DIRECTORY
+		rights &= dirRights
+	}
+
 	var fdflags fdflags
 	if (openmode & O_APPEND) != 0 {
 		fdflags |= FDFLAG_APPEND
diff --git a/src/syscall/syscall_wasip1.go b/src/syscall/syscall_wasip1.go
index bcf7676123c06c79c162b02ffbe89afa5da1b4fa..b98f99745f29e37a77f016305caaa9d0d085612b 100644
--- a/src/syscall/syscall_wasip1.go
+++ b/src/syscall/syscall_wasip1.go
@@ -216,12 +216,13 @@ const (
 	O_WRONLY = 1
 	O_RDWR   = 2
 
-	O_CREAT  = 0100
-	O_CREATE = O_CREAT
-	O_TRUNC  = 01000
-	O_APPEND = 02000
-	O_EXCL   = 0200
-	O_SYNC   = 010000
+	O_CREAT     = 0100
+	O_CREATE    = O_CREAT
+	O_TRUNC     = 01000
+	O_APPEND    = 02000
+	O_EXCL      = 0200
+	O_SYNC      = 010000
+	O_DIRECTORY = 020000
 
 	O_CLOEXEC = 0
 )