2019-05-27 14:55:05 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* 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>
|
2008-04-29 16:04:08 +08:00
|
|
|
#include <linux/kbuild.h>
|
2020-06-09 12:32:38 +08:00
|
|
|
#include <linux/pgtable.h>
|
2020-06-09 12:32:42 +08:00
|
|
|
|
2021-10-05 05:46:23 +08:00
|
|
|
#include <asm/assembly.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <asm/ptrace.h>
|
|
|
|
#include <asm/processor.h>
|
|
|
|
#include <asm/pdc.h>
|
2016-12-25 03:46:01 +08:00
|
|
|
#include <linux/uaccess.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2010-04-01 04:42:33 +08:00
|
|
|
/* 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)))
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
2021-10-15 16:41:03 +08:00
|
|
|
DEFINE(TASK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags));
|
2022-01-07 21:05:11 +08:00
|
|
|
#ifdef CONFIG_SMP
|
|
|
|
DEFINE(TASK_TI_CPU, offsetof(struct task_struct, thread_info.cpu));
|
|
|
|
#endif
|
2021-10-15 16:41:03 +08:00
|
|
|
DEFINE(TASK_STACK, offsetof(struct task_struct, stack));
|
parisc: Rewrite light-weight syscall and futex code
The parisc architecture lacks general hardware support for compare and swap.
Particularly for userspace, it is difficult to implement software atomic
support. Page faults in critical regions can cause processes to sleep and
block the forward progress of other processes. Thus, it is essential that
page faults be disabled in critical regions. For performance reasons, we
also need to disable external interrupts in critical regions.
In order to do this, we need a mechanism to trigger COW breaks outside the
critical region. Fortunately, parisc has the "stbys,e" instruction. When
the leftmost byte of a word is addressed, this instruction triggers all
the exceptions of a normal store but it does not write to memory. Thus,
we can use it to trigger COW breaks outside the critical region without
modifying the data that is to be updated atomically.
COW breaks occur randomly. So even if we have priviously executed a "stbys,e"
instruction, we still need to disable pagefaults around the critical region.
If a fault occurs in the critical region, we return -EAGAIN. I had to add
a wrapper around _arch_futex_atomic_op_inuser() as I found in testing that
returning -EAGAIN caused problems for some processes even though it is
listed as a possible return value.
The patch implements the above. The code no longer attempts to sleep with
interrupts disabled and I haven't seen any stalls with the change.
I have attempted to merge common code and streamline the fast path. In the
futex code, we only compute the spinlock address once.
I eliminated some debug code in the original CAS routine that just made the
flow more complicated.
I don't clip the arguments when called from wide mode. As a result, the LWS
routines should work when called from 64-bit processes.
I defined TASK_PAGEFAULT_DISABLED offset for use in the lws_pagefault_disable
and lws_pagefault_enable macros.
Since we now disable interrupts on the gateway page where necessary, it
might be possible to allow processes to be scheduled when they are on the
gateway page.
Change has been tested on c8000 and rp3440. It improves glibc build and test
time by about 10%.
In v2, I removed the lws_atomic_xchg and and lws_atomic_store calls. I
also removed the bug fixes that were not directly related to this patch.
In v3, I removed the code to force interruptions from
arch_futex_atomic_op_inuser(). It is always called with page faults
disabled, so this code had no effect.
In v4, I fixed a typo in depi_safe line.
In v5, I moved the code to disable/enable page faults inside the spinlocks.
Signed-off-by: John David Anglin <dave.anglin@bell.net>
Signed-off-by: Helge Deller <deller@gmx.de>
2022-01-05 05:44:32 +08:00
|
|
|
DEFINE(TASK_PAGEFAULT_DISABLED, offsetof(struct task_struct, pagefault_disabled));
|
2005-04-17 06:20:36 +08:00
|
|
|
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));
|
2010-04-01 04:42:33 +08:00
|
|
|
/* PT_SZ_ALGN includes space for a stack frame. */
|
|
|
|
DEFINE(PT_SZ_ALGN, align_frame(sizeof(struct pt_regs), FRAME_ALIGN));
|
2005-04-17 06:20:36 +08:00
|
|
|
BLANK();
|
|
|
|
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
2021-10-15 16:41:03 +08:00
|
|
|
DEFINE(TI_PRE_COUNT, offsetof(struct task_struct, thread_info.preempt_count));
|
2005-04-17 06:20:36 +08:00
|
|
|
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();
|
2009-09-28 11:03:02 +08:00
|
|
|
DEFINE(TIF_BLOCKSTEP_PA_BIT, 31-TIF_BLOCKSTEP);
|
|
|
|
DEFINE(TIF_SINGLESTEP_PA_BIT, 31-TIF_SINGLESTEP);
|
2005-04-17 06:20:36 +08:00
|
|
|
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);
|
2006-04-21 04:40:23 +08:00
|
|
|
DEFINE(ASM_PFN_PTE_SHIFT, PFN_PTE_SHIFT);
|
2005-04-17 06:20:36 +08:00
|
|
|
DEFINE(ASM_PT_INITIAL, PT_INITIAL);
|
2015-11-22 07:07:44 +08:00
|
|
|
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
|
2008-07-29 10:52:18 +08:00
|
|
|
BLANK();
|
|
|
|
DEFINE(ASM_PDC_RESULT_SIZE, NUM_PDC_RESULT * sizeof(unsigned long));
|
|
|
|
BLANK();
|
2005-04-17 06:20:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|