func (memory *MemoryMap) Reserve( vm *platform.Vm, device Device, memtype MemoryType, start platform.Paddr, size uint64, user []byte) error { // Verbose messages. device.Debug( "reserving (type: %d) of size %x in [%x,%x]", memtype, size, start, start.After(size-1)) // Ensure all targets are aligned. if (start.Align(platform.PageSize, false) != start) || (size%platform.PageSize != 0) { return MemoryUnaligned } // Ensure underlying map is aligned. // This may be harder to detect later on. if user != nil && uintptr(unsafe.Pointer(&user[0]))%platform.PageSize != 0 { return MemoryUnaligned } // Add the region. region := &TypedMemoryRegion{ MemoryRegion: MemoryRegion{start, size}, MemoryType: memtype, Device: device, user: user, allocated: make(map[uint64]uint64), } err := memory.Add(region) if err != nil { return err } // Do the mapping. switch region.MemoryType { case MemoryTypeUser: err = vm.MapUserMemory(region.Start, region.Size, region.user) case MemoryTypeReserved: err = vm.MapReservedMemory(region.Start, region.Size) case MemoryTypeAcpi: err = vm.MapUserMemory(region.Start, region.Size, region.user) case MemoryTypeSpecial: err = vm.MapSpecialMemory(region.Start) } return err }
func (region *MemoryRegion) Contains(start platform.Paddr, size uint64) bool { return region.Start <= start && region.End() >= start.After(size) }
func (region *MemoryRegion) Overlaps(start platform.Paddr, size uint64) bool { return ((region.Start >= start && region.Start < start.After(size)) || (region.End() > start && region.End() <= start.After(size))) }