From 64a7bcd2c4b7ccfa2837162cab0d4c3fc04256a1 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 10 Apr 2020 23:06:16 -0700 Subject: [PATCH] util: Add an unmap_m5_mem() function to the m5 util's m5_mmap.*. This cleans up the mmap-ing. This is primarily used for testing since the tests may end up mmap-ing the backing file many times, and we don't want all those earlier mappings lying around. This change also makes the original mmap-ing function close the file it opens, since the man page for mmap explicitly says you can do that and not lose the mapping. That means we don't have to keep track of the file descriptor which corresponds to the mmap-ed file when we do the unmapping, and it's slightly cleaner in general. Change-Id: I90e3e755cebf3d03e2bf644adf8ef3e157236172 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27750 Reviewed-by: Jason Lowe-Power Reviewed-by: Pouya Fotouhi Maintainer: Jason Lowe-Power Tested-by: kokoro --- util/m5/src/m5_mmap.c | 17 +++++++++++++++++ util/m5/src/m5_mmap.h | 1 + 2 files changed, 18 insertions(+) diff --git a/util/m5/src/m5_mmap.c b/util/m5/src/m5_mmap.c index d3413031d..c088e264e 100644 --- a/util/m5/src/m5_mmap.c +++ b/util/m5/src/m5_mmap.c @@ -46,6 +46,7 @@ #include #include #include +#include #include "m5_mmap.h" @@ -63,6 +64,11 @@ map_m5_mem() { int fd; + if (m5_mem) { + fprintf(stderr, "m5 mem already mapped.\n"); + exit(1); + } + fd = open(m5_mmap_dev, O_RDWR | O_SYNC); if (fd == -1) { fprintf(stderr, "Can't open %s: %s\n", m5_mmap_dev, strerror(errno)); @@ -71,8 +77,19 @@ map_m5_mem() m5_mem = mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, m5op_addr); + close(fd); + if (!m5_mem) { fprintf(stderr, "Can't map %s: %s\n", m5_mmap_dev, strerror(errno)); exit(1); } } + +void +unmap_m5_mem() +{ + if (m5_mem) { + munmap(m5_mem, 0x10000); + m5_mem = NULL; + } +} diff --git a/util/m5/src/m5_mmap.h b/util/m5/src/m5_mmap.h index 09cddb29c..ce934f08a 100644 --- a/util/m5/src/m5_mmap.h +++ b/util/m5/src/m5_mmap.h @@ -51,6 +51,7 @@ extern void *m5_mem; extern uint64_t m5op_addr; extern const char *m5_mmap_dev; void map_m5_mem(); +void unmap_m5_mem(); #ifdef __cplusplus } -- 2.30.2