df24e1783e
Add minimal vDSO support, which provides the signal trampoline helpers, but none of the userspace syscall helpers like time wrappers. The big benefit of this vDSO implementation is, that we now don't need an executeable stack any longer. PA-RISC is one of the last architectures where an executeable stack was needed in oder to implement the signal trampolines by putting assembly instructions on the stack which then gets executed. Instead the kernel will provide the relevant code in the vDSO page and only put the pointers to the signal information on the stack. By dropping the need for executable stacks we avoid running into issues with applications which want non executable stacks for security reasons. Additionally, alternative stacks on memory areas without exec permissions are supported too. This code is based on an initial implementation by Randolph Chung from 2006: https://lore.kernel.org/linux-parisc/4544A34A.6080700@tausq.org/ I did the porting and lifted the code to current code base. Dave fixed the unwind code so that gdb and glibc are able to backtrace through the code. An additional patch to gdb will be pushed upstream by Dave. Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Dave Anglin <dave.anglin@bell.net> Cc: Randolph Chung <randolph@tausq.org> Signed-off-by: Helge Deller <deller@gmx.de>
281 lines
15 KiB
C
281 lines
15 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Generate definitions needed by assembly language modules.
|
|
* This code generates raw asm output which is post-processed to extract
|
|
* and format the required data.
|
|
*
|
|
* Copyright (C) 2000-2001 John Marvin <jsm at parisc-linux.org>
|
|
* Copyright (C) 2000 David Huggins-Daines <dhd with pobox.org>
|
|
* Copyright (C) 2000 Sam Creasey <sammy@sammy.net>
|
|
* Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org>
|
|
* Copyright (C) 2001 Paul Bame <bame at parisc-linux.org>
|
|
* Copyright (C) 2001 Richard Hirst <rhirst at parisc-linux.org>
|
|
* Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org>
|
|
* Copyright (C) 2003 James Bottomley <jejb at parisc-linux.org>
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/thread_info.h>
|
|
#include <linux/ptrace.h>
|
|
#include <linux/hardirq.h>
|
|
#include <linux/kbuild.h>
|
|
#include <linux/pgtable.h>
|
|
|
|
#include <asm/assembly.h>
|
|
#include <asm/ptrace.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/pdc.h>
|
|
#include <uapi/asm/sigcontext.h>
|
|
#include <asm/ucontext.h>
|
|
#include <asm/rt_sigframe.h>
|
|
#include <linux/uaccess.h>
|
|
#include "signal32.h"
|
|
|
|
/* Add FRAME_SIZE to the size x and align it to y. All definitions
|
|
* that use align_frame will include space for a frame.
|
|
*/
|
|
#define align_frame(x,y) (((x)+FRAME_SIZE+(y)-1) - (((x)+(y)-1)%(y)))
|
|
|
|
int main(void)
|
|
{
|
|
DEFINE(TASK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags));
|
|
#ifdef CONFIG_SMP
|
|
DEFINE(TASK_TI_CPU, offsetof(struct task_struct, thread_info.cpu));
|
|
#endif
|
|
DEFINE(TASK_STACK, offsetof(struct task_struct, stack));
|
|
DEFINE(TASK_PAGEFAULT_DISABLED, offsetof(struct task_struct, pagefault_disabled));
|
|
BLANK();
|
|
DEFINE(TASK_REGS, offsetof(struct task_struct, thread.regs));
|
|
DEFINE(TASK_PT_PSW, offsetof(struct task_struct, thread.regs.gr[ 0]));
|
|
DEFINE(TASK_PT_GR1, offsetof(struct task_struct, thread.regs.gr[ 1]));
|
|
DEFINE(TASK_PT_GR2, offsetof(struct task_struct, thread.regs.gr[ 2]));
|
|
DEFINE(TASK_PT_GR3, offsetof(struct task_struct, thread.regs.gr[ 3]));
|
|
DEFINE(TASK_PT_GR4, offsetof(struct task_struct, thread.regs.gr[ 4]));
|
|
DEFINE(TASK_PT_GR5, offsetof(struct task_struct, thread.regs.gr[ 5]));
|
|
DEFINE(TASK_PT_GR6, offsetof(struct task_struct, thread.regs.gr[ 6]));
|
|
DEFINE(TASK_PT_GR7, offsetof(struct task_struct, thread.regs.gr[ 7]));
|
|
DEFINE(TASK_PT_GR8, offsetof(struct task_struct, thread.regs.gr[ 8]));
|
|
DEFINE(TASK_PT_GR9, offsetof(struct task_struct, thread.regs.gr[ 9]));
|
|
DEFINE(TASK_PT_GR10, offsetof(struct task_struct, thread.regs.gr[10]));
|
|
DEFINE(TASK_PT_GR11, offsetof(struct task_struct, thread.regs.gr[11]));
|
|
DEFINE(TASK_PT_GR12, offsetof(struct task_struct, thread.regs.gr[12]));
|
|
DEFINE(TASK_PT_GR13, offsetof(struct task_struct, thread.regs.gr[13]));
|
|
DEFINE(TASK_PT_GR14, offsetof(struct task_struct, thread.regs.gr[14]));
|
|
DEFINE(TASK_PT_GR15, offsetof(struct task_struct, thread.regs.gr[15]));
|
|
DEFINE(TASK_PT_GR16, offsetof(struct task_struct, thread.regs.gr[16]));
|
|
DEFINE(TASK_PT_GR17, offsetof(struct task_struct, thread.regs.gr[17]));
|
|
DEFINE(TASK_PT_GR18, offsetof(struct task_struct, thread.regs.gr[18]));
|
|
DEFINE(TASK_PT_GR19, offsetof(struct task_struct, thread.regs.gr[19]));
|
|
DEFINE(TASK_PT_GR20, offsetof(struct task_struct, thread.regs.gr[20]));
|
|
DEFINE(TASK_PT_GR21, offsetof(struct task_struct, thread.regs.gr[21]));
|
|
DEFINE(TASK_PT_GR22, offsetof(struct task_struct, thread.regs.gr[22]));
|
|
DEFINE(TASK_PT_GR23, offsetof(struct task_struct, thread.regs.gr[23]));
|
|
DEFINE(TASK_PT_GR24, offsetof(struct task_struct, thread.regs.gr[24]));
|
|
DEFINE(TASK_PT_GR25, offsetof(struct task_struct, thread.regs.gr[25]));
|
|
DEFINE(TASK_PT_GR26, offsetof(struct task_struct, thread.regs.gr[26]));
|
|
DEFINE(TASK_PT_GR27, offsetof(struct task_struct, thread.regs.gr[27]));
|
|
DEFINE(TASK_PT_GR28, offsetof(struct task_struct, thread.regs.gr[28]));
|
|
DEFINE(TASK_PT_GR29, offsetof(struct task_struct, thread.regs.gr[29]));
|
|
DEFINE(TASK_PT_GR30, offsetof(struct task_struct, thread.regs.gr[30]));
|
|
DEFINE(TASK_PT_GR31, offsetof(struct task_struct, thread.regs.gr[31]));
|
|
DEFINE(TASK_PT_FR0, offsetof(struct task_struct, thread.regs.fr[ 0]));
|
|
DEFINE(TASK_PT_FR1, offsetof(struct task_struct, thread.regs.fr[ 1]));
|
|
DEFINE(TASK_PT_FR2, offsetof(struct task_struct, thread.regs.fr[ 2]));
|
|
DEFINE(TASK_PT_FR3, offsetof(struct task_struct, thread.regs.fr[ 3]));
|
|
DEFINE(TASK_PT_FR4, offsetof(struct task_struct, thread.regs.fr[ 4]));
|
|
DEFINE(TASK_PT_FR5, offsetof(struct task_struct, thread.regs.fr[ 5]));
|
|
DEFINE(TASK_PT_FR6, offsetof(struct task_struct, thread.regs.fr[ 6]));
|
|
DEFINE(TASK_PT_FR7, offsetof(struct task_struct, thread.regs.fr[ 7]));
|
|
DEFINE(TASK_PT_FR8, offsetof(struct task_struct, thread.regs.fr[ 8]));
|
|
DEFINE(TASK_PT_FR9, offsetof(struct task_struct, thread.regs.fr[ 9]));
|
|
DEFINE(TASK_PT_FR10, offsetof(struct task_struct, thread.regs.fr[10]));
|
|
DEFINE(TASK_PT_FR11, offsetof(struct task_struct, thread.regs.fr[11]));
|
|
DEFINE(TASK_PT_FR12, offsetof(struct task_struct, thread.regs.fr[12]));
|
|
DEFINE(TASK_PT_FR13, offsetof(struct task_struct, thread.regs.fr[13]));
|
|
DEFINE(TASK_PT_FR14, offsetof(struct task_struct, thread.regs.fr[14]));
|
|
DEFINE(TASK_PT_FR15, offsetof(struct task_struct, thread.regs.fr[15]));
|
|
DEFINE(TASK_PT_FR16, offsetof(struct task_struct, thread.regs.fr[16]));
|
|
DEFINE(TASK_PT_FR17, offsetof(struct task_struct, thread.regs.fr[17]));
|
|
DEFINE(TASK_PT_FR18, offsetof(struct task_struct, thread.regs.fr[18]));
|
|
DEFINE(TASK_PT_FR19, offsetof(struct task_struct, thread.regs.fr[19]));
|
|
DEFINE(TASK_PT_FR20, offsetof(struct task_struct, thread.regs.fr[20]));
|
|
DEFINE(TASK_PT_FR21, offsetof(struct task_struct, thread.regs.fr[21]));
|
|
DEFINE(TASK_PT_FR22, offsetof(struct task_struct, thread.regs.fr[22]));
|
|
DEFINE(TASK_PT_FR23, offsetof(struct task_struct, thread.regs.fr[23]));
|
|
DEFINE(TASK_PT_FR24, offsetof(struct task_struct, thread.regs.fr[24]));
|
|
DEFINE(TASK_PT_FR25, offsetof(struct task_struct, thread.regs.fr[25]));
|
|
DEFINE(TASK_PT_FR26, offsetof(struct task_struct, thread.regs.fr[26]));
|
|
DEFINE(TASK_PT_FR27, offsetof(struct task_struct, thread.regs.fr[27]));
|
|
DEFINE(TASK_PT_FR28, offsetof(struct task_struct, thread.regs.fr[28]));
|
|
DEFINE(TASK_PT_FR29, offsetof(struct task_struct, thread.regs.fr[29]));
|
|
DEFINE(TASK_PT_FR30, offsetof(struct task_struct, thread.regs.fr[30]));
|
|
DEFINE(TASK_PT_FR31, offsetof(struct task_struct, thread.regs.fr[31]));
|
|
DEFINE(TASK_PT_SR0, offsetof(struct task_struct, thread.regs.sr[ 0]));
|
|
DEFINE(TASK_PT_SR1, offsetof(struct task_struct, thread.regs.sr[ 1]));
|
|
DEFINE(TASK_PT_SR2, offsetof(struct task_struct, thread.regs.sr[ 2]));
|
|
DEFINE(TASK_PT_SR3, offsetof(struct task_struct, thread.regs.sr[ 3]));
|
|
DEFINE(TASK_PT_SR4, offsetof(struct task_struct, thread.regs.sr[ 4]));
|
|
DEFINE(TASK_PT_SR5, offsetof(struct task_struct, thread.regs.sr[ 5]));
|
|
DEFINE(TASK_PT_SR6, offsetof(struct task_struct, thread.regs.sr[ 6]));
|
|
DEFINE(TASK_PT_SR7, offsetof(struct task_struct, thread.regs.sr[ 7]));
|
|
DEFINE(TASK_PT_IASQ0, offsetof(struct task_struct, thread.regs.iasq[0]));
|
|
DEFINE(TASK_PT_IASQ1, offsetof(struct task_struct, thread.regs.iasq[1]));
|
|
DEFINE(TASK_PT_IAOQ0, offsetof(struct task_struct, thread.regs.iaoq[0]));
|
|
DEFINE(TASK_PT_IAOQ1, offsetof(struct task_struct, thread.regs.iaoq[1]));
|
|
DEFINE(TASK_PT_CR27, offsetof(struct task_struct, thread.regs.cr27));
|
|
DEFINE(TASK_PT_ORIG_R28, offsetof(struct task_struct, thread.regs.orig_r28));
|
|
DEFINE(TASK_PT_KSP, offsetof(struct task_struct, thread.regs.ksp));
|
|
DEFINE(TASK_PT_KPC, offsetof(struct task_struct, thread.regs.kpc));
|
|
DEFINE(TASK_PT_SAR, offsetof(struct task_struct, thread.regs.sar));
|
|
DEFINE(TASK_PT_IIR, offsetof(struct task_struct, thread.regs.iir));
|
|
DEFINE(TASK_PT_ISR, offsetof(struct task_struct, thread.regs.isr));
|
|
DEFINE(TASK_PT_IOR, offsetof(struct task_struct, thread.regs.ior));
|
|
BLANK();
|
|
DEFINE(PT_PSW, offsetof(struct pt_regs, gr[ 0]));
|
|
DEFINE(PT_GR1, offsetof(struct pt_regs, gr[ 1]));
|
|
DEFINE(PT_GR2, offsetof(struct pt_regs, gr[ 2]));
|
|
DEFINE(PT_GR3, offsetof(struct pt_regs, gr[ 3]));
|
|
DEFINE(PT_GR4, offsetof(struct pt_regs, gr[ 4]));
|
|
DEFINE(PT_GR5, offsetof(struct pt_regs, gr[ 5]));
|
|
DEFINE(PT_GR6, offsetof(struct pt_regs, gr[ 6]));
|
|
DEFINE(PT_GR7, offsetof(struct pt_regs, gr[ 7]));
|
|
DEFINE(PT_GR8, offsetof(struct pt_regs, gr[ 8]));
|
|
DEFINE(PT_GR9, offsetof(struct pt_regs, gr[ 9]));
|
|
DEFINE(PT_GR10, offsetof(struct pt_regs, gr[10]));
|
|
DEFINE(PT_GR11, offsetof(struct pt_regs, gr[11]));
|
|
DEFINE(PT_GR12, offsetof(struct pt_regs, gr[12]));
|
|
DEFINE(PT_GR13, offsetof(struct pt_regs, gr[13]));
|
|
DEFINE(PT_GR14, offsetof(struct pt_regs, gr[14]));
|
|
DEFINE(PT_GR15, offsetof(struct pt_regs, gr[15]));
|
|
DEFINE(PT_GR16, offsetof(struct pt_regs, gr[16]));
|
|
DEFINE(PT_GR17, offsetof(struct pt_regs, gr[17]));
|
|
DEFINE(PT_GR18, offsetof(struct pt_regs, gr[18]));
|
|
DEFINE(PT_GR19, offsetof(struct pt_regs, gr[19]));
|
|
DEFINE(PT_GR20, offsetof(struct pt_regs, gr[20]));
|
|
DEFINE(PT_GR21, offsetof(struct pt_regs, gr[21]));
|
|
DEFINE(PT_GR22, offsetof(struct pt_regs, gr[22]));
|
|
DEFINE(PT_GR23, offsetof(struct pt_regs, gr[23]));
|
|
DEFINE(PT_GR24, offsetof(struct pt_regs, gr[24]));
|
|
DEFINE(PT_GR25, offsetof(struct pt_regs, gr[25]));
|
|
DEFINE(PT_GR26, offsetof(struct pt_regs, gr[26]));
|
|
DEFINE(PT_GR27, offsetof(struct pt_regs, gr[27]));
|
|
DEFINE(PT_GR28, offsetof(struct pt_regs, gr[28]));
|
|
DEFINE(PT_GR29, offsetof(struct pt_regs, gr[29]));
|
|
DEFINE(PT_GR30, offsetof(struct pt_regs, gr[30]));
|
|
DEFINE(PT_GR31, offsetof(struct pt_regs, gr[31]));
|
|
DEFINE(PT_FR0, offsetof(struct pt_regs, fr[ 0]));
|
|
DEFINE(PT_FR1, offsetof(struct pt_regs, fr[ 1]));
|
|
DEFINE(PT_FR2, offsetof(struct pt_regs, fr[ 2]));
|
|
DEFINE(PT_FR3, offsetof(struct pt_regs, fr[ 3]));
|
|
DEFINE(PT_FR4, offsetof(struct pt_regs, fr[ 4]));
|
|
DEFINE(PT_FR5, offsetof(struct pt_regs, fr[ 5]));
|
|
DEFINE(PT_FR6, offsetof(struct pt_regs, fr[ 6]));
|
|
DEFINE(PT_FR7, offsetof(struct pt_regs, fr[ 7]));
|
|
DEFINE(PT_FR8, offsetof(struct pt_regs, fr[ 8]));
|
|
DEFINE(PT_FR9, offsetof(struct pt_regs, fr[ 9]));
|
|
DEFINE(PT_FR10, offsetof(struct pt_regs, fr[10]));
|
|
DEFINE(PT_FR11, offsetof(struct pt_regs, fr[11]));
|
|
DEFINE(PT_FR12, offsetof(struct pt_regs, fr[12]));
|
|
DEFINE(PT_FR13, offsetof(struct pt_regs, fr[13]));
|
|
DEFINE(PT_FR14, offsetof(struct pt_regs, fr[14]));
|
|
DEFINE(PT_FR15, offsetof(struct pt_regs, fr[15]));
|
|
DEFINE(PT_FR16, offsetof(struct pt_regs, fr[16]));
|
|
DEFINE(PT_FR17, offsetof(struct pt_regs, fr[17]));
|
|
DEFINE(PT_FR18, offsetof(struct pt_regs, fr[18]));
|
|
DEFINE(PT_FR19, offsetof(struct pt_regs, fr[19]));
|
|
DEFINE(PT_FR20, offsetof(struct pt_regs, fr[20]));
|
|
DEFINE(PT_FR21, offsetof(struct pt_regs, fr[21]));
|
|
DEFINE(PT_FR22, offsetof(struct pt_regs, fr[22]));
|
|
DEFINE(PT_FR23, offsetof(struct pt_regs, fr[23]));
|
|
DEFINE(PT_FR24, offsetof(struct pt_regs, fr[24]));
|
|
DEFINE(PT_FR25, offsetof(struct pt_regs, fr[25]));
|
|
DEFINE(PT_FR26, offsetof(struct pt_regs, fr[26]));
|
|
DEFINE(PT_FR27, offsetof(struct pt_regs, fr[27]));
|
|
DEFINE(PT_FR28, offsetof(struct pt_regs, fr[28]));
|
|
DEFINE(PT_FR29, offsetof(struct pt_regs, fr[29]));
|
|
DEFINE(PT_FR30, offsetof(struct pt_regs, fr[30]));
|
|
DEFINE(PT_FR31, offsetof(struct pt_regs, fr[31]));
|
|
DEFINE(PT_SR0, offsetof(struct pt_regs, sr[ 0]));
|
|
DEFINE(PT_SR1, offsetof(struct pt_regs, sr[ 1]));
|
|
DEFINE(PT_SR2, offsetof(struct pt_regs, sr[ 2]));
|
|
DEFINE(PT_SR3, offsetof(struct pt_regs, sr[ 3]));
|
|
DEFINE(PT_SR4, offsetof(struct pt_regs, sr[ 4]));
|
|
DEFINE(PT_SR5, offsetof(struct pt_regs, sr[ 5]));
|
|
DEFINE(PT_SR6, offsetof(struct pt_regs, sr[ 6]));
|
|
DEFINE(PT_SR7, offsetof(struct pt_regs, sr[ 7]));
|
|
DEFINE(PT_IASQ0, offsetof(struct pt_regs, iasq[0]));
|
|
DEFINE(PT_IASQ1, offsetof(struct pt_regs, iasq[1]));
|
|
DEFINE(PT_IAOQ0, offsetof(struct pt_regs, iaoq[0]));
|
|
DEFINE(PT_IAOQ1, offsetof(struct pt_regs, iaoq[1]));
|
|
DEFINE(PT_CR27, offsetof(struct pt_regs, cr27));
|
|
DEFINE(PT_ORIG_R28, offsetof(struct pt_regs, orig_r28));
|
|
DEFINE(PT_KSP, offsetof(struct pt_regs, ksp));
|
|
DEFINE(PT_KPC, offsetof(struct pt_regs, kpc));
|
|
DEFINE(PT_SAR, offsetof(struct pt_regs, sar));
|
|
DEFINE(PT_IIR, offsetof(struct pt_regs, iir));
|
|
DEFINE(PT_ISR, offsetof(struct pt_regs, isr));
|
|
DEFINE(PT_IOR, offsetof(struct pt_regs, ior));
|
|
/* PT_SZ_ALGN includes space for a stack frame. */
|
|
DEFINE(PT_SZ_ALGN, align_frame(sizeof(struct pt_regs), FRAME_ALIGN));
|
|
BLANK();
|
|
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
|
DEFINE(TI_PRE_COUNT, offsetof(struct task_struct, thread_info.preempt_count));
|
|
BLANK();
|
|
DEFINE(ASM_SIGFRAME_SIZE, PARISC_RT_SIGFRAME_SIZE);
|
|
DEFINE(SIGFRAME_CONTEXT_REGS, offsetof(struct rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE);
|
|
DEFINE(ASM_SIGFRAME_SIZE32, PARISC_RT_SIGFRAME_SIZE32);
|
|
DEFINE(SIGFRAME_CONTEXT_REGS32, offsetof(struct compat_rt_sigframe, uc.uc_mcontext) - PARISC_RT_SIGFRAME_SIZE32);
|
|
BLANK();
|
|
DEFINE(ICACHE_BASE, offsetof(struct pdc_cache_info, ic_base));
|
|
DEFINE(ICACHE_STRIDE, offsetof(struct pdc_cache_info, ic_stride));
|
|
DEFINE(ICACHE_COUNT, offsetof(struct pdc_cache_info, ic_count));
|
|
DEFINE(ICACHE_LOOP, offsetof(struct pdc_cache_info, ic_loop));
|
|
DEFINE(DCACHE_BASE, offsetof(struct pdc_cache_info, dc_base));
|
|
DEFINE(DCACHE_STRIDE, offsetof(struct pdc_cache_info, dc_stride));
|
|
DEFINE(DCACHE_COUNT, offsetof(struct pdc_cache_info, dc_count));
|
|
DEFINE(DCACHE_LOOP, offsetof(struct pdc_cache_info, dc_loop));
|
|
DEFINE(ITLB_SID_BASE, offsetof(struct pdc_cache_info, it_sp_base));
|
|
DEFINE(ITLB_SID_STRIDE, offsetof(struct pdc_cache_info, it_sp_stride));
|
|
DEFINE(ITLB_SID_COUNT, offsetof(struct pdc_cache_info, it_sp_count));
|
|
DEFINE(ITLB_OFF_BASE, offsetof(struct pdc_cache_info, it_off_base));
|
|
DEFINE(ITLB_OFF_STRIDE, offsetof(struct pdc_cache_info, it_off_stride));
|
|
DEFINE(ITLB_OFF_COUNT, offsetof(struct pdc_cache_info, it_off_count));
|
|
DEFINE(ITLB_LOOP, offsetof(struct pdc_cache_info, it_loop));
|
|
DEFINE(DTLB_SID_BASE, offsetof(struct pdc_cache_info, dt_sp_base));
|
|
DEFINE(DTLB_SID_STRIDE, offsetof(struct pdc_cache_info, dt_sp_stride));
|
|
DEFINE(DTLB_SID_COUNT, offsetof(struct pdc_cache_info, dt_sp_count));
|
|
DEFINE(DTLB_OFF_BASE, offsetof(struct pdc_cache_info, dt_off_base));
|
|
DEFINE(DTLB_OFF_STRIDE, offsetof(struct pdc_cache_info, dt_off_stride));
|
|
DEFINE(DTLB_OFF_COUNT, offsetof(struct pdc_cache_info, dt_off_count));
|
|
DEFINE(DTLB_LOOP, offsetof(struct pdc_cache_info, dt_loop));
|
|
BLANK();
|
|
DEFINE(TIF_BLOCKSTEP_PA_BIT, 31-TIF_BLOCKSTEP);
|
|
DEFINE(TIF_SINGLESTEP_PA_BIT, 31-TIF_SINGLESTEP);
|
|
BLANK();
|
|
DEFINE(ASM_PMD_SHIFT, PMD_SHIFT);
|
|
DEFINE(ASM_PGDIR_SHIFT, PGDIR_SHIFT);
|
|
DEFINE(ASM_BITS_PER_PGD, BITS_PER_PGD);
|
|
DEFINE(ASM_BITS_PER_PMD, BITS_PER_PMD);
|
|
DEFINE(ASM_BITS_PER_PTE, BITS_PER_PTE);
|
|
DEFINE(ASM_PMD_ENTRY, ((PAGE_OFFSET & PMD_MASK) >> PMD_SHIFT));
|
|
DEFINE(ASM_PGD_ENTRY, PAGE_OFFSET >> PGDIR_SHIFT);
|
|
DEFINE(ASM_PGD_ENTRY_SIZE, PGD_ENTRY_SIZE);
|
|
DEFINE(ASM_PMD_ENTRY_SIZE, PMD_ENTRY_SIZE);
|
|
DEFINE(ASM_PTE_ENTRY_SIZE, PTE_ENTRY_SIZE);
|
|
DEFINE(ASM_PFN_PTE_SHIFT, PFN_PTE_SHIFT);
|
|
DEFINE(ASM_PT_INITIAL, PT_INITIAL);
|
|
BLANK();
|
|
/* HUGEPAGE_SIZE is only used in vmlinux.lds.S to align kernel text
|
|
* and kernel data on physical huge pages */
|
|
#ifdef CONFIG_HUGETLB_PAGE
|
|
DEFINE(HUGEPAGE_SIZE, 1UL << REAL_HPAGE_SHIFT);
|
|
#else
|
|
DEFINE(HUGEPAGE_SIZE, PAGE_SIZE);
|
|
#endif
|
|
BLANK();
|
|
DEFINE(ASM_PDC_RESULT_SIZE, NUM_PDC_RESULT * sizeof(unsigned long));
|
|
BLANK();
|
|
return 0;
|
|
}
|