diff --git a/sys/amd64/linux/linux_proto.h b/sys/amd64/linux/linux_proto.h
index 2373eff31..1845adedc 100644
--- a/sys/amd64/linux/linux_proto.h
+++ b/sys/amd64/linux/linux_proto.h
@@ -78,6 +78,10 @@ struct linux_mprotect_args {
 	char len_l_[PADL_(l_size_t)]; l_size_t len; char len_r_[PADR_(l_size_t)];
 	char prot_l_[PADL_(l_ulong)]; l_ulong prot; char prot_r_[PADR_(l_ulong)];
 };
+struct munmap_args {
+	char addr_l_[PADL_(void *)]; void * addr; char addr_r_[PADR_(void *)];
+	char len_l_[PADL_(l_size_t)]; l_size_t len; char len_r_[PADR_(l_size_t)];
+};
 struct linux_brk_args {
 	char dsend_l_[PADL_(l_ulong)]; l_ulong dsend; char dsend_r_[PADR_(l_ulong)];
 };
@@ -1450,6 +1454,7 @@ int	linux_poll(struct thread *, struct linux_poll_args *);
 int	linux_lseek(struct thread *, struct linux_lseek_args *);
 int	linux_mmap2(struct thread *, struct linux_mmap2_args *);
 int	linux_mprotect(struct thread *, struct linux_mprotect_args *);
+int	sys_munmap(struct thread *, struct munmap_args *);
 int	linux_brk(struct thread *, struct linux_brk_args *);
 int	linux_rt_sigaction(struct thread *, struct linux_rt_sigaction_args *);
 int	linux_rt_sigprocmask(struct thread *, struct linux_rt_sigprocmask_args *);
@@ -1760,6 +1765,7 @@ int	linux_map_shadow_stack(struct thread *, struct linux_map_shadow_stack_args *
 #define	LINUX_SYS_AUE_linux_lseek	AUE_LSEEK
 #define	LINUX_SYS_AUE_linux_mmap2	AUE_MMAP
 #define	LINUX_SYS_AUE_linux_mprotect	AUE_MPROTECT
+#define	LINUX_SYS_AUE_munmap	AUE_MUNMAP
 #define	LINUX_SYS_AUE_linux_brk	AUE_NULL
 #define	LINUX_SYS_AUE_linux_rt_sigaction	AUE_NULL
 #define	LINUX_SYS_AUE_linux_rt_sigprocmask	AUE_NULL
diff --git a/sys/amd64/linux/syscalls.master b/sys/amd64/linux/syscalls.master
index b3bbd917c..24ce5d1db 100644
--- a/sys/amd64/linux/syscalls.master
+++ b/sys/amd64/linux/syscalls.master
@@ -109,7 +109,7 @@
 		    l_ulong prot
 		);
 	}
