package platform

import (
	
	
	
	
	

	
)

var hugePagesConfigs []hugePagesConfig

type hugePagesConfig struct {
	size int
	flag int
}

func ( *hugePagesConfig) ( int) bool {
	return ( & (.size - 1)) == 0
}

func init() {
	,  := os.ReadDir("/sys/kernel/mm/hugepages/")
	if  != nil {
		return
	}

	for ,  := range  {
		 := .Name()
		if !strings.HasPrefix(, "hugepages-") {
			continue
		}
		if !strings.HasSuffix(, "kB") {
			continue
		}
		,  := strconv.ParseUint([10:len()-2], 10, 64)
		if  != nil {
			continue
		}
		if bits.OnesCount64() != 1 {
			continue
		}
		 *= 1024
		hugePagesConfigs = append(hugePagesConfigs, hugePagesConfig{
			size: int(),
			flag: int(bits.TrailingZeros64()<<unix.MAP_HUGE_SHIFT) | unix.MAP_HUGETLB,
		})
	}

	sort.Slice(hugePagesConfigs, func(,  int) bool {
		return hugePagesConfigs[].size > hugePagesConfigs[].size
	})
}

func mmapCodeSegment( int) ([]byte, error) {
	 := unix.MAP_ANON | unix.MAP_PRIVATE
	 := unix.PROT_READ | unix.PROT_WRITE

	for ,  := range hugePagesConfigs {
		if .match() {
			,  := unix.Mmap(-1, 0, , , |.flag)
			if  != nil {
				continue
			}
			return , nil
		}
	}

	return unix.Mmap(-1, 0, , , )
}