vdso_info
vdso_text_len = vdso_info[abi].vdso_pages << PAGE_SHIFT;
vdso_info[abi].cm);
vdso_info[VDSO_ABI_AA32].cm = &aarch32_vdso_maps[AA32_MAP_VDSO];
vdso_info[VDSO_ABI_AA64].cm = &aarch64_vdso_map;
static struct vdso_abi_info vdso_info[] __ro_after_init = {
if (memcmp(vdso_info[abi].vdso_code_start, "\177ELF", 4)) {
vdso_info[abi].vdso_pages = (
vdso_info[abi].vdso_code_end -
vdso_info[abi].vdso_code_start) >>
vdso_pagelist = kzalloc_objs(struct page *, vdso_info[abi].vdso_pages);
pfn = sym_to_pfn(vdso_info[abi].vdso_code_start);
for (i = 0; i < vdso_info[abi].vdso_pages; i++)
vdso_info[abi].cm->pages = vdso_pagelist;
current->thread.vdso = &vdso_info; \
current->thread.vdso = &vdso_info; \
extern struct loongarch_vdso_info vdso_info;
struct loongarch_vdso_info vdso_info = {
BUG_ON(!PAGE_ALIGNED(vdso_info.vdso));
vdso_info.size = PAGE_ALIGN(vdso_end - vdso_start);
vdso_info.code_mapping.pages =
kzalloc_objs(struct page *, vdso_info.size / PAGE_SIZE);
if (!vdso_info.code_mapping.pages)
pfn = __phys_to_pfn(__pa_symbol(vdso_info.vdso));
for (i = 0; i < vdso_info.size / PAGE_SIZE; i++)
vdso_info.code_mapping.pages[i] = pfn_to_page(pfn + i);
vdso_info.vdso_code_start = vdso_cfi_start;
vdso_info.vdso_code_end = vdso_cfi_end;
__vdso_init(&vdso_info);
struct __vdso_info *vdso_info)
vdso_text_len = vdso_info->vdso_pages << PAGE_SHIFT;
vdso_info->cm);
ret = __setup_additional_pages(mm, bprm, uses_interp, &vdso_info);
static struct __vdso_info vdso_info;
static void __init __vdso_init(struct __vdso_info *vdso_info)
if (memcmp(vdso_info->vdso_code_start, "\177ELF", 4))
vdso_info->vdso_pages = (
vdso_info->vdso_code_end -
vdso_info->vdso_code_start) >>
vdso_pagelist = kzalloc_objs(struct page *, vdso_info->vdso_pages);
pfn = sym_to_pfn(vdso_info->vdso_code_start);
for (i = 0; i < vdso_info->vdso_pages; i++)
vdso_info->cm->pages = vdso_pagelist;
static struct __vdso_info vdso_info __ro_after_init = {
machine->vdso_info = NULL;
struct vdso_info;
struct vdso_info *vdso_info;
struct vdso_info *vdso_info = machine->vdso_info;
if (!vdso_info)
if (vdso_info->vdso.found)
unlink(vdso_info->vdso.temp_file_name);
if (vdso_info->vdso32.found)
unlink(vdso_info->vdso32.temp_file_name);
if (vdso_info->vdsox32.found)
unlink(vdso_info->vdsox32.temp_file_name);
zfree(&machine->vdso_info);
struct vdso_info *vdso_info,
*dso = __machine__findnew_compat(machine, &vdso_info->vdso32);
*dso = __machine__findnew_compat(machine, &vdso_info->vdsox32);
struct vdso_info *vdso_info;
if (!machine->vdso_info)
machine->vdso_info = vdso_info__new();
vdso_info = machine->vdso_info;
if (!vdso_info)
if (__machine__findnew_vdso_compat(machine, thread, vdso_info, &dso))
file = get_file(&vdso_info->vdso);
static struct vdso_info *vdso_info__new(void)
static const struct vdso_info vdso_info_init = {
vdso_info.valid = false;
vdso_info.load_addr = base;
ELF(Phdr) *pt = (ELF(Phdr)*)(vdso_info.load_addr + hdr->e_phoff);
vdso_info.load_offset = base
vdso_info.symstrings = 0;
vdso_info.gnu_hash = 0;
vdso_info.symtab = 0;
vdso_info.versym = 0;
vdso_info.verdef = 0;
vdso_info.symstrings = (const char *)
+ vdso_info.load_offset);
vdso_info.symtab = (ELF(Sym) *)
+ vdso_info.load_offset);
+ vdso_info.load_offset);
vdso_info.gnu_hash =
vdso_info.load_offset);
vdso_info.versym = (ELF(Versym) *)
+ vdso_info.load_offset);
vdso_info.verdef = (ELF(Verdef) *)
+ vdso_info.load_offset);
if (!vdso_info.symstrings || !vdso_info.symtab ||
(!hash && !vdso_info.gnu_hash))
if (!vdso_info.verdef)
vdso_info.versym = 0;
if (vdso_info.gnu_hash) {
vdso_info.nbucket = vdso_info.gnu_hash[0];
vdso_info.gnu_bucket = vdso_info.gnu_hash + 4 +
sizeof(size_t) / 4 * vdso_info.gnu_hash[2];
vdso_info.nbucket = hash[0];
vdso_info.nchain = hash[1];
vdso_info.bucket = &hash[2];
vdso_info.chain = &hash[vdso_info.nbucket + 2];
vdso_info.valid = true;
ELF(Verdef) *def = vdso_info.verdef;
&& !strcmp(name, vdso_info.symstrings + aux->vda_name);
if (strcmp(name, vdso_info.symstrings + sym->st_name))
if (vdso_info.versym &&
!vdso_match_version(vdso_info.versym[i], version, ver_hash))
if (!vdso_info.valid)
if (vdso_info.gnu_hash) {
i = vdso_info.gnu_bucket[h1 % vdso_info.nbucket];
hashval = vdso_info.gnu_bucket + vdso_info.nbucket +
(i - vdso_info.gnu_hash[1]);
ELF(Sym) *sym = &vdso_info.symtab[i];
return (void *)(vdso_info.load_offset +
i = vdso_info.bucket[elf_hash(name) % vdso_info.nbucket];
for (; i; i = vdso_info.chain[i]) {
ELF(Sym) *sym = &vdso_info.symtab[i];
return (void *)(vdso_info.load_offset +
} vdso_info;