void __init vdso_init(void) { int i; vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT; vdso32_pages = (&vdso32_end - &vdso32_start) >> PAGE_SHIFT; DBG("vdso64_kbase: %p, 0x%x pages, vdso32_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages, vdso32_kbase, vdso32_pages); /* * Initialize the vDSO images in memory, that is do necessary * fixups of vDSO symbols, locate trampolines, etc... */ if (vdso_setup()) { printk(KERN_ERR "vDSO setup failure, not enabled !\n"); /* XXX should free pages here ? */ vdso64_pages = vdso32_pages = 0; return; } /* Make sure pages are in the correct state */ for (i = 0; i < vdso64_pages; i++) { struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE); ClearPageReserved(pg); get_page(pg); } for (i = 0; i < vdso32_pages; i++) { struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE); ClearPageReserved(pg); get_page(pg); } }
static int __init vdso_init(void) { int data_pages = sizeof(vdso_data_store) >> PAGE_SHIFT; /* * We can disable vDSO support generally, but we need to retain * one page to support the two-bundle (16-byte) rt_sigreturn path. */ if (!vdso_enabled) { size_t offset = (unsigned long)&__vdso_rt_sigreturn; static struct page *sigret_page; sigret_page = alloc_page(GFP_KERNEL | __GFP_ZERO); BUG_ON(sigret_page == NULL); vdso_pagelist = &sigret_page; vdso_pages = 1; BUG_ON(offset >= PAGE_SIZE); memcpy(page_address(sigret_page) + offset, vdso_start + offset, 16); #ifdef CONFIG_COMPAT vdso32_pages = vdso_pages; vdso32_pagelist = vdso_pagelist; #endif vdso_ready = 1; return 0; } vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT; vdso_pages += data_pages; vdso_pagelist = vdso_setup(vdso_start, vdso_pages); #ifdef CONFIG_COMPAT vdso32_pages = (vdso32_end - vdso32_start) >> PAGE_SHIFT; vdso32_pages += data_pages; vdso32_pagelist = vdso_setup(vdso32_start, vdso32_pages); #endif smp_wmb(); vdso_ready = 1; return 0; }