1
0
mirror of https://github.com/taigrr/gopher-os synced 2025-01-18 04:43:13 -08:00
2018-06-01 08:19:39 +01:00

51 lines
1.3 KiB
Go

package vmm
import (
"gopheros/kernel"
"gopheros/kernel/cpu"
"gopheros/kernel/mm"
)
var (
// the following functions are mocked by tests and are automatically
// inlined by the compiler.
readCR2Fn = cpu.ReadCR2
translateFn = Translate
errUnrecoverableFault = &kernel.Error{Module: "vmm", Message: "page/gpf fault"}
)
// Init initializes the vmm system, creates a granular PDT for the kernel and
// installs paging-related exception handlers.
func Init(kernelPageOffset uintptr) *kernel.Error {
if err := setupPDTForKernel(kernelPageOffset); err != nil {
return err
}
// Install arch-specific handlers for vmm-related faults.
installFaultHandlers()
return reserveZeroedFrame()
}
// reserveZeroedFrame reserves a physical frame to be used together with
// FlagCopyOnWrite for lazy allocation requests.
func reserveZeroedFrame() *kernel.Error {
var (
err *kernel.Error
tempPage mm.Page
)
if ReservedZeroedFrame, err = mm.AllocFrame(); err != nil {
return err
} else if tempPage, err = mapTemporaryFn(ReservedZeroedFrame); err != nil {
return err
}
kernel.Memset(tempPage.Address(), 0, mm.PageSize)
_ = unmapFn(tempPage)
// From this point on, ReservedZeroedFrame cannot be mapped with a RW flag
protectReservedZeroedPage = true
return nil
}