package platform

import (
	
	
	
	
	
	
)

const (
	// https://man7.org/linux/man-pages/man2/mmap.2.html
	__MAP_HUGE_SHIFT = 26
	__MAP_HUGETLB    = 0x40000
)

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()<<__MAP_HUGE_SHIFT) | __MAP_HUGETLB,
		})
	}

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

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

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

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