summaryrefslogtreecommitdiffhomepage
path: root/pkg/usermem/addr.go
diff options
context:
space:
mode:
authorDean Deng <deandeng@google.com>2020-05-19 13:45:23 -0700
committergVisor bot <gvisor-bot@google.com>2020-05-19 13:46:42 -0700
commit05c89af6edde6158844d4debfe68bc598fec4418 (patch)
tree4b431d445b9cbde5a789620eb83ba35eb281ea9a /pkg/usermem/addr.go
parent064347afdf6206df73571684a3a75dde63584ad5 (diff)
Implement mmap for host fs in vfs2.
In VFS1, both fs/host and fs/gofer used the same utils for host file mappings. Refactor parts of fsimpl/gofer to create similar utils to share with fsimpl/host (memory accounting code moved to fsutil, page rounding arithmetic moved to usermem). Updates #1476. PiperOrigin-RevId: 312345090
Diffstat (limited to 'pkg/usermem/addr.go')
-rw-r--r--pkg/usermem/addr.go17
1 files changed, 17 insertions, 0 deletions
diff --git a/pkg/usermem/addr.go b/pkg/usermem/addr.go
index e79210804..c4100481e 100644
--- a/pkg/usermem/addr.go
+++ b/pkg/usermem/addr.go
@@ -106,3 +106,20 @@ func (ar AddrRange) IsPageAligned() bool {
func (ar AddrRange) String() string {
return fmt.Sprintf("[%#x, %#x)", ar.Start, ar.End)
}
+
+// PageRoundDown/Up are equivalent to Addr.RoundDown/Up, but without the
+// potentially truncating conversion from uint64 to Addr. This is necessary
+// because there is no way to define generic "PageRoundDown/Up" functions in Go.
+
+// PageRoundDown returns x rounded down to the nearest page boundary.
+func PageRoundDown(x uint64) uint64 {
+ return x &^ (PageSize - 1)
+}
+
+// PageRoundUp returns x rounded up to the nearest page boundary.
+// ok is true iff rounding up did not wrap around.
+func PageRoundUp(x uint64) (addr uint64, ok bool) {
+ addr = PageRoundDown(x + PageSize - 1)
+ ok = addr >= x
+ return
+}