// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package runtime

// ELF32 structure definitions for use by the Linux vDSO loader

type elfSym struct {
	st_name  uint32
	st_value uint32
	st_size  uint32
	st_info  byte
	st_other byte
	st_shndx uint16
}

type elfVerdef struct {
	vd_version uint16 /* Version revision */
	vd_flags   uint16 /* Version information */
	vd_ndx     uint16 /* Version Index */
	vd_cnt     uint16 /* Number of associated aux entries */
	vd_hash    uint32 /* Version name hash value */
	vd_aux     uint32 /* Offset in bytes to verdaux array */
	vd_next    uint32 /* Offset in bytes to next verdef entry */
}

type elfEhdr struct {
	e_ident     [_EI_NIDENT]byte /* Magic number and other info */
	e_type      uint16           /* Object file type */
	e_machine   uint16           /* Architecture */
	e_version   uint32           /* Object file version */
	e_entry     uint32           /* Entry point virtual address */
	e_phoff     uint32           /* Program header table file offset */
	e_shoff     uint32           /* Section header table file offset */
	e_flags     uint32           /* Processor-specific flags */
	e_ehsize    uint16           /* ELF header size in bytes */
	e_phentsize uint16           /* Program header table entry size */
	e_phnum     uint16           /* Program header table entry count */
	e_shentsize uint16           /* Section header table entry size */
	e_shnum     uint16           /* Section header table entry count */
	e_shstrndx  uint16           /* Section header string table index */
}

type elfPhdr struct {
	p_type   uint32 /* Segment type */
	p_offset uint32 /* Segment file offset */
	p_vaddr  uint32 /* Segment virtual address */
	p_paddr  uint32 /* Segment physical address */
	p_filesz uint32 /* Segment size in file */
	p_memsz  uint32 /* Segment size in memory */
	p_flags  uint32 /* Segment flags */
	p_align  uint32 /* Segment alignment */
}

type elfShdr struct {
	sh_name      uint32 /* Section name (string tbl index) */
	sh_type      uint32 /* Section type */
	sh_flags     uint32 /* Section flags */
	sh_addr      uint32 /* Section virtual addr at execution */
	sh_offset    uint32 /* Section file offset */
	sh_size      uint32 /* Section size in bytes */
	sh_link      uint32 /* Link to another section */
	sh_info      uint32 /* Additional section information */
	sh_addralign uint32 /* Section alignment */
	sh_entsize   uint32 /* Entry size if section holds table */
}

type elfDyn struct {
	d_tag int32  /* Dynamic entry type */
	d_val uint32 /* Integer value */
}

type elfVerdaux struct {
	vda_name uint32 /* Version or dependency names */
	vda_next uint32 /* Offset in bytes to next verdaux entry */
}

const (
	// vdsoArrayMax is the byte-size of a maximally sized array on this architecture.
	// See cmd/compile/internal/x86/galign.go arch.MAXWIDTH initialization, but must also
	// be constrained to max +ve int.
	vdsoArrayMax = 1<<31 - 1
)

var sym_keys = []symbol_key{
	{"__vdso_clock_gettime", 0xd35ec75, 0x6e43a318, &__vdso_clock_gettime_sym},
}

// initialize to fall back to syscall
var (
	__vdso_clock_gettime_sym uintptr = 0
)
