--- coregrind/m_aspacemgr/aspacemgr-common.c.orig
+++ coregrind/m_aspacemgr/aspacemgr-common.c
@@ -145,6 +145,10 @@
    SysRes res;
    aspacem_assert(VG_IS_PAGE_ALIGNED(offset));
 
+#  if defined(VGO_openbsd)
+   prot |= VKI_PROT_READ;
+#  endif
+
 #  if defined(VGP_arm64_linux)
    res = VG_(do_syscall6)(__NR3264_mmap, (UWord)start, length, 
                          prot, flags, fd, offset);
@@ -172,12 +176,12 @@
    }
    res = VG_(do_syscall6)(__NR_mmap, (UWord)start, length,
                           prot, flags, (UInt)fd, offset);
-#  elif defined(VGP_x86_freebsd)
+#  elif defined(VGP_x86_freebsd) || defined(VGP_x86_openbsd)
    if (flags & VKI_MAP_ANONYMOUS && fd == 0)
       fd = -1;
    res = VG_(do_syscall7)(__NR_mmap, (UWord)start, length,
 			  prot, flags, fd, offset, offset >> 32ul);
-#  elif defined(VGP_amd64_freebsd)
+#  elif defined(VGP_amd64_freebsd) || defined(VGP_amd64_openbsd)
    if ((flags & VKI_MAP_ANONYMOUS) && fd == 0)
       fd = -1;
    res = VG_(do_syscall6)(__NR_mmap, (UWord)start, length,
@@ -206,6 +210,13 @@
    return VG_(do_syscall3)(__NR_mprotect, (UWord)start, length, prot );
 }
 
+#if defined(VGO_openbsd)
+SysRes VG_(am_do_mprotect_NO_NOTIFY)(Addr start, SizeT length, UInt prot)
+{
+   return VG_(do_syscall3)(__NR_mprotect, (UWord)start, length, prot );
+}
+#endif
+
 SysRes ML_(am_do_munmap_NO_NOTIFY)(Addr start, SizeT length)
 {
    return VG_(do_syscall2)(__NR_munmap, (UWord)start, length );
@@ -266,7 +277,7 @@
    /* ARM64 wants to use __NR_openat rather than __NR_open. */
    SysRes res = VG_(do_syscall4)(__NR_openat,
                                  VKI_AT_FDCWD, (UWord)pathname, flags, mode);
-#  elif defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd)
+#  elif defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd) || defined(VGO_openbsd)
    SysRes res = VG_(do_syscall3)(__NR_open, (UWord)pathname, flags, mode);
 #  elif defined(VGO_solaris)
    SysRes res = VG_(do_syscall4)(__NR_openat, VKI_AT_FDCWD, (UWord)pathname,
@@ -294,7 +305,7 @@
 #  if defined(VGP_arm64_linux) || defined(VGP_nanomips_linux)
    res = VG_(do_syscall4)(__NR_readlinkat, VKI_AT_FDCWD,
                                            (UWord)path, (UWord)buf, bufsiz);
-#  elif defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd)
+#  elif defined(VGO_linux) || defined(VGO_darwin) || defined(VGO_freebsd) || defined(VGO_openbsd)
    res = VG_(do_syscall3)(__NR_readlink, (UWord)path, (UWord)buf, bufsiz);
 #  elif defined(VGO_solaris)
    res = VG_(do_syscall4)(__NR_readlinkat, VKI_AT_FDCWD, (UWord)path,
@@ -307,7 +318,7 @@
 
 Int ML_(am_fcntl) ( Int fd, Int cmd, Addr arg )
 {
-#  if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd)
+#  if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd) || defined(VGO_openbsd)
 #  if defined(VGP_nanomips_linux)
    SysRes res = VG_(do_syscall3)(__NR_fcntl64, fd, cmd, arg);
 #  else
@@ -400,6 +411,16 @@
       return True;
    }
    return False;
+#  elif defined(VGO_openbsd)
+   struct vki_stat buf;
+   SysRes res = VG_(do_syscall2)(__NR_fstat, fd, (UWord)&buf);
+   if (!sr_isError(res)) {
+      *dev  = (ULong)buf.st_dev;
+      *ino  = (ULong)buf.st_ino;
+      *mode = (UInt) buf.st_mode;
+      return True;
+   }
+   return False;
 #  else
 #    error Unknown OS
 #  endif
@@ -492,6 +513,18 @@
    else
       return False;
 
+#elif defined(VGO_openbsd)
+   char *VG_(pathname_by_fd)(Int fd);
+
+   HChar *p;
+
+   p = VG_(pathname_by_fd)(fd);
+   if (p) {
+      VG_(strncpy)(buf, p, nbuf);
+      return True;
+   }
+   return False;
+
 #  else
 #     error Unknown OS
 #  endif
@@ -529,7 +562,11 @@
    szB = VG_STACK_GUARD_SZB 
          + VG_(clo_valgrind_stacksize) + VG_STACK_GUARD_SZB;
 
+#if defined(VGO_openbsd)
+   sres = VG_(am_mmap_anon_float_valgrind_stack)( szB );
+#else
    sres = VG_(am_mmap_anon_float_valgrind)( szB );
+#endif
    if (sr_isError(sres))
       return NULL;
 
@@ -608,6 +645,19 @@
 {
    return (Addr)&stack->bytes[VG_STACK_GUARD_SZB];
 }
+
+#if defined(VGO_openbsd)
+Bool VG_(am_mprotect)(Addr start, SizeT length, UInt prot)
+{
+   SysRes   sres;
+
+   sres = local_do_mprotect_NO_NOTIFY(start, length, prot);
+   if (sr_isError(sres))
+      return False;
+   VG_(am_notify_mprotect)(start, length, prot);
+   return True;
+}
+#endif
 
 /*--------------------------------------------------------------------*/
 /*--- end                                                          ---*/
