arch/powerpc/include/asm/ppc_asm.h

Source file repositories/reference/linux-study-clean/arch/powerpc/include/asm/ppc_asm.h

File Facts

System
Linux kernel
Corpus path
arch/powerpc/include/asm/ppc_asm.h
Extension
.h
Size
23685 bytes
Lines
907
Domain
Architecture Layer
Bucket
arch/powerpc
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

#ifndef _ASM_POWERPC_PPC_ASM_H
#define _ASM_POWERPC_PPC_ASM_H

#include <linux/stringify.h>
#include <asm/asm-compat.h>
#include <asm/processor.h>
#include <asm/ppc-opcode.h>
#include <asm/firmware.h>
#include <asm/feature-fixups.h>
#include <asm/extable.h>

#ifdef __ASSEMBLER__

#define SZL			(BITS_PER_LONG/8)

/*
 * This expands to a sequence of operations with reg incrementing from
 * start to end inclusive, of this form:
 *
 *   op  reg, (offset + (width * reg))(base)
 *
 * Note that offset is not the offset of the first operation unless start
 * is zero (or width is zero).
 */
.macro OP_REGS op, width, start, end, base, offset
	.Lreg=\start
	.rept (\end - \start + 1)
	\op	.Lreg, \offset + \width * .Lreg(\base)
	.Lreg=.Lreg+1
	.endr
.endm

/*
 * This expands to a sequence of register clears for regs start to end
 * inclusive, of the form:
 *
 *   li rN, 0
 */
.macro ZEROIZE_REGS start, end
	.Lreg=\start
	.rept (\end - \start + 1)
	li	.Lreg, 0
	.Lreg=.Lreg+1
	.endr
.endm

/*
 * Macros for storing registers into and loading registers from
 * exception frames.
 */
#ifdef __powerpc64__
#define SAVE_GPRS(start, end, base)	OP_REGS std, 8, start, end, base, GPR0
#define REST_GPRS(start, end, base)	OP_REGS ld, 8, start, end, base, GPR0
#define SAVE_NVGPRS(base)		SAVE_GPRS(14, 31, base)
#define REST_NVGPRS(base)		REST_GPRS(14, 31, base)
#else
#define SAVE_GPRS(start, end, base)	OP_REGS stw, 4, start, end, base, GPR0
#define REST_GPRS(start, end, base)	OP_REGS lwz, 4, start, end, base, GPR0
#define SAVE_NVGPRS(base)		SAVE_GPRS(13, 31, base)
#define REST_NVGPRS(base)		REST_GPRS(13, 31, base)
#endif

#define	ZEROIZE_GPRS(start, end)	ZEROIZE_REGS start, end
#ifdef __powerpc64__
#define	ZEROIZE_NVGPRS()		ZEROIZE_GPRS(14, 31)
#else
#define	ZEROIZE_NVGPRS()		ZEROIZE_GPRS(13, 31)
#endif
#define	ZEROIZE_GPR(n)			ZEROIZE_GPRS(n, n)

#define SAVE_GPR(n, base)		SAVE_GPRS(n, n, base)
#define REST_GPR(n, base)		REST_GPRS(n, n, base)

/* macros for handling user register sanitisation */
#ifdef CONFIG_INTERRUPT_SANITIZE_REGISTERS
#define SANITIZE_SYSCALL_GPRS()			ZEROIZE_GPR(0);		\
						ZEROIZE_GPRS(5, 12);	\
						ZEROIZE_NVGPRS()
#define SANITIZE_GPR(n)				ZEROIZE_GPR(n)
#define SANITIZE_GPRS(start, end)		ZEROIZE_GPRS(start, end)
#define SANITIZE_NVGPRS()			ZEROIZE_NVGPRS()
#define SANITIZE_RESTORE_NVGPRS()		REST_NVGPRS(r1)
#define HANDLER_RESTORE_NVGPRS()
#else
#define SANITIZE_SYSCALL_GPRS()
#define SANITIZE_GPR(n)
#define SANITIZE_GPRS(start, end)
#define SANITIZE_NVGPRS()
#define SANITIZE_RESTORE_NVGPRS()
#define HANDLER_RESTORE_NVGPRS()		REST_NVGPRS(r1)

Annotation

Implementation Notes