From b67a2045b9470123e20b83ec3017758a490063fe Mon Sep 17 00:00:00 2001 From: Achilleas Anagnostopoulos Date: Wed, 31 May 2017 16:02:55 +0100 Subject: [PATCH] Define virtual memory page type This is equivalent to pmm.Frame (also a uintptr) but having different types for physical and virtual frames serves as an additional layer of protection for functions/methods that receive physical and/or virtual page arguments. --- kernel/mem/vmm/page.go | 19 +++++++++++++++++++ kernel/mem/vmm/page_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 kernel/mem/vmm/page.go create mode 100644 kernel/mem/vmm/page_test.go diff --git a/kernel/mem/vmm/page.go b/kernel/mem/vmm/page.go new file mode 100644 index 0000000..f1e9cb4 --- /dev/null +++ b/kernel/mem/vmm/page.go @@ -0,0 +1,19 @@ +package vmm + +import "github.com/achilleasa/gopher-os/kernel/mem" + +// Page describes a virtual memory page index. +type Page uintptr + +// Address returns a pointer to the virtual memory address pointed to by this Page. +func (f Page) Address() uintptr { + return uintptr(f << mem.PageShift) +} + +// PageFromAddress returns a Page that corresponds to the given virtual +// address. This function can handle both page-aligned and not aligned virtual +// addresses. in the latter case, the input address will be rounded down to the +// page that contains it. +func PageFromAddress(virtAddr uintptr) Page { + return Page((virtAddr & ^(uintptr(mem.PageSize - 1))) >> mem.PageShift) +} diff --git a/kernel/mem/vmm/page_test.go b/kernel/mem/vmm/page_test.go new file mode 100644 index 0000000..8786e97 --- /dev/null +++ b/kernel/mem/vmm/page_test.go @@ -0,0 +1,35 @@ +package vmm + +import ( + "testing" + + "github.com/achilleasa/gopher-os/kernel/mem" +) + +func TestPageMethods(t *testing.T) { + for pageIndex := uint64(0); pageIndex < 128; pageIndex++ { + page := Page(pageIndex) + + if exp, got := uintptr(pageIndex<