-11	AUE_MUNMAP	NOPROTO {
+11	AUE_MUNMAP	STD {
 		int munmap(
 		    void *addr,
 		    l_size_t len
diff --git a/sys/amd64/linux32/linux32_proto.h b/sys/amd64/linux32/linux32_proto.h
index 3f13c6df5..716a401d8 100644
--- a/sys/amd64/linux32/linux32_proto.h
+++ b/sys/amd64/linux32/linux32_proto.h
@@ -297,6 +297,10 @@ struct linux_readdir_args {
 struct linux_mmap_args {
 	char ptr_l_[PADL_(struct l_mmap_argv *)]; struct l_mmap_argv * ptr; char ptr_r_[PADR_(struct l_mmap_argv *)];
 };
+struct munmap_args {
+	char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
+	char len_l_[PADL_(int)]; int len; char len_r_[PADR_(int)];
+};
 struct linux_truncate_args {
 	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
 	char length_l_[PADL_(l_ulong)]; l_ulong length; char length_r_[PADR_(l_ulong)];
@@ -1807,6 +1811,7 @@ int	linux_readlink(struct thread *, struct linux_readlink_args *);
 int	linux_reboot(struct thread *, struct linux_reboot_args *);
 int	linux_readdir(struct thread *, struct linux_readdir_args *);
 int	linux_mmap(struct thread *, struct linux_mmap_args *);
+int	sys_munmap(struct thread *, struct munmap_args *);
 int	linux_truncate(struct thread *, struct linux_truncate_args *);
 int	linux_ftruncate(struct thread *, struct linux_ftruncate_args *);
 int	linux_getpriority(struct thread *, struct linux_getpriority_args *);
@@ -2181,6 +2186,7 @@ int	linux_fchmodat2(struct thread *, struct linux_fchmodat2_args *);
 #define	LINUX32_SYS_AUE_linux_reboot	AUE_REBOOT
 #define	LINUX32_SYS_AUE_linux_readdir	AUE_GETDIRENTRIES
 #define	LINUX32_SYS_AUE_linux_mmap	AUE_MMAP
+#define	LINUX32_SYS_AUE_munmap	AUE_MUNMAP
 #define	LINUX32_SYS_AUE_linux_truncate	AUE_TRUNCATE
 #define	LINUX32_SYS_AUE_linux_ftruncate	AUE_FTRUNCATE
 #define	LINUX32_SYS_AUE_linux_getpriority	AUE_GETPRIORITY
diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master
index fab68854a..af6bbd548 100644
--- a/sys/amd64/linux32/syscalls.master
+++ b/sys/amd64/linux32/syscalls.master
@@ -485,7 +485,7 @@
 		    struct l_mmap_argv *ptr
 		);
 	}
-91	AUE_MUNMAP	NOPROTO {
+91	AUE_MUNMAP	STD {
 		int munmap(
 		    caddr_t addr,
 		    int len
diff --git a/sys/arm64/linux/linux_proto.h b/sys/arm64/linux/linux_proto.h
index ad0146b85..869e1e584 100644
--- a/sys/arm64/linux/linux_proto.h
+++ b/sys/arm64/linux/linux_proto.h
@@ -855,6 +855,10 @@ struct linux_recvmsg_args {
 struct linux_brk_args {
 	char dsend_l_[PADL_(l_ulong)]; l_ulong dsend; char dsend_r_[PADR_(l_ulong)];
 };
+struct munmap_args {
+	char addr_l_[PADL_(void *)]; void * addr; char addr_r_[PADR_(void *)];
+	char len_l_[PADL_(l_size_t)]; l_size_t len; char len_r_[PADR_(l_size_t)];
+};
 struct linux_mremap_args {
 	char addr_l_[PADL_(l_ulong)]; l_ulong addr; char addr_r_[PADR_(l_ulong)];
 	char old_len_l_[PADL_(l_ulong)]; l_ulong old_len; char old_len_r_[PADR_(l_ulong)];
@@ -1421,6 +1425,7 @@ int	linux_shutdown(struct thread *, struct linux_shutdown_args *);
 int	linux_sendmsg(struct thread *, struct linux_sendmsg_args *);
 int	linux_recvmsg(struct thread *, struct linux_recvmsg_args *);
 int	linux_brk(struct thread *, struct linux_brk_args *);
+int	sys_munmap(struct thread *, struct munmap_args *);
 int	linux_mremap(struct thread *, struct linux_mremap_args *);
 int	linux_add_key(struct thread *, struct linux_add_key_args *);
 int	linux_request_key(struct thread *, struct linux_request_key_args *);
@@ -1681,6 +1686,7 @@ int	linux_fchmodat2(struct thread *, struct linux_fchmodat2_args *);
 #define	LINUX_SYS_AUE_linux_sendmsg	AUE_SENDMSG
 #define	LINUX_SYS_AUE_linux_recvmsg	AUE_RECVMSG
 #define	LINUX_SYS_AUE_linux_brk	AUE_NULL
+#define	LINUX_SYS_AUE_munmap	AUE_MUNMAP
 #define	LINUX_SYS_AUE_linux_mremap	AUE_NULL
 #define	LINUX_SYS_AUE_linux_add_key	AUE_NULL
 #define	LINUX_SYS_AUE_linux_request_key	AUE_NULL
diff --git a/sys/arm64/linux/syscalls.master b/sys/arm64/linux/syscalls.master
index f4ab6f49c..69adf38ce 100644
--- a/sys/arm64/linux/syscalls.master
+++ b/sys/arm64/linux/syscalls.master
@@ -1330,7 +1330,7 @@
 		    l_ulong dsend
 		);
 	}
-215	AUE_MUNMAP	NOPROTO	{
+215	AUE_MUNMAP	STD	{
 		int munmap(
 		    void *addr,
 		    l_size_t len
diff --git a/sys/compat/linux/linux_mmap.c b/sys/compat/linux/linux_mmap.c
index a8e790a29..edff8c5c9 100644
--- a/sys/compat/linux/linux_mmap.c
+++ b/sys/compat/linux/linux_mmap.c
@@ -423,3 +423,14 @@ linux_fixup_prot(struct thread *td, int *prot)
 
 }
 #endif
+
+int
+linux_munmap(struct thread *td, struct linux_munmap_args *args)
+{
+
+    /* Linux requires addresses to be page aligned */
+    if ((uintptr_t)args->addr & PAGE_MASK)
+        return (EINVAL);
+
+    return (kern_munmap(td, (uintptr_t) args->addr, length));
+}
diff --git a/sys/i386/linux/linux_proto.h b/sys/i386/linux/linux_proto.h
index 255c2ec74..72201a09e 100644
--- a/sys/i386/linux/linux_proto.h
+++ b/sys/i386/linux/linux_proto.h
@@ -288,6 +288,10 @@ struct linux_readdir_args {
 struct linux_mmap_args {
 	char ptr_l_[PADL_(struct l_mmap_argv *)]; struct l_mmap_argv * ptr; char ptr_r_[PADR_(struct l_mmap_argv *)];
 };
+struct munmap_args {
+	char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
+	char len_l_[PADL_(int)]; int len; char len_r_[PADR_(int)];
+};
 struct linux_truncate_args {
 	char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
 	char length_l_[PADL_(l_ulong)]; l_ulong length; char length_r_[PADR_(l_ulong)];
@@ -1799,6 +1803,7 @@ int	linux_uselib(struct thread *, struct linux_uselib_args *);
 int	linux_reboot(struct thread *, struct linux_reboot_args *);
 int	linux_readdir(struct thread *, struct linux_readdir_args *);
 int	linux_mmap(struct thread *, struct linux_mmap_args *);
+int	sys_munmap(struct thread *, struct munmap_args *);
 int	linux_truncate(struct thread *, struct linux_truncate_args *);
 int	linux_ftruncate(struct thread *, struct linux_ftruncate_args *);
 int	linux_getpriority(struct thread *, struct linux_getpriority_args *);
@@ -2175,6 +2180,7 @@ int	linux_fchmodat2(struct thread *, struct linux_fchmodat2_args *);
 #define	LINUX_SYS_AUE_linux_reboot	AUE_REBOOT
 #define	LINUX_SYS_AUE_linux_readdir	AUE_GETDIRENTRIES
 #define	LINUX_SYS_AUE_linux_mmap	AUE_MMAP
+#define	LINUX_SYS_AUE_munmap	AUE_MUNMAP
 #define	LINUX_SYS_AUE_linux_truncate	AUE_TRUNCATE
 #define	LINUX_SYS_AUE_linux_ftruncate	AUE_FTRUNCATE
 #define	LINUX_SYS_AUE_linux_getpriority	AUE_GETPRIORITY
diff --git a/sys/i386/linux/syscalls.master b/sys/i386/linux/syscalls.master
index b93f28aca..678f64659 100644
--- a/sys/i386/linux/syscalls.master
+++ b/sys/i386/linux/syscalls.master
@@ -488,7 +488,7 @@
 		    struct l_mmap_argv *ptr
 		);
 	}
-91	AUE_MUNMAP	NOPROTO {
+91	AUE_MUNMAP	STD {
 		int munmap(
 		    caddr_t addr,
 		    int len
