Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
292dcc86
Commit
292dcc86
authored
Oct 02, 2005
by
Paul Mackerras
Browse files
Options
Browse Files
Download
Plain Diff
Merge
rsync://ozlabs.org/sfr-git/for-paulus/
parents
c0c0d996
eeb2d218
Changes
50
Hide whitespace changes
Inline
Side-by-side
Showing
50 changed files
with
953 additions
and
1810 deletions
+953
-1810
arch/powerpc/Kconfig
arch/powerpc/Kconfig
+9
-3
arch/powerpc/Kconfig.debug
arch/powerpc/Kconfig.debug
+1
-1
arch/powerpc/Makefile
arch/powerpc/Makefile
+16
-12
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/Makefile
+17
-3
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/asm-offsets.c
+117
-103
arch/powerpc/kernel/head.S
arch/powerpc/kernel/head.S
+42
-42
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/head_44x.S
+7
-7
arch/powerpc/kernel/head_4xx.S
arch/powerpc/kernel/head_4xx.S
+26
-26
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/head_64.S
+6
-3
arch/powerpc/kernel/head_8xx.S
arch/powerpc/kernel/head_8xx.S
+21
-21
arch/powerpc/kernel/head_fsl_booke.S
arch/powerpc/kernel/head_fsl_booke.S
+12
-12
arch/powerpc/kernel/idle_power4.S
arch/powerpc/kernel/idle_power4.S
+2
-3
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/ppc_ksyms.c
+8
-8
arch/powerpc/kernel/traps.c
arch/powerpc/kernel/traps.c
+305
-102
arch/powerpc/kernel/vmlinux.lds
arch/powerpc/kernel/vmlinux.lds
+0
-174
arch/powerpc/kernel/vmlinux.lds.S
arch/powerpc/kernel/vmlinux.lds.S
+176
-14
arch/powerpc/platforms/iseries/call_sm.h
arch/powerpc/platforms/iseries/call_sm.h
+3
-4
arch/powerpc/platforms/iseries/ipl_parms.h
arch/powerpc/platforms/iseries/ipl_parms.h
+3
-4
arch/powerpc/platforms/iseries/irq.c
arch/powerpc/platforms/iseries/irq.c
+2
-1
arch/powerpc/platforms/iseries/irq.h
arch/powerpc/platforms/iseries/irq.h
+3
-3
arch/powerpc/platforms/iseries/lpardata.c
arch/powerpc/platforms/iseries/lpardata.c
+5
-5
arch/powerpc/platforms/iseries/lparmap.c
arch/powerpc/platforms/iseries/lparmap.c
+0
-0
arch/powerpc/platforms/iseries/lpevents.c
arch/powerpc/platforms/iseries/lpevents.c
+2
-0
arch/powerpc/platforms/iseries/main_store.h
arch/powerpc/platforms/iseries/main_store.h
+3
-4
arch/powerpc/platforms/iseries/pci.c
arch/powerpc/platforms/iseries/pci.c
+2
-1
arch/powerpc/platforms/iseries/proc.c
arch/powerpc/platforms/iseries/proc.c
+3
-2
arch/powerpc/platforms/iseries/processor_vpd.h
arch/powerpc/platforms/iseries/processor_vpd.h
+3
-4
arch/powerpc/platforms/iseries/release_data.h
arch/powerpc/platforms/iseries/release_data.h
+3
-4
arch/powerpc/platforms/iseries/setup.c
arch/powerpc/platforms/iseries/setup.c
+5
-5
arch/powerpc/platforms/iseries/spcomm_area.h
arch/powerpc/platforms/iseries/spcomm_area.h
+3
-4
arch/powerpc/platforms/iseries/vpd_areas.h
arch/powerpc/platforms/iseries/vpd_areas.h
+3
-4
arch/ppc/kernel/Makefile
arch/ppc/kernel/Makefile
+2
-0
arch/ppc/kernel/fpu.S
arch/ppc/kernel/fpu.S
+0
-133
arch/ppc/kernel/head.S
arch/ppc/kernel/head.S
+42
-42
arch/ppc/kernel/head_44x.S
arch/ppc/kernel/head_44x.S
+7
-7
arch/ppc/kernel/head_4xx.S
arch/ppc/kernel/head_4xx.S
+26
-26
arch/ppc/kernel/head_8xx.S
arch/ppc/kernel/head_8xx.S
+21
-21
arch/ppc/kernel/head_booke.h
arch/ppc/kernel/head_booke.h
+2
-2
arch/ppc/kernel/head_fsl_booke.S
arch/ppc/kernel/head_fsl_booke.S
+12
-12
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/kernel/ppc_ksyms.c
+8
-8
arch/ppc/kernel/traps.c
arch/ppc/kernel/traps.c
+10
-10
arch/ppc/kernel/vector.S
arch/ppc/kernel/vector.S
+0
-217
arch/ppc/syslib/ibm44x_common.c
arch/ppc/syslib/ibm44x_common.c
+1
-1
arch/ppc/syslib/ppc4xx_setup.c
arch/ppc/syslib/ppc4xx_setup.c
+1
-1
arch/ppc64/Makefile
arch/ppc64/Makefile
+1
-1
arch/ppc64/kernel/Makefile
arch/ppc64/kernel/Makefile
+8
-8
arch/ppc64/kernel/traps.c
arch/ppc64/kernel/traps.c
+0
-568
arch/ppc64/kernel/vector.S
arch/ppc64/kernel/vector.S
+0
-172
include/asm-powerpc/system.h
include/asm-powerpc/system.h
+3
-1
include/asm-ppc/system.h
include/asm-ppc/system.h
+1
-1
No files found.
arch/powerpc/Kconfig
View file @
292dcc86
...
...
@@ -142,8 +142,8 @@ config POWER4
def_bool y
config PPC_FPU
bool
def
ault y if PPC64
depends on PPC32
def
_bool y
config BOOKE
bool
...
...
@@ -317,7 +317,7 @@ config PPC_BPA
config PPC_OF
bool
depends on PPC_MULTIPLATFORM
# for now
depends on PPC_MULTIPLATFORM
|| PPC_ISERIES
default y
config XICS
...
...
@@ -833,6 +833,12 @@ config PIN_TLB
depends on ADVANCED_OPTIONS && 8xx
endmenu
if PPC64
config KERNEL_START
hex
default "0xc000000000000000"
endif
source "net/Kconfig"
source "drivers/Kconfig"
...
...
arch/powerpc/Kconfig.debug
View file @
292dcc86
...
...
@@ -55,7 +55,7 @@ config BDI_SWITCH
config BOOTX_TEXT
bool "Support for early boot text console (BootX or OpenFirmware only)"
depends PPC_OF
depends PPC_OF
&& !PPC_ISERIES
help
Say Y here to see progress messages from the boot firmware in text
mode. Requires either BootX or Open Firmware.
...
...
arch/powerpc/Makefile
View file @
292dcc86
...
...
@@ -121,16 +121,17 @@ head-$(CONFIG_FSL_BOOKE) := arch/powerpc/kernel/head_fsl_booke.o
ifeq
($(CONFIG_PPC32),y)
head-$(CONFIG_6xx)
+=
arch
/powerpc/kernel/idle_6xx.o
head-$(CONFIG_POWER4)
+=
arch
/powerpc/kernel/idle_power4.o
head-$(CONFIG_PPC_FPU)
+=
arch
/powerpc/kernel/fpu.o
endif
core-y
+=
arch
/powerpc/kernel/
\
arch
/
$(OLDARCH)
/kernel/
\
arch
/powerpc/mm/
\
arch
/powerpc/lib/
\
arch
/powerpc/sysdev/
\
arch
/powerpc/platforms/
core-y
+=
arch
/powerpc/kernel/
core-y
+=
arch
/
$(OLDARCH)
/kernel/
core-$(CONFIG_PPC32)
+=
arch
/powerpc/mm/
core-$(CONFIG_PPC64)
+=
arch
/
$(OLDARCH)
/mm/
core-$(CONFIG_PPC32)
+=
arch
/powerpc/lib/
libs-$(CONFIG_PPC64)
+=
arch
/
$(OLDARCH)
/lib/
core-y
+=
arch
/powerpc/sysdev/
core-y
+=
arch
/powerpc/platforms/
core-$(CONFIG_PPC32)
+=
arch
/ppc/syslib/
core-$(CONFIG_MATH_EMULATION)
+=
arch
/ppc/math-emu/
core-$(CONFIG_XMON)
+=
arch
/powerpc/xmon/
...
...
@@ -141,17 +142,20 @@ drivers-$(CONFIG_CPM2) += arch/ppc/8260_io/
drivers-$(CONFIG_OPROFILE)
+=
arch
/powerpc/oprofile/
BOOT_TARGETS
=
zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm
.PHONY
:
$(BOOT_TARGETS)
all
:
uImage zImage
defaultimage-$(CONFIG_PPC32)
:=
uImage zImage
defaultimage-$(CONFIG_PPC_ISERIES)
:=
vmlinux
KBUILD_IMAGE
:=
$
(
defaultimage-y
)
all
:
$(KBUILD_IMAGE)
CPPFLAGS_vmlinux.lds
:=
-Upowerpc
# All the instructions talk about "make bzImage".
bzImage
:
zImage
BOOT_TARGETS
=
zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm
.PHONY
:
$(BOOT_TARGETS)
boot
:=
arch
/
$(OLDARCH)
/boot
$(BOOT_TARGETS)
:
vmlinux
...
...
arch/powerpc/kernel/Makefile
View file @
292dcc86
...
...
@@ -2,17 +2,31 @@
# Makefile for the linux kernel.
#
ifeq
($(CONFIG_PPC64),y)
EXTRA_CFLAGS
+=
-mno-minimal-toc
endif
ifeq
($(CONFIG_PPC32),y)
extra-$(CONFIG_PPC_STD_MMU)
:=
head.o
extra_$(CONFIG_PPC64)
:=
head_64.o
endif
extra-$(CONFIG_PPC64)
:=
head_64.o
extra-$(CONFIG_40x)
:=
head_4xx.o
extra-$(CONFIG_44x)
:=
head_44x.o
extra-$(CONFIG_FSL_BOOKE)
:=
head_fsl_booke.o
extra-$(CONFIG_8xx)
:=
head_8xx.o
extra-$(CONFIG_6xx)
+=
idle_6xx.o
extra-$(CONFIG_POWER4)
+=
idle_power4.o
extra-$(CONFIG_PPC_FPU)
+=
fpu.o
extra-y
+=
vmlinux.lds
obj-y
:=
semaphore.o traps.o process.o
obj-y
:=
traps.o
obj-$(CONFIG_PPC32)
+=
semaphore.o process.o
obj-$(CONFIG_PPC64)
+=
idle_power4.o
ifeq
($(CONFIG_PPC32),y)
obj-$(CONFIG_MODULES)
+=
ppc_ksyms.o
endif
obj-$(CONFIG_ALTIVEC)
+=
vecemu.o vector.o
ifeq
($(CONFIG_PPC_ISERIES),y)
arch/powerpc/kernel/head_64.o
:
arch/powerpc/platforms/iseries/lparmap.s
AFLAGS_head_64.o
+=
-Iarch
/powerpc/platforms/iseries
endif
arch/powerpc/kernel/asm-offsets.c
View file @
292dcc86
...
...
@@ -20,17 +20,20 @@
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/ptrace.h>
#include <linux/suspend.h>
#include <linux/mman.h>
#include <linux/mm.h>
#ifdef CONFIG_PPC64
#include <linux/time.h>
#include <linux/hardirq.h>
#else
#include <linux/ptrace.h>
#include <linux/suspend.h>
#endif
#include <asm/io.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/processor.h>
#include <asm/cputable.h>
#include <asm/thread_info.h>
#ifdef CONFIG_PPC64
...
...
@@ -50,63 +53,117 @@
int
main
(
void
)
{
/* thread struct on stack */
DEFINE
(
TI_FLAGS
,
offsetof
(
struct
thread_info
,
flags
));
DEFINE
(
TI_PREEMPT
,
offsetof
(
struct
thread_info
,
preempt_count
));
DEFINE
(
TI_CPU
,
offsetof
(
struct
thread_info
,
cpu
));
#ifdef CONFIG_PPC32
DEFINE
(
TI_LOCAL_FLAGS
,
offsetof
(
struct
thread_info
,
local_flags
));
#endif
DEFINE
(
THREAD
,
offsetof
(
struct
task_struct
,
thread
));
DEFINE
(
MM
,
offsetof
(
struct
task_struct
,
mm
));
#ifdef CONFIG_PPC64
DEFINE
(
TI_SC_NOERR
,
offsetof
(
struct
thread_info
,
syscall_noerror
));
DEFINE
(
THREAD_SHIFT
,
THREAD_SHIFT
);
#endif
DEFINE
(
THREAD_SIZE
,
THREAD_SIZE
);
/* task_struct->thread */
DEFINE
(
THREAD
,
offsetof
(
struct
task_struct
,
thread
));
DEFINE
(
AUDITCONTEXT
,
offsetof
(
struct
task_struct
,
audit_context
));
#else
DEFINE
(
THREAD_INFO
,
offsetof
(
struct
task_struct
,
thread_info
));
DEFINE
(
MM
,
offsetof
(
struct
task_struct
,
mm
));
DEFINE
(
PTRACE
,
offsetof
(
struct
task_struct
,
ptrace
));
#endif
/* CONFIG_PPC64 */
DEFINE
(
KSP
,
offsetof
(
struct
thread_struct
,
ksp
));
DEFINE
(
PGDIR
,
offsetof
(
struct
thread_struct
,
pgdir
));
DEFINE
(
LAST_SYSCALL
,
offsetof
(
struct
thread_struct
,
last_syscall
));
DEFINE
(
PT_REGS
,
offsetof
(
struct
thread_struct
,
regs
));
DEFINE
(
THREAD_FPEXC_MODE
,
offsetof
(
struct
thread_struct
,
fpexc_mode
));
DEFINE
(
THREAD_FPR0
,
offsetof
(
struct
thread_struct
,
fpr
[
0
]));
DEFINE
(
THREAD_FPSCR
,
offsetof
(
struct
thread_struct
,
fpscr
));
#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
DEFINE
(
THREAD_DBCR0
,
offsetof
(
struct
thread_struct
,
dbcr0
));
DEFINE
(
PT_PTRACED
,
PT_PTRACED
);
#endif
#ifdef CONFIG_PPC64
DEFINE
(
KSP_VSID
,
offsetof
(
struct
thread_struct
,
ksp_vsid
));
#endif
#ifdef CONFIG_ALTIVEC
DEFINE
(
THREAD_VR0
,
offsetof
(
struct
thread_struct
,
vr
[
0
]));
DEFINE
(
THREAD_VRSAVE
,
offsetof
(
struct
thread_struct
,
vrsave
));
DEFINE
(
THREAD_VSCR
,
offsetof
(
struct
thread_struct
,
vscr
));
DEFINE
(
THREAD_USED_VR
,
offsetof
(
struct
thread_struct
,
used_vr
));
#endif
/* CONFIG_ALTIVEC */
#ifdef CONFIG_PPC64
DEFINE
(
KSP_VSID
,
offsetof
(
struct
thread_struct
,
ksp_vsid
));
#else
/* CONFIG_PPC64 */
DEFINE
(
PGDIR
,
offsetof
(
struct
thread_struct
,
pgdir
));
DEFINE
(
LAST_SYSCALL
,
offsetof
(
struct
thread_struct
,
last_syscall
));
#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
DEFINE
(
THREAD_DBCR0
,
offsetof
(
struct
thread_struct
,
dbcr0
));
DEFINE
(
PT_PTRACED
,
PT_PTRACED
);
#endif
#ifdef CONFIG_SPE
DEFINE
(
THREAD_EVR0
,
offsetof
(
struct
thread_struct
,
evr
[
0
]));
DEFINE
(
THREAD_ACC
,
offsetof
(
struct
thread_struct
,
acc
));
DEFINE
(
THREAD_SPEFSCR
,
offsetof
(
struct
thread_struct
,
spefscr
));
DEFINE
(
THREAD_USED_SPE
,
offsetof
(
struct
thread_struct
,
used_spe
));
#endif
/* CONFIG_SPE */
#endif
/* CONFIG_PPC64 */
DEFINE
(
TI_FLAGS
,
offsetof
(
struct
thread_info
,
flags
));
DEFINE
(
TI_PREEMPT
,
offsetof
(
struct
thread_info
,
preempt_count
));
#ifdef CONFIG_PPC64
DEFINE
(
TI_SC_NOERR
,
offsetof
(
struct
thread_info
,
syscall_noerror
));
#else
DEFINE
(
TI_TASK
,
offsetof
(
struct
thread_info
,
task
));
DEFINE
(
TI_EXECDOMAIN
,
offsetof
(
struct
thread_info
,
exec_domain
));
DEFINE
(
TI_LOCAL_FLAGS
,
offsetof
(
struct
thread_info
,
local_flags
));
DEFINE
(
TI_CPU
,
offsetof
(
struct
thread_info
,
cpu
));
#endif
/* CONFIG_PPC64 */
#ifdef CONFIG_PPC64
DEFINE
(
DCACHEL1LINESIZE
,
offsetof
(
struct
ppc64_caches
,
dline_size
));
DEFINE
(
DCACHEL1LOGLINESIZE
,
offsetof
(
struct
ppc64_caches
,
log_dline_size
));
DEFINE
(
DCACHEL1LINESPERPAGE
,
offsetof
(
struct
ppc64_caches
,
dlines_per_page
));
DEFINE
(
ICACHEL1LINESIZE
,
offsetof
(
struct
ppc64_caches
,
iline_size
));
DEFINE
(
ICACHEL1LOGLINESIZE
,
offsetof
(
struct
ppc64_caches
,
log_iline_size
));
DEFINE
(
ICACHEL1LINESPERPAGE
,
offsetof
(
struct
ppc64_caches
,
ilines_per_page
));
DEFINE
(
PLATFORM
,
offsetof
(
struct
systemcfg
,
platform
));
/* paca */
DEFINE
(
PACA_SIZE
,
sizeof
(
struct
paca_struct
));
DEFINE
(
PACAPACAINDEX
,
offsetof
(
struct
paca_struct
,
paca_index
));
DEFINE
(
PACAPROCSTART
,
offsetof
(
struct
paca_struct
,
cpu_start
));
DEFINE
(
PACAKSAVE
,
offsetof
(
struct
paca_struct
,
kstack
));
DEFINE
(
PACACURRENT
,
offsetof
(
struct
paca_struct
,
__current
));
DEFINE
(
PACASAVEDMSR
,
offsetof
(
struct
paca_struct
,
saved_msr
));
DEFINE
(
PACASTABREAL
,
offsetof
(
struct
paca_struct
,
stab_real
));
DEFINE
(
PACASTABVIRT
,
offsetof
(
struct
paca_struct
,
stab_addr
));
DEFINE
(
PACASTABRR
,
offsetof
(
struct
paca_struct
,
stab_rr
));
DEFINE
(
PACAR1
,
offsetof
(
struct
paca_struct
,
saved_r1
));
DEFINE
(
PACATOC
,
offsetof
(
struct
paca_struct
,
kernel_toc
));
DEFINE
(
PACAPROCENABLED
,
offsetof
(
struct
paca_struct
,
proc_enabled
));
DEFINE
(
PACASLBCACHE
,
offsetof
(
struct
paca_struct
,
slb_cache
));
DEFINE
(
PACASLBCACHEPTR
,
offsetof
(
struct
paca_struct
,
slb_cache_ptr
));
DEFINE
(
PACACONTEXTID
,
offsetof
(
struct
paca_struct
,
context
.
id
));
#ifdef CONFIG_HUGETLB_PAGE
DEFINE
(
PACALOWHTLBAREAS
,
offsetof
(
struct
paca_struct
,
context
.
low_htlb_areas
));
DEFINE
(
PACAHIGHHTLBAREAS
,
offsetof
(
struct
paca_struct
,
context
.
high_htlb_areas
));
#endif
/* CONFIG_HUGETLB_PAGE */
DEFINE
(
PACADEFAULTDECR
,
offsetof
(
struct
paca_struct
,
default_decr
));
DEFINE
(
PACA_EXGEN
,
offsetof
(
struct
paca_struct
,
exgen
));
DEFINE
(
PACA_EXMC
,
offsetof
(
struct
paca_struct
,
exmc
));
DEFINE
(
PACA_EXSLB
,
offsetof
(
struct
paca_struct
,
exslb
));
DEFINE
(
PACA_EXDSI
,
offsetof
(
struct
paca_struct
,
exdsi
));
DEFINE
(
PACAEMERGSP
,
offsetof
(
struct
paca_struct
,
emergency_sp
));
DEFINE
(
PACALPPACA
,
offsetof
(
struct
paca_struct
,
lppaca
));
DEFINE
(
PACAHWCPUID
,
offsetof
(
struct
paca_struct
,
hw_cpu_id
));
DEFINE
(
LPPACASRR0
,
offsetof
(
struct
lppaca
,
saved_srr0
));
DEFINE
(
LPPACASRR1
,
offsetof
(
struct
lppaca
,
saved_srr1
));
DEFINE
(
LPPACAANYINT
,
offsetof
(
struct
lppaca
,
int_dword
.
any_int
));
DEFINE
(
LPPACADECRINT
,
offsetof
(
struct
lppaca
,
int_dword
.
fields
.
decr_int
));
/* RTAS */
DEFINE
(
RTASBASE
,
offsetof
(
struct
rtas_t
,
base
));
DEFINE
(
RTASENTRY
,
offsetof
(
struct
rtas_t
,
entry
));
#endif
/* CONFIG_PPC64 */
/* Interrupt register frame */
DEFINE
(
STACK_FRAME_OVERHEAD
,
STACK_FRAME_OVERHEAD
);
#ifndef CONFIG_PPC64
DEFINE
(
INT_FRAME_SIZE
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
));
#else
#else
/* CONFIG_PPC64 */
DEFINE
(
SWITCH_FRAME_SIZE
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
));
/* 288 = # of volatile regs, int & fp, for leaf routines */
/* which do not stack a frame. See the PPC64 ABI. */
DEFINE
(
INT_FRAME_SIZE
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
)
+
288
);
#endif
/* in fact we only use gpr0 - gpr9 and gpr20 - gpr23 */
/* Create extra stack space for SRR0 and SRR1 when calling prom/rtas. */
DEFINE
(
PROM_FRAME_SIZE
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
)
+
16
);
DEFINE
(
RTAS_FRAME_SIZE
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
)
+
16
);
#endif
/* CONFIG_PPC64 */
DEFINE
(
GPR0
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
0
]));
DEFINE
(
GPR1
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
1
]));
DEFINE
(
GPR2
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
2
]));
...
...
@@ -121,6 +178,7 @@ int main(void)
DEFINE
(
GPR11
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
11
]));
DEFINE
(
GPR12
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
12
]));
DEFINE
(
GPR13
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
13
]));
#ifndef CONFIG_PPC64
DEFINE
(
GPR14
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
14
]));
DEFINE
(
GPR15
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
15
]));
DEFINE
(
GPR16
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
16
]));
...
...
@@ -139,6 +197,7 @@ int main(void)
DEFINE
(
GPR29
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
29
]));
DEFINE
(
GPR30
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
30
]));
DEFINE
(
GPR31
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
gpr
[
31
]));
#endif
/* CONFIG_PPC64 */
/*
* Note: these symbols include _ because they overlap with special
* register names
...
...
@@ -148,23 +207,37 @@ int main(void)
DEFINE
(
_CTR
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
ctr
));
DEFINE
(
_LINK
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
link
));
DEFINE
(
_CCR
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
ccr
));
DEFINE
(
_MQ
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
mq
));
DEFINE
(
_XER
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
xer
));
DEFINE
(
_DAR
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
dar
));
DEFINE
(
_DSISR
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
dsisr
));
/* The PowerPC 400-class & Book-E processors have neither the DAR nor the DSISR
* SPRs. Hence, we overload them to hold the similar DEAR and ESR SPRs
* for such processors. For critical interrupts we use them to
* hold SRR0 and SRR1.
DEFINE
(
ORIG_GPR3
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
orig_gpr3
));
DEFINE
(
RESULT
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
result
));
#ifndef CONFIG_PPC64
DEFINE
(
_MQ
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
mq
));
/*
* The PowerPC 400-class & Book-E processors have neither the DAR
* nor the DSISR SPRs. Hence, we overload them to hold the similar
* DEAR and ESR SPRs for such processors. For critical interrupts
* we use them to hold SRR0 and SRR1.
*/
DEFINE
(
_DEAR
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
dar
));
DEFINE
(
_ESR
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
dsisr
));
DEFINE
(
ORIG_GPR3
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
orig_gpr3
));
DEFINE
(
RESULT
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
result
));
DEFINE
(
TRAP
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
trap
));
#else
/* CONFIG_PPC64 */
DEFINE
(
_TRAP
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
trap
));
DEFINE
(
SOFTE
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
softe
));
/* These _only_ to be used with {PROM,RTAS}_FRAME_SIZE!!! */
DEFINE
(
_SRR0
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
));
DEFINE
(
_SRR1
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
)
+
8
);
#endif
/* CONFIG_PPC64 */
DEFINE
(
CLONE_VM
,
CLONE_VM
);
DEFINE
(
CLONE_UNTRACED
,
CLONE_UNTRACED
);
#ifndef CONFIG_PPC64
DEFINE
(
MM_PGD
,
offsetof
(
struct
mm_struct
,
pgd
));
#endif
/* ! CONFIG_PPC64 */
/* About the CPU features table */
DEFINE
(
CPU_SPEC_ENTRY_SIZE
,
sizeof
(
struct
cpu_spec
));
...
...
@@ -173,66 +246,13 @@ int main(void)
DEFINE
(
CPU_SPEC_FEATURES
,
offsetof
(
struct
cpu_spec
,
cpu_features
));
DEFINE
(
CPU_SPEC_SETUP
,
offsetof
(
struct
cpu_spec
,
cpu_setup
));
#ifdef CONFIG_PPC64
DEFINE
(
MM
,
offsetof
(
struct
task_struct
,
mm
));
DEFINE
(
AUDITCONTEXT
,
offsetof
(
struct
task_struct
,
audit_context
));
DEFINE
(
DCACHEL1LINESIZE
,
offsetof
(
struct
ppc64_caches
,
dline_size
));
DEFINE
(
DCACHEL1LOGLINESIZE
,
offsetof
(
struct
ppc64_caches
,
log_dline_size
));
DEFINE
(
DCACHEL1LINESPERPAGE
,
offsetof
(
struct
ppc64_caches
,
dlines_per_page
));
DEFINE
(
ICACHEL1LINESIZE
,
offsetof
(
struct
ppc64_caches
,
iline_size
));
DEFINE
(
ICACHEL1LOGLINESIZE
,
offsetof
(
struct
ppc64_caches
,
log_iline_size
));
DEFINE
(
ICACHEL1LINESPERPAGE
,
offsetof
(
struct
ppc64_caches
,
ilines_per_page
));
DEFINE
(
PLATFORM
,
offsetof
(
struct
systemcfg
,
platform
));
/* paca */
DEFINE
(
PACA_SIZE
,
sizeof
(
struct
paca_struct
));
DEFINE
(
PACAPACAINDEX
,
offsetof
(
struct
paca_struct
,
paca_index
));
DEFINE
(
PACAPROCSTART
,
offsetof
(
struct
paca_struct
,
cpu_start
));
DEFINE
(
PACAKSAVE
,
offsetof
(
struct
paca_struct
,
kstack
));
DEFINE
(
PACACURRENT
,
offsetof
(
struct
paca_struct
,
__current
));
DEFINE
(
PACASAVEDMSR
,
offsetof
(
struct
paca_struct
,
saved_msr
));
DEFINE
(
PACASTABREAL
,
offsetof
(
struct
paca_struct
,
stab_real
));
DEFINE
(
PACASTABVIRT
,
offsetof
(
struct
paca_struct
,
stab_addr
));
DEFINE
(
PACASTABRR
,
offsetof
(
struct
paca_struct
,
stab_rr
));
DEFINE
(
PACAR1
,
offsetof
(
struct
paca_struct
,
saved_r1
));
DEFINE
(
PACATOC
,
offsetof
(
struct
paca_struct
,
kernel_toc
));
DEFINE
(
PACAPROCENABLED
,
offsetof
(
struct
paca_struct
,
proc_enabled
));
DEFINE
(
PACASLBCACHE
,
offsetof
(
struct
paca_struct
,
slb_cache
));
DEFINE
(
PACASLBCACHEPTR
,
offsetof
(
struct
paca_struct
,
slb_cache_ptr
));
DEFINE
(
PACACONTEXTID
,
offsetof
(
struct
paca_struct
,
context
.
id
));
#ifdef CONFIG_HUGETLB_PAGE
DEFINE
(
PACALOWHTLBAREAS
,
offsetof
(
struct
paca_struct
,
context
.
low_htlb_areas
));
DEFINE
(
PACAHIGHHTLBAREAS
,
offsetof
(
struct
paca_struct
,
context
.
high_htlb_areas
));
#endif
/* CONFIG_HUGETLB_PAGE */
DEFINE
(
PACADEFAULTDECR
,
offsetof
(
struct
paca_struct
,
default_decr
));
DEFINE
(
PACA_EXGEN
,
offsetof
(
struct
paca_struct
,
exgen
));
DEFINE
(
PACA_EXMC
,
offsetof
(
struct
paca_struct
,
exmc
));
DEFINE
(
PACA_EXSLB
,
offsetof
(
struct
paca_struct
,
exslb
));
DEFINE
(
PACA_EXDSI
,
offsetof
(
struct
paca_struct
,
exdsi
));
DEFINE
(
PACAEMERGSP
,
offsetof
(
struct
paca_struct
,
emergency_sp
));
DEFINE
(
PACALPPACA
,
offsetof
(
struct
paca_struct
,
lppaca
));
DEFINE
(
PACAHWCPUID
,
offsetof
(
struct
paca_struct
,
hw_cpu_id
));
DEFINE
(
LPPACASRR0
,
offsetof
(
struct
lppaca
,
saved_srr0
));
DEFINE
(
LPPACASRR1
,
offsetof
(
struct
lppaca
,
saved_srr1
));
DEFINE
(
LPPACAANYINT
,
offsetof
(
struct
lppaca
,
int_dword
.
any_int
));
DEFINE
(
LPPACADECRINT
,
offsetof
(
struct
lppaca
,
int_dword
.
fields
.
decr_int
));
/* RTAS */
DEFINE
(
RTASBASE
,
offsetof
(
struct
rtas_t
,
base
));
DEFINE
(
RTASENTRY
,
offsetof
(
struct
rtas_t
,
entry
));
DEFINE
(
_TRAP
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
trap
));
DEFINE
(
SOFTE
,
STACK_FRAME_OVERHEAD
+
offsetof
(
struct
pt_regs
,
softe
));
/* Create extra stack space for SRR0 and SRR1 when calling prom/rtas. */
DEFINE
(
PROM_FRAME_SIZE
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
)
+
16
);
DEFINE
(
RTAS_FRAME_SIZE
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
)
+
16
);
/* These _only_ to be used with {PROM,RTAS}_FRAME_SIZE!!! */
DEFINE
(
_SRR0
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
));
DEFINE
(
_SRR1
,
STACK_FRAME_OVERHEAD
+
sizeof
(
struct
pt_regs
)
+
8
);
#ifndef CONFIG_PPC64
DEFINE
(
pbe_address
,
offsetof
(
struct
pbe
,
address
));
DEFINE
(
pbe_orig_address
,
offsetof
(
struct
pbe
,
orig_address
));
DEFINE
(
pbe_next
,
offsetof
(
struct
pbe
,
next
));
DEFINE
(
NUM_USER_SEGMENTS
,
TASK_SIZE
>>
28
);
#else
/* CONFIG_PPC64 */
/* systemcfg offsets for use by vdso */
DEFINE
(
CFG_TB_ORIG_STAMP
,
offsetof
(
struct
systemcfg
,
tb_orig_stamp
));
DEFINE
(
CFG_TB_TICKS_PER_SEC
,
offsetof
(
struct
systemcfg
,
tb_ticks_per_sec
));
...
...
@@ -251,12 +271,6 @@ int main(void)
DEFINE
(
TVAL32_TV_USEC
,
offsetof
(
struct
compat_timeval
,
tv_usec
));
DEFINE
(
TZONE_TZ_MINWEST
,
offsetof
(
struct
timezone
,
tz_minuteswest
));
DEFINE
(
TZONE_TZ_DSTTIME
,
offsetof
(
struct
timezone
,
tz_dsttime
));
#endif
DEFINE
(
pbe_address
,
offsetof
(
struct
pbe
,
address
));
DEFINE
(
pbe_orig_address
,
offsetof
(
struct
pbe
,
orig_address
));
DEFINE
(
pbe_next
,
offsetof
(
struct
pbe
,
next
));
DEFINE
(
NUM_USER_SEGMENTS
,
TASK_SIZE
>>
28
);
#endif
/* CONFIG_PPC64 */
return
0
;
}
arch/powerpc/kernel/head.S
View file @
292dcc86
...
...
@@ -349,12 +349,12 @@ i##n: \
/*
System
reset
*/
/*
core99
pmac
starts
the
seconary
here
by
changing
the
vector
,
and
putting
it
back
to
what
it
was
(
UnknownE
xception
)
when
done
.
*/
putting
it
back
to
what
it
was
(
unknown_e
xception
)
when
done
.
*/
#if defined(CONFIG_GEMINI) && defined(CONFIG_SMP)
.
=
0x100
b
__secondary_start_gemini
#else
EXCEPTION
(0
x100
,
Reset
,
UnknownE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x100
,
Reset
,
unknown_e
xception
,
EXC_XFER_STD
)
#endif
/*
Machine
check
*/
...
...
@@ -389,7 +389,7 @@ i##n: \
cmpwi
cr1
,
r4
,
0
bne
cr1
,
1
f
#endif
EXC_XFER_STD
(0
x200
,
MachineCheckE
xception
)
EXC_XFER_STD
(0
x200
,
machine_check_e
xception
)
#ifdef CONFIG_PPC_CHRP
1
:
b
machine_check_in_rtas
#endif
...
...
@@ -456,10 +456,10 @@ Alignment:
mfspr
r5
,
SPRN_DSISR
stw
r5
,
_DSISR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
x600
,
AlignmentE
xception
)
EXC_XFER_EE
(0
x600
,
alignment_e
xception
)
/*
Program
check
exception
*/
EXCEPTION
(0
x700
,
ProgramCheck
,
ProgramCheckE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x700
,
ProgramCheck
,
program_check_e
xception
,
EXC_XFER_STD
)
/*
Floating
-
point
unavailable
*/
.
=
0x800
...
...
@@ -472,8 +472,8 @@ FPUnavailable:
/*
Decrementer
*/
EXCEPTION
(0
x900
,
Decrementer
,
timer_interrupt
,
EXC_XFER_LITE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
System
call
*/
.
=
0xc00
...
...
@@ -482,8 +482,8 @@ SystemCall:
EXC_XFER_EE_LITE
(0
xc00
,
DoSyscall
)
/*
Single
step
-
not
used
on
601
*/
EXCEPTION
(0
xd00
,
SingleStep
,
SingleStepE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xd00
,
SingleStep
,
single_step_e
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
*
The
Altivec
unavailable
trap
is
at
0x0f20
.
Foo
.
...
...
@@ -502,7 +502,7 @@ SystemCall:
Trap_0f
:
EXCEPTION_PROLOG
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
xf00
,
UnknownE
xception
)
EXC_XFER_EE
(0
xf00
,
unknown_e
xception
)
/*
*
Handle
TLB
miss
for
instruction
on
603
/
60
3
e
.
...
...
@@ -702,44 +702,44 @@ DataStoreTLBMiss:
rfi
#ifndef CONFIG_ALTIVEC
#define
AltivecAssistException UnknownE
xception
#define
altivec_assist_exception unknown_e
xception
#endif
EXCEPTION
(0
x1300
,
Trap_13
,
InstructionBreakpoint
,
EXC_XFER_EE
)
EXCEPTION
(0
x1300
,
Trap_13
,
instruction_breakpoint_exception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1400
,
SMI
,
SMIException
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
unknown_e
xception
,
EXC_XFER_EE
)
#ifdef CONFIG_POWER4
EXCEPTION
(0
x1600
,
Trap_16
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
AltivecAssistE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
altivec_assist_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
TAUException
,
EXC_XFER_STD
)
#else /* !CONFIG_POWER4 */
EXCEPTION
(0
x1600
,
Trap_16
,
AltivecAssistE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
altivec_assist_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
TAUException
,
EXC_XFER_STD
)
EXCEPTION
(0
x1800
,
Trap_18
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif /* CONFIG_POWER4 */
EXCEPTION
(0
x1900
,
Trap_19
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1c00
,
Trap_1c
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1c00
,
Trap_1c
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2000
,
RunMode
,
RunModeException
,
EXC_XFER_EE
)
EXCEPTION
(0
x2100
,
Trap_21
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2200
,
Trap_22
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2300
,
Trap_23
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2400
,
Trap_24
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2500
,
Trap_25
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2600
,
Trap_26
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2700
,
Trap_27
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2800
,
Trap_28
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2900
,
Trap_29
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2a00
,
Trap_2a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2b00
,
Trap_2b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2c00
,
Trap_2c
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2d00
,
Trap_2d
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2e00
,
Trap_2e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2f00
,
MOLTrampoline
,
UnknownE
xception
,
EXC_XFER_EE_LITE
)
EXCEPTION
(0
x2100
,
Trap_21
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2200
,
Trap_22
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2300
,
Trap_23
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2400
,
Trap_24
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2500
,
Trap_25
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2600
,
Trap_26
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2700
,
Trap_27
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2800
,
Trap_28
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2900
,
Trap_29
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2a00
,
Trap_2a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2b00
,
Trap_2b
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2c00
,
Trap_2c
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2d00
,
Trap_2d
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2e00
,
Trap_2e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2f00
,
MOLTrampoline
,
unknown_e
xception
,
EXC_XFER_EE_LITE
)
.
globl
mol_trampoline
.
set
mol_trampoline
,
i0x2f00
...
...
@@ -751,7 +751,7 @@ AltiVecUnavailable:
#ifdef CONFIG_ALTIVEC
bne
load_up_altivec
/*
if
from
user
,
just
load
it
up
*/
#endif /* CONFIG_ALTIVEC */
EXC_XFER_EE_LITE
(0
xf20
,
AltivecUnavailE
xception
)
EXC_XFER_EE_LITE
(0
xf20
,
altivec_unavailable_e
xception
)
#ifdef CONFIG_PPC64BRIDGE
DataAccess
:
...
...
@@ -767,12 +767,12 @@ DataSegment:
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
mfspr
r4
,
SPRN_DAR
stw
r4
,
_DAR
(
r11
)
EXC_XFER_STD
(0
x380
,
UnknownE
xception
)
EXC_XFER_STD
(0
x380
,
unknown_e
xception
)
InstructionSegment
:
EXCEPTION_PROLOG
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_STD
(0
x480
,
UnknownE
xception
)
EXC_XFER_STD
(0
x480
,
unknown_e
xception
)
#endif /* CONFIG_PPC64BRIDGE */
#ifdef CONFIG_ALTIVEC
...
...
arch/powerpc/kernel/head_44x.S
View file @
292dcc86
...
...
@@ -309,13 +309,13 @@ skpinv: addi r4,r4,1 /* Increment */
interrupt_base
:
/
*
Critical
Input
Interrupt
*/
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
unknown_e
xception
)
/
*
Machine
Check
Interrupt
*/
#ifdef CONFIG_440A
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#else
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#endif
/
*
Data
Storage
Interrupt
*/
...
...
@@ -442,7 +442,7 @@ interrupt_base:
#ifdef CONFIG_PPC_FPU
FP_UNAVAILABLE_EXCEPTION
#else
EXCEPTION
(0
x2010
,
FloatingPointUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2010
,
FloatingPointUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif
/
*
System
Call
Interrupt
*/
...
...
@@ -451,21 +451,21 @@ interrupt_base:
EXC_XFER_EE_LITE
(0
x0c00
,
DoSyscall
)
/
*
Auxillary
Processor
Unavailable
Interrupt
*/
EXCEPTION
(0
x2020
,
AuxillaryProcessorUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2020
,
AuxillaryProcessorUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Decrementer
Interrupt
*/
DECREMENTER_EXCEPTION
/
*
Fixed
Internal
Timer
Interrupt
*/
/
*
TODO
:
Add
FIT
support
*/
EXCEPTION
(0
x1010
,
FixedIntervalTimer
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1010
,
FixedIntervalTimer
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Watchdog
Timer
Interrupt
*/
/
*
TODO
:
Add
watchdog
support
*/
#ifdef CONFIG_BOOKE_WDT
CRITICAL_EXCEPTION
(0
x1020
,
WatchdogTimer
,
WatchdogException
)
#else
CRITICAL_EXCEPTION
(0
x1020
,
WatchdogTimer
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x1020
,
WatchdogTimer
,
unknown_e
xception
)
#endif
/
*
Data
TLB
Error
Interrupt
*/
...
...
arch/powerpc/kernel/head_4xx.S
View file @
292dcc86
...
...
@@ -245,12 +245,12 @@ label:
/*
*
0x0100
-
Critical
Interrupt
Exception
*/
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInterrupt
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInterrupt
,
unknown_e
xception
)
/*
*
0x0200
-
Machine
Check
Exception
*/
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
/*
*
0x0300
-
Data
Storage
Exception
...
...
@@ -405,7 +405,7 @@ label:
mfspr
r4
,
SPRN_DEAR
/*
Grab
the
DEAR
and
save
it
*/
stw
r4
,
_DEAR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
x600
,
AlignmentE
xception
)
EXC_XFER_EE
(0
x600
,
alignment_e
xception
)
/*
0
x0700
-
Program
Exception
*/
START_EXCEPTION
(0
x0700
,
ProgramCheck
)
...
...
@@ -413,21 +413,21 @@ label:
mfspr
r4
,
SPRN_ESR
/*
Grab
the
ESR
and
save
it
*/
stw
r4
,
_ESR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_STD
(0
x700
,
ProgramCheckE
xception
)
EXC_XFER_STD
(0
x700
,
program_check_e
xception
)
EXCEPTION
(0
x0800
,
Trap_08
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0900
,
Trap_09
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0A00
,
Trap_0A
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0B00
,
Trap_0B
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0800
,
Trap_08
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0900
,
Trap_09
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0A00
,
Trap_0A
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0B00
,
Trap_0B
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
0
x0C00
-
System
Call
Exception
*/
START_EXCEPTION
(0
x0C00
,
SystemCall
)
NORMAL_EXCEPTION_PROLOG
EXC_XFER_EE_LITE
(0
xc00
,
DoSyscall
)
EXCEPTION
(0
x0D00
,
Trap_0D
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0E00
,
Trap_0E
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0F00
,
Trap_0F
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0D00
,
Trap_0D
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0E00
,
Trap_0E
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0F00
,
Trap_0F
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
0
x1000
-
Programmable
Interval
Timer
(
PIT
)
Exception
*/
START_EXCEPTION
(0
x1000
,
Decrementer
)
...
...
@@ -444,14 +444,14 @@ label:
/*
0
x1010
-
Fixed
Interval
Timer
(
FIT
)
Exception
*/
STND_EXCEPTION
(0
x1010
,
FITException
,
UnknownE
xception
)
STND_EXCEPTION
(0
x1010
,
FITException
,
unknown_e
xception
)
/*
0
x1020
-
Watchdog
Timer
(
WDT
)
Exception
*/
#ifdef CONFIG_BOOKE_WDT
CRITICAL_EXCEPTION
(0
x1020
,
WDTException
,
WatchdogException
)
#else
CRITICAL_EXCEPTION
(0
x1020
,
WDTException
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x1020
,
WDTException
,
unknown_e
xception
)
#endif
#endif
...
...
@@ -656,25 +656,25 @@ label:
mfspr
r10
,
SPRN_SPRG0
b
InstructionAccess
EXCEPTION
(0
x1300
,
Trap_13
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1400
,
Trap_14
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1300
,
Trap_13
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1400
,
Trap_14
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
unknown_e
xception
,
EXC_XFER_EE
)
#ifdef CONFIG_IBM405_ERR51
/
*
405
GP
errata
51
*/
START_EXCEPTION
(0
x1700
,
Trap_17
)
b
DTLBMiss
#else
EXCEPTION
(0
x1700
,
Trap_17
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif
EXCEPTION
(0
x1800
,
Trap_18
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1A00
,
Trap_1A
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1B00
,
Trap_1B
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1C00
,
Trap_1C
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1D00
,
Trap_1D
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1E00
,
Trap_1E
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1F00
,
Trap_1F
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1A00
,
Trap_1A
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1B00
,
Trap_1B
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1C00
,
Trap_1C
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1D00
,
Trap_1D
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1E00
,
Trap_1E
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1F00
,
Trap_1F
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
Check
for
a
single
step
debug
exception
while
in
an
exception
*
handler
before
state
has
been
saved
.
This
is
to
catch
the
case
...
...
arch/powerpc/kernel/head_64.S
View file @
292dcc86
...
...
@@ -1253,7 +1253,7 @@ unrecov_slb:
*
*
On
iSeries
,
the
hypervisor
must
fill
in
at
least
one
entry
before
*
we
get
control
(
with
relocate
on
)
.
The
address
is
give
to
the
hv
*
as
a
page
number
(
see
xLparMap
in
LparD
ata
.
c
),
so
this
must
be
at
a
*
as
a
page
number
(
see
xLparMap
in
lpard
ata
.
c
),
so
this
must
be
at
a
*
fixed
address
(
the
linker
can
't compute (u64)&initial_stab >>
*
PAGE_SHIFT
)
.
*/
...
...
@@ -1364,6 +1364,7 @@ _STATIC(__start_initialization_iSeries)
addi
r2
,
r2
,
0x4000
bl
.
iSeries_early_setup
bl
.
early_setup
/
*
relocation
is
on
at
this
point
*/
...
...
@@ -1970,20 +1971,22 @@ _GLOBAL(hmt_start_secondary)
blr
#endif
#if defined(CONFIG_KEXEC) ||
(defined(CONFIG_SMP) && !defined(CONFIG_PPC_ISERIES)
)
#if defined(CONFIG_KEXEC) ||
defined(CONFIG_SMP
)
_GLOBAL
(
smp_release_cpus
)
/
*
All
secondary
cpus
are
spinning
on
a
common
*
spinloop
,
release
them
all
now
so
they
can
start
*
to
spin
on
their
individual
paca
spinloops
.
*
For
non
SMP
kernels
,
the
secondary
cpus
never
*
get
out
of
the
common
spinloop
.
*
XXX
This
does
nothing
useful
on
iSeries
,
secondaries
are
*
already
waiting
on
their
paca
.
*/
li
r3
,
1
LOADADDR
(
r5
,
__secondary_hold_spinloop
)
std
r3
,
0
(
r5
)
sync
blr
#endif /* CONFIG_SMP
&& !CONFIG_PPC_ISERIES
*/
#endif /* CONFIG_SMP */
/*
...
...
arch/powerpc/kernel/head_8xx.S
View file @
292dcc86
...
...
@@ -203,7 +203,7 @@ i##n: \
ret_from_except
)
/*
System
reset
*/
EXCEPTION
(0
x100
,
Reset
,
UnknownE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x100
,
Reset
,
unknown_e
xception
,
EXC_XFER_STD
)
/*
Machine
check
*/
.
=
0x200
...
...
@@ -214,7 +214,7 @@ MachineCheck:
mfspr
r5
,
SPRN_DSISR
stw
r5
,
_DSISR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_STD
(0
x200
,
MachineCheckE
xception
)
EXC_XFER_STD
(0
x200
,
machine_check_e
xception
)
/*
Data
access
exception
.
*
This
is
"never generated"
by
the
MPC8xx
.
We
jump
to
it
for
other
...
...
@@ -252,20 +252,20 @@ Alignment:
mfspr
r5
,
SPRN_DSISR
stw
r5
,
_DSISR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
x600
,
AlignmentE
xception
)
EXC_XFER_EE
(0
x600
,
alignment_e
xception
)
/*
Program
check
exception
*/
EXCEPTION
(0
x700
,
ProgramCheck
,
ProgramCheckE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x700
,
ProgramCheck
,
program_check_e
xception
,
EXC_XFER_STD
)
/*
No
FPU
on
MPC8xx
.
This
exception
is
not
supposed
to
happen
.
*/
EXCEPTION
(0
x800
,
FPUnavailable
,
UnknownE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x800
,
FPUnavailable
,
unknown_e
xception
,
EXC_XFER_STD
)
/*
Decrementer
*/
EXCEPTION
(0
x900
,
Decrementer
,
timer_interrupt
,
EXC_XFER_LITE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
System
call
*/
.
=
0xc00
...
...
@@ -274,9 +274,9 @@ SystemCall:
EXC_XFER_EE_LITE
(0
xc00
,
DoSyscall
)
/*
Single
step
-
not
used
on
601
*/
EXCEPTION
(0
xd00
,
SingleStep
,
SingleStepE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xf00
,
Trap_0f
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xd00
,
SingleStep
,
single_step_e
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xf00
,
Trap_0f
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
On
the
MPC8xx
,
this
is
a
software
emulation
interrupt
.
It
occurs
*
for
all
unimplemented
and
illegal
instructions
.
...
...
@@ -540,22 +540,22 @@ DataTLBError:
#endif
b
DataAccess
EXCEPTION
(0
x1500
,
Trap_15
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
On
the
MPC8xx
,
these
next
four
traps
are
used
for
development
*
support
of
breakpoints
and
such
.
Someday
I
will
get
around
to
*
using
them
.
*/
EXCEPTION
(0
x1c00
,
Trap_1c
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1c00
,
Trap_1c
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
unknown_e
xception
,
EXC_XFER_EE
)
.
=
0x2000
...
...
arch/powerpc/kernel/head_fsl_booke.S
View file @
292dcc86
...
...
@@ -426,14 +426,14 @@ skpinv: addi r6,r6,1 /* Increment */
interrupt_base
:
/
*
Critical
Input
Interrupt
*/
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
unknown_e
xception
)
/
*
Machine
Check
Interrupt
*/
#ifdef CONFIG_E200
/
*
no
RFMCI
,
MCSRRs
on
E200
*/
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#else
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#endif
/
*
Data
Storage
Interrupt
*/
...
...
@@ -542,9 +542,9 @@ interrupt_base:
#else
#ifdef CONFIG_E200
/
*
E200
treats
'normal'
floating
point
instructions
as
FP
Unavail
exception
*/
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
ProgramCheckE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
program_check_e
xception
,
EXC_XFER_EE
)
#else
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif
#endif
...
...
@@ -554,20 +554,20 @@ interrupt_base:
EXC_XFER_EE_LITE
(0
x0c00
,
DoSyscall
)
/
*
Auxillary
Processor
Unavailable
Interrupt
*/
EXCEPTION
(0
x2900
,
AuxillaryProcessorUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2900
,
AuxillaryProcessorUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Decrementer
Interrupt
*/
DECREMENTER_EXCEPTION
/
*
Fixed
Internal
Timer
Interrupt
*/
/
*
TODO
:
Add
FIT
support
*/
EXCEPTION
(0
x3100
,
FixedIntervalTimer
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x3100
,
FixedIntervalTimer
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Watchdog
Timer
Interrupt
*/
#ifdef CONFIG_BOOKE_WDT
CRITICAL_EXCEPTION
(0
x3200
,
WatchdogTimer
,
WatchdogException
)
#else
CRITICAL_EXCEPTION
(0
x3200
,
WatchdogTimer
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x3200
,
WatchdogTimer
,
unknown_e
xception
)
#endif
/
*
Data
TLB
Error
Interrupt
*/
...
...
@@ -696,21 +696,21 @@ interrupt_base:
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE_LITE
(0
x2010
,
KernelSPE
)
#else
EXCEPTION
(0
x2020
,
SPEUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2020
,
SPEUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif /* CONFIG_SPE */
/
*
SPE
Floating
Point
Data
*/
#ifdef CONFIG_SPE
EXCEPTION
(0
x2030
,
SPEFloatingPointData
,
SPEFloatingPointException
,
EXC_XFER_EE
)
;
#else
EXCEPTION
(0
x2040
,
SPEFloatingPointData
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2040
,
SPEFloatingPointData
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif /* CONFIG_SPE */
/
*
SPE
Floating
Point
Round
*/
EXCEPTION
(0
x2050
,
SPEFloatingPointRound
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2050
,
SPEFloatingPointRound
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Performance
Monitor
*/
EXCEPTION
(0
x2060
,
PerformanceMonitor
,
PerformanceMonitorE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x2060
,
PerformanceMonitor
,
performance_monitor_e
xception
,
EXC_XFER_STD
)
/
*
Debug
Interrupt
*/
...
...
arch/p
pc64
/kernel/idle_power4.S
→
arch/p
owerpc
/kernel/idle_power4.S
View file @
292dcc86
...
...
@@ -63,8 +63,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP)
beq
1
f
mtmsrd
r7
/*
out
of
line
this
?
*/
blr
1
:
/
*
Go
to
NAP
now
*/
1
:
/
*
Go
to
NAP
now
*/
BEGIN_FTR_SECTION
DSSALL
sync
...
...
@@ -76,4 +76,3 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
isync
sync
blr
arch/powerpc/kernel/ppc_ksyms.c
View file @
292dcc86
...
...
@@ -53,10 +53,10 @@
extern
void
transfer_to_handler
(
void
);
extern
void
do_IRQ
(
struct
pt_regs
*
regs
);
extern
void
MachineCheckE
xception
(
struct
pt_regs
*
regs
);
extern
void
AlignmentE
xception
(
struct
pt_regs
*
regs
);
extern
void
ProgramCheckE
xception
(
struct
pt_regs
*
regs
);
extern
void
SingleStepE
xception
(
struct
pt_regs
*
regs
);
extern
void
machine_check_e
xception
(
struct
pt_regs
*
regs
);
extern
void
alignment_e
xception
(
struct
pt_regs
*
regs
);
extern
void
program_check_e
xception
(
struct
pt_regs
*
regs
);
extern
void
single_step_e
xception
(
struct
pt_regs
*
regs
);
extern
int
do_signal
(
sigset_t
*
,
struct
pt_regs
*
);
extern
int
pmac_newworld
;
extern
int
sys_sigreturn
(
struct
pt_regs
*
regs
);
...
...
@@ -72,10 +72,10 @@ EXPORT_SYMBOL(clear_user_page);
EXPORT_SYMBOL
(
do_signal
);
EXPORT_SYMBOL
(
transfer_to_handler
);
EXPORT_SYMBOL
(
do_IRQ
);
EXPORT_SYMBOL
(
MachineCheckE
xception
);
EXPORT_SYMBOL
(
AlignmentE
xception
);
EXPORT_SYMBOL
(
ProgramCheckE
xception
);
EXPORT_SYMBOL
(
SingleStepE
xception
);
EXPORT_SYMBOL
(
machine_check_e
xception
);
EXPORT_SYMBOL
(
alignment_e
xception
);
EXPORT_SYMBOL
(
program_check_e
xception
);
EXPORT_SYMBOL
(
single_step_e
xception
);
EXPORT_SYMBOL
(
sys_sigreturn
);
EXPORT_SYMBOL
(
ppc_n_lost_interrupts
);
EXPORT_SYMBOL
(
ppc_lost_interrupts
);
...
...
arch/powerpc/kernel/traps.c
View file @
292dcc86
/*
* arch/powerpc/kernel/traps.c
*
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
*
* This program is free software; you can redistribute it and/or
...
...
@@ -23,29 +21,46 @@
#include <linux/mm.h>
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/ptrace.h>
#include <linux/slab.h>
#include <linux/user.h>
#include <linux/a.out.h>
#include <linux/interrupt.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/prctl.h>
#include <linux/delay.h>
#include <linux/kprobes.h>
#include <asm/kdebug.h>
#ifdef CONFIG_PPC32
#include <linux/ptrace.h>
#include <linux/prctl.h>
#endif
#include <asm/pgtable.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/io.h>
#ifdef CONFIG_PPC32
#include <asm/reg.h>
#include <asm/xmon.h>
#ifdef CONFIG_PMAC_BACKLIGHT
#include <asm/backlight.h>
#endif
#include <asm/perfmon.h>
#endif
#ifdef CONFIG_PPC64
#include <asm/processor.h>
#include <asm/ppcdebug.h>
#include <asm/rtas.h>
#include <asm/systemcfg.h>
#include <asm/machdep.h>
#include <asm/pmc.h>
#endif
#ifdef CONFIG_PPC64
#define __KPROBES __kprobes
#else
#define __KPROBES
#endif
#ifdef CONFIG_DEBUGGER
int
(
*
__debugger
)(
struct
pt_regs
*
regs
);
...
...
@@ -96,7 +111,7 @@ int die(const char *str, struct pt_regs *regs, long err)
console_verbose
();
spin_lock_irq
(
&
die_lock
);
bust_spinlocks
(
1
);
#if
def CONFIG_PMAC_BACKLIGHT
#if
defined(CONFIG_PPC32) && defined(CONFIG_PMAC_BACKLIGHT)
if
(
_machine
==
_MACH_Pmac
)
{
set_backlight_enable
(
1
);
set_backlight_level
(
BACKLIGHT_MAX
);
...
...
@@ -154,9 +169,17 @@ int die(const char *str, struct pt_regs *regs, long err)
panic
(
"Fatal exception in interrupt"
);
if
(
panic_on_oops
)
{
#ifdef CONFIG_PPC64
printk
(
KERN_EMERG
"Fatal exception: panic in 5 seconds
\n
"
);
ssleep
(
5
);
#endif
panic
(
"Fatal exception"
);
}
#ifdef CONFIG_PPC32
do_exit
(
err
);
#else
do_exit
(
SIGSEGV
);
#endif
return
0
;
}
...
...
@@ -176,6 +199,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
info
.
si_addr
=
(
void
__user
*
)
addr
;
force_sig_info
(
signr
,
&
info
,
current
);
#ifdef CONFIG_PPC32
/*
* Init gets no signals that it doesn't have a handler for.
* That's all very well, but if it has caused a synchronous
...
...
@@ -197,6 +221,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
do_exit
(
signr
);
}
}
#endif
}
#ifdef CONFIG_PPC64
...
...
@@ -206,7 +231,7 @@ void system_reset_exception(struct pt_regs *regs)
if
(
ppc_md
.
system_reset_exception
)
ppc_md
.
system_reset_exception
(
regs
);
die
(
"System Reset"
,
regs
,
SIGABRT
);
die
(
"System Reset"
,
regs
,
0
);
/* Must die if the interrupt is not recoverable */
if
(
!
(
regs
->
msr
&
MSR_RI
))
...
...
@@ -216,6 +241,7 @@ void system_reset_exception(struct pt_regs *regs)
}
#endif
#ifdef CONFIG_PPC32
/*
* I/O accesses can cause machine checks on powermacs.
* Check if the NIP corresponds to the address of a sync
...
...
@@ -264,8 +290,10 @@ static inline int check_io_access(struct pt_regs *regs)
#endif
/* CONFIG_PPC_PMAC */
return
0
;
}
#endif
/* CONFIG_PPC32 */
#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
/* On 4xx, the reason for the machine check or program exception
is in the ESR. */
#define get_reason(regs) ((regs)->dsisr)
...
...
@@ -284,6 +312,7 @@ static inline int check_io_access(struct pt_regs *regs)
#define clear_single_step(regs) (current->thread.dbcr0 &= ~DBCR0_IC)
#else
/* On non-4xx, the reason for the machine check or program
exception is in the MSR. */
#define get_reason(regs) ((regs)->msr)
...
...
@@ -297,6 +326,7 @@ static inline int check_io_access(struct pt_regs *regs)
#define clear_single_step(regs) ((regs)->msr &= ~MSR_SE)
#endif
#ifdef CONFIG_PPC32
/*
* This is "fall-back" implementation for configurations
* which don't provide platform-specific machine check info
...
...
@@ -305,8 +335,9 @@ void __attribute__ ((weak))
platform_machine_check
(
struct
pt_regs
*
regs
)
{
}
#endif
void
MachineCheckE
xception
(
struct
pt_regs
*
regs
)
void
machine_check_e
xception
(
struct
pt_regs
*
regs
)
{
#ifdef CONFIG_PPC64
int
recover
=
0
;
...
...
@@ -462,23 +493,31 @@ void MachineCheckException(struct pt_regs *regs)
* additional info, e.g. bus error registers.
*/
platform_machine_check
(
regs
);
#endif
/* CONFIG_PPC
64
*/
#endif
/* CONFIG_PPC
32
*/
if
(
debugger_fault_handler
(
regs
))
return
;
die
(
"Machine check"
,
regs
,
SIGBUS
);
die
(
"Machine check"
,
regs
,
#ifdef CONFIG_PPC32
SIGBUS
#else
0
#endif
);
/* Must die if the interrupt is not recoverable */
if
(
!
(
regs
->
msr
&
MSR_RI
))
panic
(
"Unrecoverable Machine check"
);
}
#ifdef CONFIG_PPC32
void
SMIException
(
struct
pt_regs
*
regs
)
{
die
(
"System Management Interrupt"
,
regs
,
SIGABRT
);
}
#endif
void
UnknownE
xception
(
struct
pt_regs
*
regs
)
void
unknown_e
xception
(
struct
pt_regs
*
regs
)
{
printk
(
"Bad trap at PC: %lx, SR: %lx, vector=%lx
\n
"
,
regs
->
nip
,
regs
->
msr
,
regs
->
trap
);
...
...
@@ -486,7 +525,7 @@ void UnknownException(struct pt_regs *regs)
_exception
(
SIGTRAP
,
regs
,
0
,
0
);
}
void
InstructionBreakpoint
(
struct
pt_regs
*
regs
)
void
instruction_breakpoint_exception
(
struct
pt_regs
*
regs
)
{
if
(
notify_die
(
DIE_IABR_MATCH
,
"iabr_match"
,
regs
,
5
,
5
,
SIGTRAP
)
==
NOTIFY_STOP
)
...
...
@@ -496,14 +535,20 @@ void InstructionBreakpoint(struct pt_regs *regs)
_exception
(
SIGTRAP
,
regs
,
TRAP_BRKPT
,
regs
->
nip
);
}
#ifdef CONFIG_PPC32
void
RunModeException
(
struct
pt_regs
*
regs
)
{
_exception
(
SIGTRAP
,
regs
,
0
,
0
);
}
#endif
void
SingleStepE
xception
(
struct
pt_regs
*
regs
)
void
__KPROBES
single_step_e
xception
(
struct
pt_regs
*
regs
)
{
#ifdef CONFIG_PPC32
regs
->
msr
&=
~
(
MSR_SE
|
MSR_BE
);
/* Turn off 'trace' bits */
#else
regs
->
msr
&=
~
MSR_SE
;
/* Turn off 'trace' bit */
#endif
if
(
notify_die
(
DIE_SSTEP
,
"single_step"
,
regs
,
5
,
5
,
SIGTRAP
)
==
NOTIFY_STOP
)
...
...
@@ -520,15 +565,62 @@ void SingleStepException(struct pt_regs *regs)
* pretend we got a single-step exception. This was pointed out
* by Kumar Gala. -- paulus
*/
static
void
emulate_single_step
(
struct
pt_regs
*
regs
)
static
inline
void
emulate_single_step
(
struct
pt_regs
*
regs
)
{
if
(
single_stepping
(
regs
))
{
#ifdef CONFIG_PPC32
clear_single_step
(
regs
);
_exception
(
SIGTRAP
,
regs
,
TRAP_TRACE
,
0
);
#else
single_step_exception
(
regs
);
#endif
}
}
/* Illegal instruction emulation support. Originally written to
static
void
parse_fpe
(
struct
pt_regs
*
regs
)
{
int
code
=
0
;
unsigned
long
fpscr
;
#ifdef CONFIG_PPC32
/* We must make sure the FP state is consistent with
* our MSR_FP in regs
*/
preempt_disable
();
if
(
regs
->
msr
&
MSR_FP
)
giveup_fpu
(
current
);
preempt_enable
();
#else
flush_fp_to_thread
(
current
);
#endif
fpscr
=
current
->
thread
.
fpscr
;
/* Invalid operation */
if
((
fpscr
&
FPSCR_VE
)
&&
(
fpscr
&
FPSCR_VX
))
code
=
FPE_FLTINV
;
/* Overflow */
else
if
((
fpscr
&
FPSCR_OE
)
&&
(
fpscr
&
FPSCR_OX
))
code
=
FPE_FLTOVF
;
/* Underflow */
else
if
((
fpscr
&
FPSCR_UE
)
&&
(
fpscr
&
FPSCR_UX
))
code
=
FPE_FLTUND
;
/* Divide by zero */
else
if
((
fpscr
&
FPSCR_ZE
)
&&
(
fpscr
&
FPSCR_ZX
))
code
=
FPE_FLTDIV
;
/* Inexact result */
else
if
((
fpscr
&
FPSCR_XE
)
&&
(
fpscr
&
FPSCR_XX
))
code
=
FPE_FLTRES
;
_exception
(
SIGFPE
,
regs
,
code
,
regs
->
nip
);
}
/*
* Illegal instruction emulation support. Originally written to
* provide the PVR to user applications using the mfspr rd, PVR.
* Return non-zero if we can't emulate, or -EFAULT if the associated
* memory access caused an access fault. Return zero on success.
...
...
@@ -536,7 +628,6 @@ static void emulate_single_step(struct pt_regs *regs)
* There are a couple of ways to do this, either "decode" the instruction
* or directly match lots of bits. In this case, matching lots of
* bits is faster and easier.
*
*/
#define INST_MFSPR_PVR 0x7c1f42a6
#define INST_MFSPR_PVR_MASK 0xfc1fffff
...
...
@@ -547,6 +638,8 @@ static void emulate_single_step(struct pt_regs *regs)
#define INST_MCRXR 0x7c000400
#define INST_MCRXR_MASK 0x7c0007fe
#ifdef CONFIG_PPC32
#define INST_STRING 0x7c00042a
#define INST_STRING_MASK 0x7c0007fe
#define INST_STRING_GEN_MASK 0x7c00067e
...
...
@@ -622,6 +715,7 @@ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
return
0
;
}
#endif
/* CONFIG_PPC32 */
static
int
emulate_instruction
(
struct
pt_regs
*
regs
)
{
...
...
@@ -643,22 +737,44 @@ static int emulate_instruction(struct pt_regs *regs)
}
/* Emulating the dcba insn is just a no-op. */
if
((
instword
&
INST_DCBA_MASK
)
==
INST_DCBA
)
if
((
instword
&
INST_DCBA_MASK
)
==
INST_DCBA
)
{
#ifdef CONFIG_PPC64
static
int
warned
;
if
(
!
warned
)
{
printk
(
KERN_WARNING
"process %d (%s) uses obsolete 'dcba' insn
\n
"
,
current
->
pid
,
current
->
comm
);
warned
=
1
;
}
#endif
/* CONFIG_PPC64 */
return
0
;
}
/* Emulate the mcrxr insn. */
if
((
instword
&
INST_MCRXR_MASK
)
==
INST_MCRXR
)
{
int
shift
=
(
instword
>>
21
)
&
0x1c
;
unsigned
int
shift
=
(
instword
>>
21
)
&
0x1c
;
unsigned
long
msk
=
0xf0000000UL
>>
shift
;
#ifdef CONFIG_PPC64
static
int
warned
;
if
(
!
warned
)
{
printk
(
KERN_WARNING
"process %d (%s) uses obsolete 'mcrxr' insn
\n
"
,
current
->
pid
,
current
->
comm
);
warned
=
1
;
}
#endif
regs
->
ccr
=
(
regs
->
ccr
&
~
msk
)
|
((
regs
->
xer
>>
shift
)
&
msk
);
regs
->
xer
&=
~
0xf0000000UL
;
return
0
;
}
#ifdef CONFIG_PPC32
/* Emulate load/store string insn. */
if
((
instword
&
INST_STRING_GEN_MASK
)
==
INST_STRING
)
return
emulate_string_inst
(
regs
,
instword
);
#endif
return
-
EINVAL
;
}
...
...
@@ -686,7 +802,7 @@ struct bug_entry *find_bug(unsigned long bugaddr)
return
module_find_bug
(
bugaddr
);
}
int
check_bug_trap
(
struct
pt_regs
*
regs
)
static
int
check_bug_trap
(
struct
pt_regs
*
regs
)
{
struct
bug_entry
*
bug
;
unsigned
long
addr
;
...
...
@@ -701,34 +817,38 @@ int check_bug_trap(struct pt_regs *regs)
return
0
;
if
(
bug
->
line
&
BUG_WARNING_TRAP
)
{
/* this is a WARN_ON rather than BUG/BUG_ON */
#if
def CONFIG_XMON
#if
defined(CONFIG_PPC32) && defined(CONFIG_XMON)
xmon_printf
(
KERN_ERR
"Badness in %s at %s:%d
\n
"
,
bug
->
function
,
bug
->
file
,
bug
->
line
&
~
BUG_WARNING_TRAP
);
#endif
/* CONFIG_XMON */
#endif
printk
(
KERN_ERR
"Badness in %s at %s:%d
\n
"
,
bug
->
function
,
bug
->
file
,
bug
->
line
&
~
BUG_WARNING_TRAP
);
#ifdef CONFIG_PPC32
dump_stack
();
#else
show_stack
(
current
,
(
void
*
)
regs
->
gpr
[
1
]);
#endif
return
1
;
}
#if
def CONFIG_XMON
#if
defined(CONFIG_PPC32) && defined(CONFIG_XMON)
xmon_printf
(
KERN_CRIT
"kernel BUG in %s at %s:%d!
\n
"
,
bug
->
function
,
bug
->
file
,
bug
->
line
);
xmon
(
regs
);
#endif
/* CONFIG_XMON */
#endif
printk
(
KERN_CRIT
"kernel BUG in %s at %s:%d!
\n
"
,
bug
->
function
,
bug
->
file
,
bug
->
line
);
return
0
;
}
void
ProgramCheckE
xception
(
struct
pt_regs
*
regs
)
void
__KPROBES
program_check_e
xception
(
struct
pt_regs
*
regs
)
{
unsigned
int
reason
=
get_reason
(
regs
);
#if defined(CONFIG_PPC32) && defined(CONFIG_MATH_EMULATION)
extern
int
do_mathemu
(
struct
pt_regs
*
regs
);
#ifdef CONFIG_MATH_EMULATION
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
* but there seems to be a hardware bug on the 405GP (RevD)
* that means ESR is sometimes set incorrectly - either to
...
...
@@ -740,69 +860,61 @@ void ProgramCheckException(struct pt_regs *regs)
emulate_single_step
(
regs
);
return
;
}
#endif
/* CONFIG_MATH_EMULATION */
if
(
reason
&
REASON_FP
)
{
/* IEEE FP exception */
int
code
=
0
;
u32
fpscr
;
#endif
/* We must make sure the FP state is consistent with
* our MSR_FP in regs
*/
preempt_disable
();
if
(
regs
->
msr
&
MSR_FP
)
giveup_fpu
(
current
);
preempt_enable
();
fpscr
=
current
->
thread
.
fpscr
;
fpscr
&=
fpscr
<<
22
;
/* mask summary bits with enables */
if
(
fpscr
&
FPSCR_VX
)
code
=
FPE_FLTINV
;
else
if
(
fpscr
&
FPSCR_OX
)
code
=
FPE_FLTOVF
;
else
if
(
fpscr
&
FPSCR_UX
)
code
=
FPE_FLTUND
;
else
if
(
fpscr
&
FPSCR_ZX
)
code
=
FPE_FLTDIV
;
else
if
(
fpscr
&
FPSCR_XX
)
code
=
FPE_FLTRES
;
_exception
(
SIGFPE
,
regs
,
code
,
regs
->
nip
);
#ifdef CONFIG_PPC64
if
(
debugger_fault_handler
(
regs
))
return
;
}
#endif
if
(
reason
&
REASON_TRAP
)
{
if
(
reason
&
REASON_FP
)
{
/* IEEE FP exception */
parse_fpe
(
regs
);
}
else
if
(
reason
&
REASON_TRAP
)
{
/* trap exception */
#ifdef CONFIG_PPC64
if
(
notify_die
(
DIE_BPT
,
"breakpoint"
,
regs
,
5
,
5
,
SIGTRAP
)
==
NOTIFY_STOP
)
return
;
#endif
if
(
debugger_bpt
(
regs
))
return
;
if
(
check_bug_trap
(
regs
))
{
regs
->
nip
+=
4
;
return
;
}
_exception
(
SIGTRAP
,
regs
,
TRAP_BRKPT
,
0
);
return
;
}
/* Try to emulate it if we should. */
if
(
reason
&
(
REASON_ILLEGAL
|
REASON_PRIVILEGED
))
{
_exception
(
SIGTRAP
,
regs
,
TRAP_BRKPT
,
#ifdef CONFIG_PPC32
0
#else
regs
->
nip
#endif
);
}
else
#ifdef CONFIG_PPC32
if
(
reason
&
(
REASON_ILLEGAL
|
REASON_PRIVILEGED
))
#endif
{
/* Privileged or illegal instruction; try to emulate it. */
switch
(
emulate_instruction
(
regs
))
{
case
0
:
regs
->
nip
+=
4
;
emulate_single_step
(
regs
);
return
;
break
;
case
-
EFAULT
:
_exception
(
SIGSEGV
,
regs
,
SEGV_MAPERR
,
regs
->
nip
);
return
;
break
;
default:
if
(
reason
&
REASON_PRIVILEGED
)
_exception
(
SIGILL
,
regs
,
ILL_PRVOPC
,
regs
->
nip
);
else
_exception
(
SIGILL
,
regs
,
ILL_ILLOPC
,
regs
->
nip
);
break
;
}
}
if
(
reason
&
REASON_PRIVILEGED
)
_exception
(
SIGILL
,
regs
,
ILL_PRVOPC
,
regs
->
nip
);
else
_exception
(
SIGILL
,
regs
,
ILL_ILLOPC
,
regs
->
nip
);
}
void
AlignmentE
xception
(
struct
pt_regs
*
regs
)
void
alignment_e
xception
(
struct
pt_regs
*
regs
)
{
int
fixed
;
...
...
@@ -814,18 +926,31 @@ void AlignmentException(struct pt_regs *regs)
return
;
}
/* Operand address was bad */
/* Operand address was bad */
if
(
fixed
==
-
EFAULT
)
{
if
(
user_mode
(
regs
))
_exception
(
SIGSEGV
,
regs
,
SEGV_ACCERR
,
regs
->
dar
);
_exception
(
SIGSEGV
,
regs
,
#ifdef CONFIG_PPC32
SEGV_ACCERR
,
#else
SEGV_MAPERR
,
#endif
regs
->
dar
);
else
/* Search exception table */
bad_page_fault
(
regs
,
regs
->
dar
,
SIGSEGV
);
return
;
}
_exception
(
SIGBUS
,
regs
,
BUS_ADRALN
,
regs
->
dar
);
_exception
(
SIGBUS
,
regs
,
BUS_ADRALN
,
#ifdef CONFIG_PPC32
regs
->
dar
#else
regs
->
nip
#endif
);
}
#ifdef CONFIG_PPC32
void
StackOverflow
(
struct
pt_regs
*
regs
)
{
printk
(
KERN_CRIT
"Kernel stack overflow in process %p, r1=%lx
\n
"
,
...
...
@@ -849,8 +974,58 @@ void trace_syscall(struct pt_regs *regs)
current
,
current
->
pid
,
regs
->
nip
,
regs
->
link
,
regs
->
gpr
[
0
],
regs
->
ccr
&
0x10000000
?
"Error="
:
""
,
regs
->
gpr
[
3
],
print_tainted
());
}
#endif
/* CONFIG_PPC32 */
#ifdef CONFIG_PPC64
void
kernel_fp_unavailable_exception
(
struct
pt_regs
*
regs
)
{
printk
(
KERN_EMERG
"Unrecoverable FP Unavailable Exception "
"%lx at %lx
\n
"
,
regs
->
trap
,
regs
->
nip
);
die
(
"Unrecoverable FP Unavailable Exception"
,
regs
,
SIGABRT
);
}
#endif
void
altivec_unavailable_exception
(
struct
pt_regs
*
regs
)
{
#if !defined(CONFIG_ALTIVEC) || defined(CONFIG_PPC64)
if
(
user_mode
(
regs
))
{
/* A user program has executed an altivec instruction,
but this kernel doesn't support altivec. */
_exception
(
SIGILL
,
regs
,
ILL_ILLOPC
,
regs
->
nip
);
return
;
}
#endif
#ifdef CONFIG_PPC32
{
static
int
kernel_altivec_count
;
/* The kernel has executed an altivec instruction without
first enabling altivec. Whinge but let it do it. */
if
(
++
kernel_altivec_count
<
10
)
printk
(
KERN_ERR
"AltiVec used in kernel (task=%p, pc=%lx)
\n
"
,
current
,
regs
->
nip
);
regs
->
msr
|=
MSR_VEC
;
}
#else
printk
(
KERN_EMERG
"Unrecoverable VMX/Altivec Unavailable Exception "
"%lx at %lx
\n
"
,
regs
->
trap
,
regs
->
nip
);
die
(
"Unrecoverable VMX/Altivec Unavailable Exception"
,
regs
,
SIGABRT
);
#endif
}
#ifdef CONFIG_PPC64
extern
perf_irq_t
perf_irq
;
#endif
#if defined(CONFIG_PPC64) || defined(CONFIG_E500)
void
performance_monitor_exception
(
struct
pt_regs
*
regs
)
{
perf_irq
(
regs
);
}
#endif
#if
def CONFIG_8xx
#if
defined(CONFIG_PPC32) && defined(CONFIG_8xx)
void
SoftwareEmulation
(
struct
pt_regs
*
regs
)
{
extern
int
do_mathemu
(
struct
pt_regs
*
);
...
...
@@ -879,8 +1054,9 @@ void SoftwareEmulation(struct pt_regs *regs)
}
else
emulate_single_step
(
regs
);
}
#endif
/*
CONFIG_8xx
*/
#endif
/*
defined(CONFIG_PPC32) && defined(CONFIG_8xx)
*/
#ifdef CONFIG_PPC32
#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
void
DebugException
(
struct
pt_regs
*
regs
,
unsigned
long
debug_status
)
...
...
@@ -909,42 +1085,36 @@ void TAUException(struct pt_regs *regs)
regs
->
nip
,
regs
->
msr
,
regs
->
trap
,
print_tainted
());
}
#endif
/* CONFIG_INT_TAU */
void
AltivecUnavailException
(
struct
pt_regs
*
regs
)
{
static
int
kernel_altivec_count
;
#ifndef CONFIG_ALTIVEC
if
(
user_mode
(
regs
))
{
/* A user program has executed an altivec instruction,
but this kernel doesn't support altivec. */
_exception
(
SIGILL
,
regs
,
ILL_ILLOPC
,
regs
->
nip
);
return
;
}
#endif
/* The kernel has executed an altivec instruction without
first enabling altivec. Whinge but let it do it. */
if
(
++
kernel_altivec_count
<
10
)
printk
(
KERN_ERR
"AltiVec used in kernel (task=%p, pc=%lx)
\n
"
,
current
,
regs
->
nip
);
regs
->
msr
|=
MSR_VEC
;
}
#endif
/* CONFIG_PPC32*/
#ifdef CONFIG_ALTIVEC
void
AltivecAssistE
xception
(
struct
pt_regs
*
regs
)
void
altivec_assist_e
xception
(
struct
pt_regs
*
regs
)
{
int
err
;
#ifdef CONFIG_PPC64
siginfo_t
info
;
#endif
#ifdef CONFIG_PPC32
preempt_disable
();
if
(
regs
->
msr
&
MSR_VEC
)
giveup_altivec
(
current
);
preempt_enable
();
#endif
if
(
!
user_mode
(
regs
))
{
printk
(
KERN_EMERG
"VMX/Altivec assist exception in kernel mode"
" at %lx
\n
"
,
regs
->
nip
);
die
(
"Kernel Altivec assist exception"
,
regs
,
SIGILL
);
die
(
"Kernel "
#ifdef CONFIG_PPC64
"VMX/"
#endif
"Altivec assist exception"
,
regs
,
SIGILL
);
}
#ifdef CONFIG_PPC64
flush_altivec_to_thread
(
current
);
#endif
/* CONFIG_PPC64 */
err
=
emulate_altivec
(
regs
);
if
(
err
==
0
)
{
regs
->
nip
+=
4
;
/* skip emulated instruction */
...
...
@@ -954,7 +1124,15 @@ void AltivecAssistException(struct pt_regs *regs)
if
(
err
==
-
EFAULT
)
{
/* got an error reading the instruction */
#ifdef CONFIG_PPC32
_exception
(
SIGSEGV
,
regs
,
SEGV_ACCERR
,
regs
->
nip
);
#else
info
.
si_signo
=
SIGSEGV
;
info
.
si_errno
=
0
;
info
.
si_code
=
SEGV_MAPERR
;
info
.
si_addr
=
(
void
__user
*
)
regs
->
nip
;
force_sig_info
(
SIGSEGV
,
&
info
,
current
);
#endif
}
else
{
/* didn't recognize the instruction */
/* XXX quick hack for now: set the non-Java bit in the VSCR */
...
...
@@ -966,13 +1144,7 @@ void AltivecAssistException(struct pt_regs *regs)
}
#endif
/* CONFIG_ALTIVEC */
#ifdef CONFIG_E500
void
PerformanceMonitorException
(
struct
pt_regs
*
regs
)
{
perf_irq
(
regs
);
}
#endif
#ifdef CONFIG_PPC32
#ifdef CONFIG_FSL_BOOKE
void
CacheLockingException
(
struct
pt_regs
*
regs
,
unsigned
long
address
,
unsigned
long
error_code
)
...
...
@@ -1022,7 +1194,24 @@ void SPEFloatingPointException(struct pt_regs *regs)
return
;
}
#endif
#endif
/* CONFIG_PPC32 */
#ifdef CONFIG_PPC64
/*
* We enter here if we get an unrecoverable exception, that is, one
* that happened at a point where the RI (recoverable interrupt) bit
* in the MSR is 0. This indicates that SRR0/1 are live, and that
* we therefore lost state by taking this exception.
*/
void
unrecoverable_exception
(
struct
pt_regs
*
regs
)
{
printk
(
KERN_EMERG
"Unrecoverable exception %lx at %lx
\n
"
,
regs
->
trap
,
regs
->
nip
);
die
(
"Unrecoverable exception"
,
regs
,
SIGABRT
);
}
#endif
/* CONFIG_PPC64 */
#ifdef CONFIG_PPC32
#ifdef CONFIG_BOOKE_WDT
/*
* Default handler for a Watchdog exception,
...
...
@@ -1041,6 +1230,20 @@ void WatchdogException(struct pt_regs *regs)
WatchdogHandler
(
regs
);
}
#endif
#endif
/* CONFIG_PPC32 */
#ifdef CONFIG_PPC64
/*
* We enter here if we discover during exception entry that we are
* running in supervisor mode with a userspace value in the stack pointer.
*/
void
kernel_bad_stack
(
struct
pt_regs
*
regs
)
{
printk
(
KERN_EMERG
"Bad kernel stack pointer %lx at %lx
\n
"
,
regs
->
gpr
[
1
],
regs
->
nip
);
die
(
"Bad kernel stack pointer"
,
regs
,
SIGABRT
);
}
#endif
void
__init
trap_init
(
void
)
{
...
...
arch/powerpc/kernel/vmlinux.lds
deleted
100644 → 0
View file @
c0c0d996
/* Align . to a 8 byte boundary equals to maximum function alignment. */
/* sched.text is aling to function alignment to secure we have same
* address even at second ld pass when generating System.map */
/* spinlock.text is aling to function alignment to secure we have same
* address even at second ld pass when generating System.map */
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to
the beginning of the section so we begin them at 0. */
/* Stabs debugging sections. */
OUTPUT_ARCH(powerpc:common)
jiffies = jiffies_64 + 4;
SECTIONS
{
/* Read-only sections, merged into text segment: */
. = + SIZEOF_HEADERS;
.interp : { *(.interp) }
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.rel.text : { *(.rel.text) }
.rela.text : { *(.rela.text) }
.rel.data : { *(.rel.data) }
.rela.data : { *(.rela.data) }
.rel.rodata : { *(.rel.rodata) }
.rela.rodata : { *(.rela.rodata) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
/* .init : { *(.init) } =0*/
.plt : { *(.plt) }
.text :
{
*(.text)
. = ALIGN(8); __sched_text_start = .; *(.sched.text) __sched_text_end = .;
. = ALIGN(8); __lock_text_start = .; *(.spinlock.text) __lock_text_end = .;
*(.fixup)
*(.got1)
__got2_start = .;
*(.got2)
__got2_end = .;
}
_etext = .;
PROVIDE (etext = .);
.rodata : AT(ADDR(.rodata) - 0) { *(.rodata) *(.rodata.*) *(__vermagic) } .rodata1 : AT(ADDR(.rodata1) - 0) { *(.rodata1) } .pci_fixup : AT(ADDR(.pci_fixup) - 0) { __start_pci_fixups_early = .; *(.pci_fixup_early) __end_pci_fixups_early = .; __start_pci_fixups_header = .; *(.pci_fixup_header) __end_pci_fixups_header = .; __start_pci_fixups_final = .; *(.pci_fixup_final) __end_pci_fixups_final = .; __start_pci_fixups_enable = .; *(.pci_fixup_enable) __end_pci_fixups_enable = .; } __ksymtab : AT(ADDR(__ksymtab) - 0) { __start___ksymtab = .; *(__ksymtab) __stop___ksymtab = .; } __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - 0) { __start___ksymtab_gpl = .; *(__ksymtab_gpl) __stop___ksymtab_gpl = .; } __kcrctab : AT(ADDR(__kcrctab) - 0) { __start___kcrctab = .; *(__kcrctab) __stop___kcrctab = .; } __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - 0) { __start___kcrctab_gpl = .; *(__kcrctab_gpl) __stop___kcrctab_gpl = .; } __ksymtab_strings : AT(ADDR(__ksymtab_strings) - 0) { *(__ksymtab_strings) } __param : AT(ADDR(__param) - 0) { __start___param = .; *(__param) __stop___param = .; }
.fini : { *(.fini) } =0
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
.fixup : { *(.fixup) }
__ex_table : {
__start___ex_table = .;
*(__ex_table)
__stop___ex_table = .;
}
__bug_table : {
__start___bug_table = .;
*(__bug_table)
__stop___bug_table = .;
}
/* Read-write section, merged into data segment: */
. = ALIGN(4096);
.data :
{
*(.data)
*(.data1)
*(.sdata)
*(.sdata2)
*(.got.plt) *(.got)
*(.dynamic)
CONSTRUCTORS
}
. = ALIGN(4096);
__nosave_begin = .;
.data_nosave : { *(.data.nosave) }
. = ALIGN(4096);
__nosave_end = .;
. = ALIGN(32);
.data.cacheline_aligned : { *(.data.cacheline_aligned) }
_edata = .;
PROVIDE (edata = .);
. = ALIGN(8192);
.data.init_task : { *(.data.init_task) }
. = ALIGN(4096);
__init_begin = .;
.init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
/* .exit.text is discarded at runtime, not link time,
to deal with references from __bug_table */
.exit.text : { *(.exit.text) }
.init.data : {
*(.init.data);
__vtop_table_begin = .;
*(.vtop_fixup);
__vtop_table_end = .;
__ptov_table_begin = .;
*(.ptov_fixup);
__ptov_table_end = .;
}
. = ALIGN(16);
__setup_start = .;
.init.setup : { *(.init.setup) }
__setup_end = .;
__initcall_start = .;
.initcall.init : {
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init)
*(.initcall5.init)
*(.initcall6.init)
*(.initcall7.init)
}
__initcall_end = .;
__con_initcall_start = .;
.con_initcall.init : { *(.con_initcall.init) }
__con_initcall_end = .;
.security_initcall.init : AT(ADDR(.security_initcall.init) - 0) { __security_initcall_start = .; *(.security_initcall.init) __security_initcall_end = .; }
__start___ftr_fixup = .;
__ftr_fixup : { *(__ftr_fixup) }
__stop___ftr_fixup = .;
. = ALIGN(32);
__per_cpu_start = .;
.data.percpu : { *(.data.percpu) }
__per_cpu_end = .;
. = ALIGN(4096);
__initramfs_start = .;
.init.ramfs : { *(.init.ramfs) }
__initramfs_end = .;
. = ALIGN(4096);
__init_end = .;
. = ALIGN(4096);
_sextratext = .;
_eextratext = .;
__bss_start = .;
.bss :
{
*(.sbss) *(.scommon)
*(.dynbss)
*(.bss)
*(COMMON)
}
__bss_stop = .;
_end = . ;
PROVIDE (end = .);
/* Sections to be discarded. */
/DISCARD/ : {
*(.exitcall.exit)
*(.exit.data)
}
}
arch/powerpc/kernel/vmlinux.lds.S
View file @
292dcc86
#include <linux/config.h>
#ifdef CONFIG_PPC64
#include <asm/page.h>
#endif
#include <asm-generic/vmlinux.lds.h>
#ifdef CONFIG_PPC64
OUTPUT_ARCH
(
powerpc
:
common64
)
jiffies
=
jiffies_64
;
#else
OUTPUT_ARCH
(
powerpc
:
common
)
jiffies
=
jiffies_64
+
4
;
#endif
SECTIONS
{
/
*
Sections
to
be
discarded
.
*/
/
DISCARD
/
:
{
*(.
exitcall.exit
)
#ifdef CONFIG_PPC32
*(.
exit.data
)
#endif
}
/
*
Read
-
only
sections
,
merged
into
text
segment
:
*/
#ifdef CONFIG_PPC32
.
=
+
SIZEOF_HEADERS
;
.
interp
:
{
*(
.
interp
)
}
.
hash
:
{
*(
.
hash
)
}
...
...
@@ -28,17 +47,30 @@ SECTIONS
.
rela.plt
:
{
*(
.
rela
.
plt
)
}
/*
.
init
:
{
*(
.
init
)
}
=
0
*/
.
plt
:
{
*(
.
plt
)
}
.
text
:
{
#endif
.
text
:
{
#ifdef CONFIG_PPC64
*(.
text
.
text
.
*)
#else
*(.
text
)
#endif
SCHED_TEXT
LOCK_TEXT
#ifdef CONFIG_PPC64
KPROBES_TEXT
#endif
*(.
fixup
)
#ifdef CONFIG_PPC32
*(.
got1
)
__got2_start
=
.
;
*(.
got2
)
__got2_end
=
.
;
#else
.
=
ALIGN
(
PAGE_SIZE
)
;
_etext
=
.
;
#endif
}
#ifdef CONFIG_PPC32
_etext
=
.
;
PROVIDE
(
etext
=
.
)
;
...
...
@@ -48,6 +80,7 @@ SECTIONS
.
dtors
:
{
*(
.
dtors
)
}
.
fixup
:
{
*(
.
fixup
)
}
#endif
__ex_table
:
{
__start___ex_table
=
.
;
...
...
@@ -61,6 +94,17 @@ SECTIONS
__stop___bug_table
=
.
;
}
#ifdef CONFIG_PPC64
__ftr_fixup
:
{
__start___ftr_fixup
=
.
;
*(
__ftr_fixup
)
__stop___ftr_fixup
=
.
;
}
RODATA
#endif
#ifdef CONFIG_PPC32
/
*
Read
-
write
section
,
merged
into
data
segment
:
*/
.
=
ALIGN
(
4096
)
;
.
data
:
...
...
@@ -90,16 +134,25 @@ SECTIONS
.
data.
init_task
:
{
*(
.
data
.
init_task
)
}
.
=
ALIGN
(
4096
)
;
#else
/
*
will
be
freed
after
init
*/
.
=
ALIGN
(
PAGE_SIZE
)
;
#endif
__init_begin
=
.
;
.
init.text
:
{
_sinittext
=
.
;
*(.
init.text
)
_einittext
=
.
;
}
#ifdef CONFIG_PPC32
/
*
.
exit
.
text
is
discarded
at
runtime
,
not
link
time
,
to
deal
with
references
from
__bug_table
*/
.
exit.text
:
{
*(
.
exit
.
text
)
}
#endif
.
init.data
:
{
#ifdef CONFIG_PPC64
*(.
init.data
)
#else
*(.
init.data
)
;
__vtop_table_begin
=
.
;
*(.
vtop_fixup
)
;
...
...
@@ -107,13 +160,31 @@ SECTIONS
__ptov_table_begin
=
.
;
*(.
ptov_fixup
)
;
__ptov_table_end
=
.
;
#endif
}
.
=
ALIGN
(
16
)
;
#ifdef CONFIG_PPC32
__setup_start
=
.
;
.
init.setup
:
{
*(
.
init
.
setup
)
}
#endif
.
init.setup
:
{
#ifdef CONFIG_PPC64
__setup_start
=
.
;
#endif
*(.
init.setup
)
#ifdef CONFIG_PPC64
__setup_end
=
.
;
#endif
}
#ifdef CONFIG_PPC32
__setup_end
=
.
;
__initcall_start
=
.
;
#endif
.
initcall.init
:
{
#ifdef CONFIG_PPC64
__initcall_start
=
.
;
#endif
*(.
initcall1.init
)
*(.
initcall2.init
)
*(.
initcall3.init
)
...
...
@@ -121,27 +192,109 @@ SECTIONS
*(.
initcall5.init
)
*(.
initcall6.init
)
*(.
initcall7.init
)
#ifdef CONFIG_PPC64
__initcall_end
=
.
;
#endif
}
#ifdef CONFIG_PPC32
__initcall_end
=
.
;
__con_initcall_start
=
.
;
.
con_initcall
.
init
:
{
*(
.
con_initcall
.
init
)
}
#endif
.
con_initcall
.
init
:
{
#ifdef CONFIG_PPC64
__con_initcall_start
=
.
;
#endif
*(.
con_initcall
.
init
)
#ifdef CONFIG_PPC64
__con_initcall_end
=
.
;
#endif
}
#ifdef CONFIG_PPC32
__con_initcall_end
=
.
;
#endif
SECURITY_INIT
#ifdef CONFIG_PPC32
__start___ftr_fixup
=
.
;
__ftr_fixup
:
{
*(
__ftr_fixup
)
}
__stop___ftr_fixup
=
.
;
#else
.
=
ALIGN
(
PAGE_SIZE
)
;
.
init.ramfs
:
{
__initramfs_start
=
.
;
*(.
init.ramfs
)
__initramfs_end
=
.
;
}
#endif
#ifdef CONFIG_PPC32
.
=
ALIGN
(
32
)
;
__per_cpu_start
=
.
;
.
data.percpu
:
{
*(
.
data
.
percpu
)
}
#endif
.
data.percpu
:
{
#ifdef CONFIG_PPC64
__per_cpu_start
=
.
;
#endif
*(.
data.percpu
)
#ifdef CONFIG_PPC64
__per_cpu_end
=
.
;
#endif
}
#ifdef CONFIG_PPC32
__per_cpu_end
=
.
;
#endif
#ifdef CONFIG_PPC64
.
=
ALIGN
(
PAGE_SIZE
)
;
.
=
ALIGN
(
16384
)
;
__init_end
=
.
;
/
*
freed
after
init
ends
here
*/
/
*
Read
/
write
sections
*/
.
=
ALIGN
(
PAGE_SIZE
)
;
.
=
ALIGN
(
16384
)
;
/
*
The
initial
task
and
kernel
stack
*/
.
data.
init_task
:
{
*(.
data.
init_task
)
}
.
=
ALIGN
(
PAGE_SIZE
)
;
.
data.
page_aligned
:
{
*(.
data.
page_aligned
)
}
.
data.
cacheline_aligned
:
{
*(.
data.
cacheline_aligned
)
}
.
data
:
{
*(.
data
.
data
.
rel
*
.
toc1
)
*(.
branch_lt
)
}
.
opd
:
{
*(.
opd
)
}
.
got
:
{
__toc_start
=
.
;
*(.
got
)
*(.
toc
)
.
=
ALIGN
(
PAGE_SIZE
)
;
_edata
=
.
;
}
.
=
ALIGN
(
PAGE_SIZE
)
;
#else
.
=
ALIGN
(
4096
)
;
__initramfs_start
=
.
;
.
init.ramfs
:
{
*(
.
init
.
ramfs
)
}
.
init.ramfs
:
{
*(.
init.ramfs
)
}
__initramfs_end
=
.
;
.
=
ALIGN
(
4096
)
;
...
...
@@ -152,21 +305,30 @@ SECTIONS
_eextratext
=
.
;
__bss_start
=
.
;
.
bss
:
{
#endif
.
bss
:
{
#ifdef CONFIG_PPC64
__bss_start
=
.
;
#else
*(.
sbss
)
*(
.
scommon
)
*(.
dynbss
)
#endif
*(.
bss
)
#ifdef CONFIG_PPC32
*(
COMMON
)
#else
__bss_stop
=
.
;
#endif
}
#ifdef CONFIG_PPC32
__bss_stop
=
.
;
#endif
#ifdef CONFIG_PPC64
.
=
ALIGN
(
PAGE_SIZE
)
;
#endif
_end
=
.
;
#ifdef CONFIG_PPC32
PROVIDE
(
end
=
.
)
;
/
*
Sections
to
be
discarded
.
*/
/
DISCARD
/
:
{
*(.
exitcall.exit
)
*(.
exit.data
)
}
#endif
}
include/asm-ppc64/iSeries/HvCallS
m.h
→
arch/powerpc/platforms/iseries/call_s
m.h
View file @
292dcc86
/*
* HvCallSm.h
* Copyright (C) 2001 Mike Corrigan IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -16,8 +15,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _
HVCALL
SM_H
#define _
HVCALL
SM_H
#ifndef _
ISERIES_CALL_
SM_H
#define _
ISERIES_CALL_
SM_H
/*
* This file contains the "hypervisor call" interface which is used to
...
...
@@ -35,4 +34,4 @@ static inline u64 HvCallSm_get64BitsOfAccessMap(HvLpIndex lpIndex,
return
HvCall2
(
HvCallSmGet64BitsOfAccessMap
,
lpIndex
,
indexIntoBitMap
);
}
#endif
/* _
HVCALL
SM_H */
#endif
/* _
ISERIES_CALL_
SM_H */
include/asm-ppc64/iSeries/ItIplParmsReal
.h
→
arch/powerpc/platforms/iseries/ipl_parms
.h
View file @
292dcc86
/*
* ItIplParmsReal.h
* Copyright (C) 2001 Mike Corrigan IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -16,8 +15,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _I
TIPLPARMSREAL
_H
#define _I
TIPLPARMSREAL
_H
#ifndef _I
SERIES_IPL_PARMS
_H
#define _I
SERIES_IPL_PARMS
_H
/*
* This struct maps the IPL Parameters DMA'd from the SP.
...
...
@@ -68,4 +67,4 @@ struct ItIplParmsReal {
extern
struct
ItIplParmsReal
xItIplParmsReal
;
#endif
/* _I
TIPLPARMSREAL
_H */
#endif
/* _I
SERIES_IPL_PARMS
_H */
arch/powerpc/platforms/iseries/irq.c
View file @
292dcc86
...
...
@@ -40,7 +40,8 @@
#include <asm/iSeries/HvLpEvent.h>
#include <asm/iSeries/HvCallPci.h>
#include <asm/iSeries/HvCallXm.h>
#include <asm/iSeries/iSeries_irq.h>
#include "irq.h"
/* This maps virtual irq numbers to real irqs */
unsigned
int
virt_irq_to_real_map
[
NR_IRQS
];
...
...
include/asm-ppc64/iSeries/iSeries_
irq.h
→
arch/powerpc/platforms/iseries/
irq.h
View file @
292dcc86
#ifndef _
_ISERIES_IRQ_H__
#define _
_ISERIES_IRQ_H__
#ifndef _
ISERIES_IRQ_H
#define _
ISERIES_IRQ_H
extern
void
iSeries_init_IRQ
(
void
);
extern
int
iSeries_allocate_IRQ
(
HvBusNumber
,
HvSubBusNumber
,
HvAgentId
);
extern
void
iSeries_activate_IRQs
(
void
);
#endif
/* _
_ISERIES_IRQ_H__
*/
#endif
/* _
ISERIES_IRQ_H
*/
arch/powerpc/platforms/iseries/lpardata.c
View file @
292dcc86
...
...
@@ -19,15 +19,15 @@
#include <asm/lppaca.h>
#include <asm/iSeries/ItLpRegSave.h>
#include <asm/paca.h>
#include <asm/iSeries/HvReleaseData.h>
#include <asm/iSeries/LparMap.h>
#include <asm/iSeries/ItVpdAreas.h>
#include <asm/iSeries/ItIplParmsReal.h>
#include <asm/iSeries/ItExtVpdPanel.h>
#include <asm/iSeries/ItLpQueue.h>
#include <asm/iSeries/IoHriProcessorVpd.h>
#include <asm/iSeries/ItSpCommArea.h>
#include "vpd_areas.h"
#include "spcomm_area.h"
#include "ipl_parms.h"
#include "processor_vpd.h"
#include "release_data.h"
/* The HvReleaseData is the root of the information shared between
* the hypervisor and Linux.
...
...
arch/p
pc64/kernel
/lparmap.c
→
arch/p
owerpc/platforms/iseries
/lparmap.c
View file @
292dcc86
File moved
arch/powerpc/platforms/iseries/lpevents.c
View file @
292dcc86
...
...
@@ -13,6 +13,8 @@
#include <linux/bootmem.h>
#include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include <linux/module.h>
#include <asm/system.h>
#include <asm/paca.h>
#include <asm/iSeries/ItLpQueue.h>
...
...
include/asm-ppc64/iSeries/IoHriMainS
tore.h
→
arch/powerpc/platforms/iseries/main_s
tore.h
View file @
292dcc86
/*
* IoHriMainStore.h
* Copyright (C) 2001 Mike Corrigan IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -17,8 +16,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _I
OHRIMAIN
STORE_H
#define _I
OHRIMAIN
STORE_H
#ifndef _I
SERIES_MAIN_
STORE_H
#define _I
SERIES_MAIN_
STORE_H
/* Main Store Vpd for Condor,iStar,sStar */
struct
IoHriMainStoreSegment4
{
...
...
@@ -163,4 +162,4 @@ struct IoHriMainStoreSegment5 {
extern
u64
xMsVpd
[];
#endif
/* _I
OHRIMAIN
STORE_H */
#endif
/* _I
SERIES_MAIN_
STORE_H */
arch/powerpc/platforms/iseries/pci.c
View file @
292dcc86
...
...
@@ -37,12 +37,13 @@
#include <asm/iSeries/HvCallPci.h>
#include <asm/iSeries/HvCallXm.h>
#include <asm/iSeries/iSeries_irq.h>
#include <asm/iSeries/iSeries_pci.h>
#include <asm/iSeries/mf.h>
#include <asm/ppc-pci.h>
#include "irq.h"
extern
unsigned
long
io_page_mask
;
/*
...
...
arch/powerpc/platforms/iseries/proc.c
View file @
292dcc86
...
...
@@ -26,8 +26,9 @@
#include <asm/lppaca.h>
#include <asm/iSeries/ItLpQueue.h>
#include <asm/iSeries/HvCallXm.h>
#include <asm/iSeries/IoHriMainStore.h>
#include <asm/iSeries/IoHriProcessorVpd.h>
#include "processor_vpd.h"
#include "main_store.h"
static
int
__init
iseries_proc_create
(
void
)
{
...
...
include/asm-ppc64/iSeries/IoHriProcessorV
pd.h
→
arch/powerpc/platforms/iseries/processor_v
pd.h
View file @
292dcc86
/*
* IoHriProcessorVpd.h
* Copyright (C) 2001 Mike Corrigan IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -16,8 +15,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _I
OHRIPROCESSOR
VPD_H
#define _I
OHRIPROCESSOR
VPD_H
#ifndef _I
SERIES_PROCESSOR_
VPD_H
#define _I
SERIES_PROCESSOR_
VPD_H
#include <asm/types.h>
...
...
@@ -83,4 +82,4 @@ struct IoHriProcessorVpd {
extern
struct
IoHriProcessorVpd
xIoHriProcessorVpd
[];
#endif
/* _I
OHRIPROCESSOR
VPD_H */
#endif
/* _I
SERIES_PROCESSOR_
VPD_H */
include/asm-ppc64/iSeries/HvReleaseD
ata.h
→
arch/powerpc/platforms/iseries/release_d
ata.h
View file @
292dcc86
/*
* HvReleaseData.h
* Copyright (C) 2001 Mike Corrigan IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -16,8 +15,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _
HVRELEASE
DATA_H
#define _
HVRELEASE
DATA_H
#ifndef _
ISERIES_RELEASE_
DATA_H
#define _
ISERIES_RELEASE_
DATA_H
/*
* This control block contains the critical information about the
...
...
@@ -61,4 +60,4 @@ struct HvReleaseData {
extern
struct
HvReleaseData
hvReleaseData
;
#endif
/* _
HVRELEASE
DATA_H */
#endif
/* _
ISERIES_RELEASE_
DATA_H */
arch/powerpc/platforms/iseries/setup.c
View file @
292dcc86
...
...
@@ -48,18 +48,18 @@
#include <asm/iSeries/HvCallHpt.h>
#include <asm/iSeries/HvLpConfig.h>
#include <asm/iSeries/HvCallEvent.h>
#include <asm/iSeries/HvCallSm.h>
#include <asm/iSeries/HvCallXm.h>
#include <asm/iSeries/ItLpQueue.h>
#include <asm/iSeries/IoHriMainStore.h>
#include <asm/iSeries/mf.h>
#include <asm/iSeries/HvLpEvent.h>
#include <asm/iSeries/iSeries_irq.h>
#include <asm/iSeries/IoHriProcessorVpd.h>
#include <asm/iSeries/ItVpdAreas.h>
#include <asm/iSeries/LparMap.h>
#include "setup.h"
#include "irq.h"
#include "vpd_areas.h"
#include "processor_vpd.h"
#include "main_store.h"
#include "call_sm.h"
extern
void
hvlog
(
char
*
fmt
,
...);
...
...
include/asm-ppc64/iSeries/ItSpCommA
rea.h
→
arch/powerpc/platforms/iseries/spcomm_a
rea.h
View file @
292dcc86
/*
* ItSpCommArea.h
* Copyright (C) 2001 Mike Corrigan IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -17,8 +16,8 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _I
TSPCOMM
AREA_H
#define _I
TSPCOMM
AREA_H
#ifndef _I
SERIES_SPCOMM_
AREA_H
#define _I
SERIES_SPCOMM_
AREA_H
struct
SpCommArea
{
...
...
@@ -34,4 +33,4 @@ struct SpCommArea {
extern
struct
SpCommArea
xSpCommArea
;
#endif
/* _I
TSPCOMM
AREA_H */
#endif
/* _I
SERIES_SPCOMM_
AREA_H */
include/asm-ppc64/iSeries/ItVpdA
reas.h
→
arch/powerpc/platforms/iseries/vpd_a
reas.h
View file @
292dcc86
/*
* ItVpdAreas.h
* Copyright (C) 2001 Mike Corrigan IBM Corporation
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -16,8 +15,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _I
TVPD
AREAS_H
#define _I
TVPD
AREAS_H
#ifndef _I
SERIES_VPD_
AREAS_H
#define _I
SERIES_VPD_
AREAS_H
/*
* This file defines the address and length of all of the VPD area passed to
...
...
@@ -86,4 +85,4 @@ struct ItVpdAreas {
extern
struct
ItVpdAreas
itVpdAreas
;
#endif
/* _I
TVPD
AREAS_H */
#endif
/* _I
SERIES_VPD_
AREAS_H */
arch/ppc/kernel/Makefile
View file @
292dcc86
...
...
@@ -38,6 +38,8 @@ endif
# These are here while we do the architecture merge
vecemu-y
+=
../../powerpc/kernel/vecemu.o
vector-y
+=
../../powerpc/kernel/vector.o
fpu-y
+=
../../powerpc/kernel/fpu.o
else
obj-y
:=
entry.o irq.o idle.o time.o misc.o
\
...
...
arch/ppc/kernel/fpu.S
deleted
100644 → 0
View file @
c0c0d996
/*
*
FPU
support
code
,
moved
here
from
head
.
S
so
that
it
can
be
used
*
by
chips
which
use
other
head
-
whatever
.
S
files
.
*
*
This
program
is
free
software
; you can redistribute it and/or
*
modify
it
under
the
terms
of
the
GNU
General
Public
License
*
as
published
by
the
Free
Software
Foundation
; either version
*
2
of
the
License
,
or
(
at
your
option
)
any
later
version
.
*
*/
#include <linux/config.h>
#include <asm/processor.h>
#include <asm/page.h>
#include <asm/mmu.h>
#include <asm/pgtable.h>
#include <asm/cputable.h>
#include <asm/cache.h>
#include <asm/thread_info.h>
#include <asm/ppc_asm.h>
#include <asm/asm-offsets.h>
/*
*
This
task
wants
to
use
the
FPU
now
.
*
On
UP
,
disable
FP
for
the
task
which
had
the
FPU
previously
,
*
and
save
its
floating
-
point
registers
in
its
thread_struct
.
*
Load
up
this
task
's FP registers from its thread_struct,
*
enable
the
FPU
for
the
current
task
and
return
to
the
task
.
*/
.
globl
load_up_fpu
load_up_fpu
:
mfmsr
r5
ori
r5
,
r5
,
MSR_FP
#ifdef CONFIG_PPC64BRIDGE
clrldi
r5
,
r5
,
1
/*
turn
off
64
-
bit
mode
*/
#endif /* CONFIG_PPC64BRIDGE */
SYNC
MTMSRD
(
r5
)
/*
enable
use
of
fpu
now
*/
isync
/*
*
For
SMP
,
we
don
't do lazy FPU switching because it just gets too
*
horrendously
complex
,
especially
when
a
task
switches
from
one
CPU
*
to
another
.
Instead
we
call
giveup_fpu
in
switch_to
.
*/
#ifndef CONFIG_SMP
tophys
(
r6
,0)
/*
get
__pa
constant
*/
addis
r3
,
r6
,
last_task_used_math
@
ha
lwz
r4
,
last_task_used_math
@
l
(
r3
)
cmpwi
0
,
r4
,
0
beq
1
f
add
r4
,
r4
,
r6
addi
r4
,
r4
,
THREAD
/*
want
last_task_used_math
->
thread
*/
SAVE_32FPRS
(0,
r4
)
mffs
fr0
stfd
fr0
,
THREAD_FPSCR
-
4
(
r4
)
lwz
r5
,
PT_REGS
(
r4
)
add
r5
,
r5
,
r6
lwz
r4
,
_MSR
-
STACK_FRAME_OVERHEAD
(
r5
)
li
r10
,
MSR_FP|MSR_FE0|MSR_FE1
andc
r4
,
r4
,
r10
/*
disable
FP
for
previous
task
*/
stw
r4
,
_MSR
-
STACK_FRAME_OVERHEAD
(
r5
)
1
:
#endif /* CONFIG_SMP */
/
*
enable
use
of
FP
after
return
*/
mfspr
r5
,
SPRN_SPRG3
/*
current
task
's THREAD (phys) */
lwz
r4
,
THREAD_FPEXC_MODE
(
r5
)
ori
r9
,
r9
,
MSR_FP
/*
enable
FP
for
current
*/
or
r9
,
r9
,
r4
lfd
fr0
,
THREAD_FPSCR
-
4
(
r5
)
mtfsf
0xff
,
fr0
REST_32FPRS
(0,
r5
)
#ifndef CONFIG_SMP
subi
r4
,
r5
,
THREAD
sub
r4
,
r4
,
r6
stw
r4
,
last_task_used_math
@
l
(
r3
)
#endif /* CONFIG_SMP */
/
*
restore
registers
and
return
*/
/
*
we
haven
't used ctr or xer or lr */
b
fast_exception_return
/*
*
FP
unavailable
trap
from
kernel
-
print
a
message
,
but
let
*
the
task
use
FP
in
the
kernel
until
it
returns
to
user
mode
.
*/
.
globl
KernelFP
KernelFP
:
lwz
r3
,
_MSR
(
r1
)
ori
r3
,
r3
,
MSR_FP
stw
r3
,
_MSR
(
r1
)
/*
enable
use
of
FP
after
return
*/
lis
r3
,
86
f
@
h
ori
r3
,
r3
,
86
f
@
l
mr
r4
,
r2
/*
current
*/
lwz
r5
,
_NIP
(
r1
)
bl
printk
b
ret_from_except
86
:
.
string
"floating point used in kernel (task=%p, pc=%x)\n"
.
align
4
,
0
/*
*
giveup_fpu
(
tsk
)
*
Disable
FP
for
the
task
given
as
the
argument
,
*
and
save
the
floating
-
point
registers
in
its
thread_struct
.
*
Enables
the
FPU
for
use
in
the
kernel
on
return
.
*/
.
globl
giveup_fpu
giveup_fpu
:
mfmsr
r5
ori
r5
,
r5
,
MSR_FP
SYNC_601
ISYNC_601
MTMSRD
(
r5
)
/*
enable
use
of
fpu
now
*/
SYNC_601
isync
cmpwi
0
,
r3
,
0
beqlr
-
/*
if
no
previous
owner
,
done
*/
addi
r3
,
r3
,
THREAD
/*
want
THREAD
of
task
*/
lwz
r5
,
PT_REGS
(
r3
)
cmpwi
0
,
r5
,
0
SAVE_32FPRS
(0,
r3
)
mffs
fr0
stfd
fr0
,
THREAD_FPSCR
-
4
(
r3
)
beq
1
f
lwz
r4
,
_MSR
-
STACK_FRAME_OVERHEAD
(
r5
)
li
r3
,
MSR_FP|MSR_FE0|MSR_FE1
andc
r4
,
r4
,
r3
/*
disable
FP
for
previous
task
*/
stw
r4
,
_MSR
-
STACK_FRAME_OVERHEAD
(
r5
)
1
:
#ifndef CONFIG_SMP
li
r5
,
0
lis
r4
,
last_task_used_math
@
ha
stw
r5
,
last_task_used_math
@
l
(
r4
)
#endif /* CONFIG_SMP */
blr
arch/ppc/kernel/head.S
View file @
292dcc86
...
...
@@ -349,12 +349,12 @@ i##n: \
/*
System
reset
*/
/*
core99
pmac
starts
the
seconary
here
by
changing
the
vector
,
and
putting
it
back
to
what
it
was
(
UnknownE
xception
)
when
done
.
*/
putting
it
back
to
what
it
was
(
unknown_e
xception
)
when
done
.
*/
#if defined(CONFIG_GEMINI) && defined(CONFIG_SMP)
.
=
0x100
b
__secondary_start_gemini
#else
EXCEPTION
(0
x100
,
Reset
,
UnknownE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x100
,
Reset
,
unknown_e
xception
,
EXC_XFER_STD
)
#endif
/*
Machine
check
*/
...
...
@@ -389,7 +389,7 @@ i##n: \
cmpwi
cr1
,
r4
,
0
bne
cr1
,
1
f
#endif
EXC_XFER_STD
(0
x200
,
MachineCheckE
xception
)
EXC_XFER_STD
(0
x200
,
machine_check_e
xception
)
#ifdef CONFIG_PPC_CHRP
1
:
b
machine_check_in_rtas
#endif
...
...
@@ -456,10 +456,10 @@ Alignment:
mfspr
r5
,
SPRN_DSISR
stw
r5
,
_DSISR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
x600
,
AlignmentE
xception
)
EXC_XFER_EE
(0
x600
,
alignment_e
xception
)
/*
Program
check
exception
*/
EXCEPTION
(0
x700
,
ProgramCheck
,
ProgramCheckE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x700
,
ProgramCheck
,
program_check_e
xception
,
EXC_XFER_STD
)
/*
Floating
-
point
unavailable
*/
.
=
0x800
...
...
@@ -472,8 +472,8 @@ FPUnavailable:
/*
Decrementer
*/
EXCEPTION
(0
x900
,
Decrementer
,
timer_interrupt
,
EXC_XFER_LITE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
System
call
*/
.
=
0xc00
...
...
@@ -482,8 +482,8 @@ SystemCall:
EXC_XFER_EE_LITE
(0
xc00
,
DoSyscall
)
/*
Single
step
-
not
used
on
601
*/
EXCEPTION
(0
xd00
,
SingleStep
,
SingleStepE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xd00
,
SingleStep
,
single_step_e
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
*
The
Altivec
unavailable
trap
is
at
0x0f20
.
Foo
.
...
...
@@ -502,7 +502,7 @@ SystemCall:
Trap_0f
:
EXCEPTION_PROLOG
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
xf00
,
UnknownE
xception
)
EXC_XFER_EE
(0
xf00
,
unknown_e
xception
)
/*
*
Handle
TLB
miss
for
instruction
on
603
/
60
3
e
.
...
...
@@ -702,44 +702,44 @@ DataStoreTLBMiss:
rfi
#ifndef CONFIG_ALTIVEC
#define
AltivecAssistException UnknownE
xception
#define
altivec_assist_exception unknown_e
xception
#endif
EXCEPTION
(0
x1300
,
Trap_13
,
InstructionBreakpoint
,
EXC_XFER_EE
)
EXCEPTION
(0
x1300
,
Trap_13
,
instruction_breakpoint_exception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1400
,
SMI
,
SMIException
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
unknown_e
xception
,
EXC_XFER_EE
)
#ifdef CONFIG_POWER4
EXCEPTION
(0
x1600
,
Trap_16
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
AltivecAssistE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
altivec_assist_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
TAUException
,
EXC_XFER_STD
)
#else /* !CONFIG_POWER4 */
EXCEPTION
(0
x1600
,
Trap_16
,
AltivecAssistE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
altivec_assist_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
TAUException
,
EXC_XFER_STD
)
EXCEPTION
(0
x1800
,
Trap_18
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif /* CONFIG_POWER4 */
EXCEPTION
(0
x1900
,
Trap_19
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1c00
,
Trap_1c
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1c00
,
Trap_1c
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2000
,
RunMode
,
RunModeException
,
EXC_XFER_EE
)
EXCEPTION
(0
x2100
,
Trap_21
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2200
,
Trap_22
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2300
,
Trap_23
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2400
,
Trap_24
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2500
,
Trap_25
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2600
,
Trap_26
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2700
,
Trap_27
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2800
,
Trap_28
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2900
,
Trap_29
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2a00
,
Trap_2a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2b00
,
Trap_2b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2c00
,
Trap_2c
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2d00
,
Trap_2d
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2e00
,
Trap_2e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2f00
,
MOLTrampoline
,
UnknownE
xception
,
EXC_XFER_EE_LITE
)
EXCEPTION
(0
x2100
,
Trap_21
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2200
,
Trap_22
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2300
,
Trap_23
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2400
,
Trap_24
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2500
,
Trap_25
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2600
,
Trap_26
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2700
,
Trap_27
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2800
,
Trap_28
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2900
,
Trap_29
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2a00
,
Trap_2a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2b00
,
Trap_2b
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2c00
,
Trap_2c
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2d00
,
Trap_2d
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2e00
,
Trap_2e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2f00
,
MOLTrampoline
,
unknown_e
xception
,
EXC_XFER_EE_LITE
)
.
globl
mol_trampoline
.
set
mol_trampoline
,
i0x2f00
...
...
@@ -751,7 +751,7 @@ AltiVecUnavailable:
#ifdef CONFIG_ALTIVEC
bne
load_up_altivec
/*
if
from
user
,
just
load
it
up
*/
#endif /* CONFIG_ALTIVEC */
EXC_XFER_EE_LITE
(0
xf20
,
AltivecUnavailE
xception
)
EXC_XFER_EE_LITE
(0
xf20
,
altivec_unavailable_e
xception
)
#ifdef CONFIG_PPC64BRIDGE
DataAccess
:
...
...
@@ -767,12 +767,12 @@ DataSegment:
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
mfspr
r4
,
SPRN_DAR
stw
r4
,
_DAR
(
r11
)
EXC_XFER_STD
(0
x380
,
UnknownE
xception
)
EXC_XFER_STD
(0
x380
,
unknown_e
xception
)
InstructionSegment
:
EXCEPTION_PROLOG
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_STD
(0
x480
,
UnknownE
xception
)
EXC_XFER_STD
(0
x480
,
unknown_e
xception
)
#endif /* CONFIG_PPC64BRIDGE */
#ifdef CONFIG_ALTIVEC
...
...
arch/ppc/kernel/head_44x.S
View file @
292dcc86
...
...
@@ -309,13 +309,13 @@ skpinv: addi r4,r4,1 /* Increment */
interrupt_base
:
/
*
Critical
Input
Interrupt
*/
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
unknown_e
xception
)
/
*
Machine
Check
Interrupt
*/
#ifdef CONFIG_440A
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#else
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#endif
/
*
Data
Storage
Interrupt
*/
...
...
@@ -442,7 +442,7 @@ interrupt_base:
#ifdef CONFIG_PPC_FPU
FP_UNAVAILABLE_EXCEPTION
#else
EXCEPTION
(0
x2010
,
FloatingPointUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2010
,
FloatingPointUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif
/
*
System
Call
Interrupt
*/
...
...
@@ -451,21 +451,21 @@ interrupt_base:
EXC_XFER_EE_LITE
(0
x0c00
,
DoSyscall
)
/
*
Auxillary
Processor
Unavailable
Interrupt
*/
EXCEPTION
(0
x2020
,
AuxillaryProcessorUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2020
,
AuxillaryProcessorUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Decrementer
Interrupt
*/
DECREMENTER_EXCEPTION
/
*
Fixed
Internal
Timer
Interrupt
*/
/
*
TODO
:
Add
FIT
support
*/
EXCEPTION
(0
x1010
,
FixedIntervalTimer
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1010
,
FixedIntervalTimer
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Watchdog
Timer
Interrupt
*/
/
*
TODO
:
Add
watchdog
support
*/
#ifdef CONFIG_BOOKE_WDT
CRITICAL_EXCEPTION
(0
x1020
,
WatchdogTimer
,
WatchdogException
)
#else
CRITICAL_EXCEPTION
(0
x1020
,
WatchdogTimer
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x1020
,
WatchdogTimer
,
unknown_e
xception
)
#endif
/
*
Data
TLB
Error
Interrupt
*/
...
...
arch/ppc/kernel/head_4xx.S
View file @
292dcc86
...
...
@@ -245,12 +245,12 @@ label:
/*
*
0x0100
-
Critical
Interrupt
Exception
*/
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInterrupt
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInterrupt
,
unknown_e
xception
)
/*
*
0x0200
-
Machine
Check
Exception
*/
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
/*
*
0x0300
-
Data
Storage
Exception
...
...
@@ -405,7 +405,7 @@ label:
mfspr
r4
,
SPRN_DEAR
/*
Grab
the
DEAR
and
save
it
*/
stw
r4
,
_DEAR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
x600
,
AlignmentE
xception
)
EXC_XFER_EE
(0
x600
,
alignment_e
xception
)
/*
0
x0700
-
Program
Exception
*/
START_EXCEPTION
(0
x0700
,
ProgramCheck
)
...
...
@@ -413,21 +413,21 @@ label:
mfspr
r4
,
SPRN_ESR
/*
Grab
the
ESR
and
save
it
*/
stw
r4
,
_ESR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_STD
(0
x700
,
ProgramCheckE
xception
)
EXC_XFER_STD
(0
x700
,
program_check_e
xception
)
EXCEPTION
(0
x0800
,
Trap_08
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0900
,
Trap_09
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0A00
,
Trap_0A
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0B00
,
Trap_0B
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0800
,
Trap_08
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0900
,
Trap_09
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0A00
,
Trap_0A
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0B00
,
Trap_0B
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
0
x0C00
-
System
Call
Exception
*/
START_EXCEPTION
(0
x0C00
,
SystemCall
)
NORMAL_EXCEPTION_PROLOG
EXC_XFER_EE_LITE
(0
xc00
,
DoSyscall
)
EXCEPTION
(0
x0D00
,
Trap_0D
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0E00
,
Trap_0E
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0F00
,
Trap_0F
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0D00
,
Trap_0D
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0E00
,
Trap_0E
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0F00
,
Trap_0F
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
0
x1000
-
Programmable
Interval
Timer
(
PIT
)
Exception
*/
START_EXCEPTION
(0
x1000
,
Decrementer
)
...
...
@@ -444,14 +444,14 @@ label:
/*
0
x1010
-
Fixed
Interval
Timer
(
FIT
)
Exception
*/
STND_EXCEPTION
(0
x1010
,
FITException
,
UnknownE
xception
)
STND_EXCEPTION
(0
x1010
,
FITException
,
unknown_e
xception
)
/*
0
x1020
-
Watchdog
Timer
(
WDT
)
Exception
*/
#ifdef CONFIG_BOOKE_WDT
CRITICAL_EXCEPTION
(0
x1020
,
WDTException
,
WatchdogException
)
#else
CRITICAL_EXCEPTION
(0
x1020
,
WDTException
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x1020
,
WDTException
,
unknown_e
xception
)
#endif
#endif
...
...
@@ -656,25 +656,25 @@ label:
mfspr
r10
,
SPRN_SPRG0
b
InstructionAccess
EXCEPTION
(0
x1300
,
Trap_13
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1400
,
Trap_14
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1300
,
Trap_13
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1400
,
Trap_14
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
unknown_e
xception
,
EXC_XFER_EE
)
#ifdef CONFIG_IBM405_ERR51
/
*
405
GP
errata
51
*/
START_EXCEPTION
(0
x1700
,
Trap_17
)
b
DTLBMiss
#else
EXCEPTION
(0
x1700
,
Trap_17
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif
EXCEPTION
(0
x1800
,
Trap_18
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1A00
,
Trap_1A
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1B00
,
Trap_1B
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1C00
,
Trap_1C
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1D00
,
Trap_1D
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1E00
,
Trap_1E
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1F00
,
Trap_1F
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1A00
,
Trap_1A
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1B00
,
Trap_1B
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1C00
,
Trap_1C
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1D00
,
Trap_1D
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1E00
,
Trap_1E
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1F00
,
Trap_1F
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
Check
for
a
single
step
debug
exception
while
in
an
exception
*
handler
before
state
has
been
saved
.
This
is
to
catch
the
case
...
...
arch/ppc/kernel/head_8xx.S
View file @
292dcc86
...
...
@@ -203,7 +203,7 @@ i##n: \
ret_from_except
)
/*
System
reset
*/
EXCEPTION
(0
x100
,
Reset
,
UnknownE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x100
,
Reset
,
unknown_e
xception
,
EXC_XFER_STD
)
/*
Machine
check
*/
.
=
0x200
...
...
@@ -214,7 +214,7 @@ MachineCheck:
mfspr
r5
,
SPRN_DSISR
stw
r5
,
_DSISR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_STD
(0
x200
,
MachineCheckE
xception
)
EXC_XFER_STD
(0
x200
,
machine_check_e
xception
)
/*
Data
access
exception
.
*
This
is
"never generated"
by
the
MPC8xx
.
We
jump
to
it
for
other
...
...
@@ -252,20 +252,20 @@ Alignment:
mfspr
r5
,
SPRN_DSISR
stw
r5
,
_DSISR
(
r11
)
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE
(0
x600
,
AlignmentE
xception
)
EXC_XFER_EE
(0
x600
,
alignment_e
xception
)
/*
Program
check
exception
*/
EXCEPTION
(0
x700
,
ProgramCheck
,
ProgramCheckE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x700
,
ProgramCheck
,
program_check_e
xception
,
EXC_XFER_STD
)
/*
No
FPU
on
MPC8xx
.
This
exception
is
not
supposed
to
happen
.
*/
EXCEPTION
(0
x800
,
FPUnavailable
,
UnknownE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x800
,
FPUnavailable
,
unknown_e
xception
,
EXC_XFER_STD
)
/*
Decrementer
*/
EXCEPTION
(0
x900
,
Decrementer
,
timer_interrupt
,
EXC_XFER_LITE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xa00
,
Trap_0a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xb00
,
Trap_0b
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
System
call
*/
.
=
0xc00
...
...
@@ -274,9 +274,9 @@ SystemCall:
EXC_XFER_EE_LITE
(0
xc00
,
DoSyscall
)
/*
Single
step
-
not
used
on
601
*/
EXCEPTION
(0
xd00
,
SingleStep
,
SingleStepE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xf00
,
Trap_0f
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xd00
,
SingleStep
,
single_step_e
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
xe00
,
Trap_0e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
xf00
,
Trap_0f
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
On
the
MPC8xx
,
this
is
a
software
emulation
interrupt
.
It
occurs
*
for
all
unimplemented
and
illegal
instructions
.
...
...
@@ -540,22 +540,22 @@ DataTLBError:
#endif
b
DataAccess
EXCEPTION
(0
x1500
,
Trap_15
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1500
,
Trap_15
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1600
,
Trap_16
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1700
,
Trap_17
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1800
,
Trap_18
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1900
,
Trap_19
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1a00
,
Trap_1a
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1b00
,
Trap_1b
,
unknown_e
xception
,
EXC_XFER_EE
)
/*
On
the
MPC8xx
,
these
next
four
traps
are
used
for
development
*
support
of
breakpoints
and
such
.
Someday
I
will
get
around
to
*
using
them
.
*/
EXCEPTION
(0
x1c00
,
Trap_1c
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1c00
,
Trap_1c
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1d00
,
Trap_1d
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1e00
,
Trap_1e
,
unknown_e
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x1f00
,
Trap_1f
,
unknown_e
xception
,
EXC_XFER_EE
)
.
=
0x2000
...
...
arch/ppc/kernel/head_booke.h
View file @
292dcc86
...
...
@@ -335,7 +335,7 @@
mfspr r4,SPRN_DEAR;
/* Grab the DEAR and save it */
\
stw r4,_DEAR(r11); \
addi r3,r1,STACK_FRAME_OVERHEAD; \
EXC_XFER_EE(0x0600,
AlignmentE
xception)
EXC_XFER_EE(0x0600,
alignment_e
xception)
#define PROGRAM_EXCEPTION \
START_EXCEPTION(Program) \
...
...
@@ -343,7 +343,7 @@
mfspr r4,SPRN_ESR;
/* Grab the ESR and save it */
\
stw r4,_ESR(r11); \
addi r3,r1,STACK_FRAME_OVERHEAD; \
EXC_XFER_STD(0x0700,
ProgramCheckE
xception)
EXC_XFER_STD(0x0700,
program_check_e
xception)
#define DECREMENTER_EXCEPTION \
START_EXCEPTION(Decrementer) \
...
...
arch/ppc/kernel/head_fsl_booke.S
View file @
292dcc86
...
...
@@ -426,14 +426,14 @@ skpinv: addi r6,r6,1 /* Increment */
interrupt_base
:
/
*
Critical
Input
Interrupt
*/
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x0100
,
CriticalInput
,
unknown_e
xception
)
/
*
Machine
Check
Interrupt
*/
#ifdef CONFIG_E200
/
*
no
RFMCI
,
MCSRRs
on
E200
*/
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
CRITICAL_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#else
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
MachineCheckE
xception
)
MCHECK_EXCEPTION
(0
x0200
,
MachineCheck
,
machine_check_e
xception
)
#endif
/
*
Data
Storage
Interrupt
*/
...
...
@@ -542,9 +542,9 @@ interrupt_base:
#else
#ifdef CONFIG_E200
/
*
E200
treats
'normal'
floating
point
instructions
as
FP
Unavail
exception
*/
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
ProgramCheckE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
program_check_e
xception
,
EXC_XFER_EE
)
#else
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x0800
,
FloatingPointUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif
#endif
...
...
@@ -554,20 +554,20 @@ interrupt_base:
EXC_XFER_EE_LITE
(0
x0c00
,
DoSyscall
)
/
*
Auxillary
Processor
Unavailable
Interrupt
*/
EXCEPTION
(0
x2900
,
AuxillaryProcessorUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2900
,
AuxillaryProcessorUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Decrementer
Interrupt
*/
DECREMENTER_EXCEPTION
/
*
Fixed
Internal
Timer
Interrupt
*/
/
*
TODO
:
Add
FIT
support
*/
EXCEPTION
(0
x3100
,
FixedIntervalTimer
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x3100
,
FixedIntervalTimer
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Watchdog
Timer
Interrupt
*/
#ifdef CONFIG_BOOKE_WDT
CRITICAL_EXCEPTION
(0
x3200
,
WatchdogTimer
,
WatchdogException
)
#else
CRITICAL_EXCEPTION
(0
x3200
,
WatchdogTimer
,
UnknownE
xception
)
CRITICAL_EXCEPTION
(0
x3200
,
WatchdogTimer
,
unknown_e
xception
)
#endif
/
*
Data
TLB
Error
Interrupt
*/
...
...
@@ -696,21 +696,21 @@ interrupt_base:
addi
r3
,
r1
,
STACK_FRAME_OVERHEAD
EXC_XFER_EE_LITE
(0
x2010
,
KernelSPE
)
#else
EXCEPTION
(0
x2020
,
SPEUnavailable
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2020
,
SPEUnavailable
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif /* CONFIG_SPE */
/
*
SPE
Floating
Point
Data
*/
#ifdef CONFIG_SPE
EXCEPTION
(0
x2030
,
SPEFloatingPointData
,
SPEFloatingPointException
,
EXC_XFER_EE
)
;
#else
EXCEPTION
(0
x2040
,
SPEFloatingPointData
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2040
,
SPEFloatingPointData
,
unknown_e
xception
,
EXC_XFER_EE
)
#endif /* CONFIG_SPE */
/
*
SPE
Floating
Point
Round
*/
EXCEPTION
(0
x2050
,
SPEFloatingPointRound
,
UnknownE
xception
,
EXC_XFER_EE
)
EXCEPTION
(0
x2050
,
SPEFloatingPointRound
,
unknown_e
xception
,
EXC_XFER_EE
)
/
*
Performance
Monitor
*/
EXCEPTION
(0
x2060
,
PerformanceMonitor
,
PerformanceMonitorE
xception
,
EXC_XFER_STD
)
EXCEPTION
(0
x2060
,
PerformanceMonitor
,
performance_monitor_e
xception
,
EXC_XFER_STD
)
/
*
Debug
Interrupt
*/
...
...
arch/ppc/kernel/ppc_ksyms.c
View file @
292dcc86
...
...
@@ -53,10 +53,10 @@
extern
void
transfer_to_handler
(
void
);
extern
void
do_IRQ
(
struct
pt_regs
*
regs
);
extern
void
MachineCheckE
xception
(
struct
pt_regs
*
regs
);
extern
void
AlignmentE
xception
(
struct
pt_regs
*
regs
);
extern
void
ProgramCheckE
xception
(
struct
pt_regs
*
regs
);
extern
void
SingleStepE
xception
(
struct
pt_regs
*
regs
);
extern
void
machine_check_e
xception
(
struct
pt_regs
*
regs
);
extern
void
alignment_e
xception
(
struct
pt_regs
*
regs
);
extern
void
program_check_e
xception
(
struct
pt_regs
*
regs
);
extern
void
single_step_e
xception
(
struct
pt_regs
*
regs
);
extern
int
do_signal
(
sigset_t
*
,
struct
pt_regs
*
);
extern
int
pmac_newworld
;
extern
int
sys_sigreturn
(
struct
pt_regs
*
regs
);
...
...
@@ -72,10 +72,10 @@ EXPORT_SYMBOL(clear_user_page);
EXPORT_SYMBOL
(
do_signal
);
EXPORT_SYMBOL
(
transfer_to_handler
);
EXPORT_SYMBOL
(
do_IRQ
);
EXPORT_SYMBOL
(
MachineCheckE
xception
);
EXPORT_SYMBOL
(
AlignmentE
xception
);
EXPORT_SYMBOL
(
ProgramCheckE
xception
);
EXPORT_SYMBOL
(
SingleStepE
xception
);
EXPORT_SYMBOL
(
machine_check_e
xception
);
EXPORT_SYMBOL
(
alignment_e
xception
);
EXPORT_SYMBOL
(
program_check_e
xception
);
EXPORT_SYMBOL
(
single_step_e
xception
);
EXPORT_SYMBOL
(
sys_sigreturn
);
EXPORT_SYMBOL
(
ppc_n_lost_interrupts
);
EXPORT_SYMBOL
(
ppc_lost_interrupts
);
...
...
arch/ppc/kernel/traps.c
View file @
292dcc86
...
...
@@ -74,7 +74,7 @@ void (*debugger_fault_handler)(struct pt_regs *regs);
DEFINE_SPINLOCK
(
die_lock
);
void
die
(
const
char
*
str
,
struct
pt_regs
*
fp
,
long
err
)
int
die
(
const
char
*
str
,
struct
pt_regs
*
fp
,
long
err
)
{
static
int
die_counter
;
int
nl
=
0
;
...
...
@@ -232,7 +232,7 @@ platform_machine_check(struct pt_regs *regs)
{
}
void
MachineCheckE
xception
(
struct
pt_regs
*
regs
)
void
machine_check_e
xception
(
struct
pt_regs
*
regs
)
{
unsigned
long
reason
=
get_mc_reason
(
regs
);
...
...
@@ -393,14 +393,14 @@ void SMIException(struct pt_regs *regs)
#endif
}
void
UnknownE
xception
(
struct
pt_regs
*
regs
)
void
unknown_e
xception
(
struct
pt_regs
*
regs
)
{
printk
(
"Bad trap at PC: %lx, MSR: %lx, vector=%lx %s
\n
"
,
regs
->
nip
,
regs
->
msr
,
regs
->
trap
,
print_tainted
());
_exception
(
SIGTRAP
,
regs
,
0
,
0
);
}
void
InstructionBreakpoint
(
struct
pt_regs
*
regs
)
void
instruction_breakpoint_exception
(
struct
pt_regs
*
regs
)
{
if
(
debugger_iabr_match
(
regs
))
return
;
...
...
@@ -622,7 +622,7 @@ int check_bug_trap(struct pt_regs *regs)
return
0
;
}
void
ProgramCheckE
xception
(
struct
pt_regs
*
regs
)
void
program_check_e
xception
(
struct
pt_regs
*
regs
)
{
unsigned
int
reason
=
get_reason
(
regs
);
extern
int
do_mathemu
(
struct
pt_regs
*
regs
);
...
...
@@ -701,7 +701,7 @@ void ProgramCheckException(struct pt_regs *regs)
_exception
(
SIGILL
,
regs
,
ILL_ILLOPC
,
regs
->
nip
);
}
void
SingleStepE
xception
(
struct
pt_regs
*
regs
)
void
single_step_e
xception
(
struct
pt_regs
*
regs
)
{
regs
->
msr
&=
~
(
MSR_SE
|
MSR_BE
);
/* Turn off 'trace' bits */
if
(
debugger_sstep
(
regs
))
...
...
@@ -709,7 +709,7 @@ void SingleStepException(struct pt_regs *regs)
_exception
(
SIGTRAP
,
regs
,
TRAP_TRACE
,
0
);
}
void
AlignmentE
xception
(
struct
pt_regs
*
regs
)
void
alignment_e
xception
(
struct
pt_regs
*
regs
)
{
int
fixed
;
...
...
@@ -814,7 +814,7 @@ void TAUException(struct pt_regs *regs)
}
#endif
/* CONFIG_INT_TAU */
void
AltivecUnavailE
xception
(
struct
pt_regs
*
regs
)
void
altivec_unavailable_e
xception
(
struct
pt_regs
*
regs
)
{
static
int
kernel_altivec_count
;
...
...
@@ -835,7 +835,7 @@ void AltivecUnavailException(struct pt_regs *regs)
}
#ifdef CONFIG_ALTIVEC
void
AltivecAssistE
xception
(
struct
pt_regs
*
regs
)
void
altivec_assist_e
xception
(
struct
pt_regs
*
regs
)
{
int
err
;
...
...
@@ -872,7 +872,7 @@ void AltivecAssistException(struct pt_regs *regs)
#endif
/* CONFIG_ALTIVEC */
#ifdef CONFIG_E500
void
PerformanceMonitorE
xception
(
struct
pt_regs
*
regs
)
void
performance_monitor_e
xception
(
struct
pt_regs
*
regs
)
{
perf_irq
(
regs
);
}
...
...
arch/ppc/kernel/vector.S
deleted
100644 → 0
View file @
c0c0d996
#include <asm/ppc_asm.h>
#include <asm/processor.h>
/*
*
The
routines
below
are
in
assembler
so
we
can
closely
control
the
*
usage
of
floating
-
point
registers
.
These
routines
must
be
called
*
with
preempt
disabled
.
*/
.
data
fpzero
:
.
long
0
fpone
:
.
long
0x3f800000
/*
1
.0
in
single
-
precision
FP
*/
fphalf
:
.
long
0x3f000000
/*
0
.5
in
single
-
precision
FP
*/
.
text
/*
*
Internal
routine
to
enable
floating
point
and
set
FPSCR
to
0
.
*
Don
't call it from C; it doesn'
t
use
the
normal
calling
convention
.
*/
fpenable
:
mfmsr
r10
ori
r11
,
r10
,
MSR_FP
mtmsr
r11
isync
stfd
fr0
,
24
(
r1
)
stfd
fr1
,
16
(
r1
)
stfd
fr31
,
8
(
r1
)
lis
r11
,
fpzero
@
ha
mffs
fr31
lfs
fr1
,
fpzero
@
l
(
r11
)
mtfsf
0xff
,
fr1
blr
fpdisable
:
mtfsf
0xff
,
fr31
lfd
fr31
,
8
(
r1
)
lfd
fr1
,
16
(
r1
)
lfd
fr0
,
24
(
r1
)
mtmsr
r10
isync
blr
/*
*
Vector
add
,
floating
point
.
*/
.
globl
vaddfp
vaddfp
:
stwu
r1
,-
32
(
r1
)
mflr
r0
stw
r0
,
36
(
r1
)
bl
fpenable
li
r0
,
4
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
lfsx
fr1
,
r5
,
r6
fadds
fr0
,
fr0
,
fr1
stfsx
fr0
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
bl
fpdisable
lwz
r0
,
36
(
r1
)
mtlr
r0
addi
r1
,
r1
,
32
blr
/*
*
Vector
subtract
,
floating
point
.
*/
.
globl
vsubfp
vsubfp
:
stwu
r1
,-
32
(
r1
)
mflr
r0
stw
r0
,
36
(
r1
)
bl
fpenable
li
r0
,
4
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
lfsx
fr1
,
r5
,
r6
fsubs
fr0
,
fr0
,
fr1
stfsx
fr0
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
bl
fpdisable
lwz
r0
,
36
(
r1
)
mtlr
r0
addi
r1
,
r1
,
32
blr
/*
*
Vector
multiply
and
add
,
floating
point
.
*/
.
globl
vmaddfp
vmaddfp
:
stwu
r1
,-
48
(
r1
)
mflr
r0
stw
r0
,
52
(
r1
)
bl
fpenable
stfd
fr2
,
32
(
r1
)
li
r0
,
4
mtctr
r0
li
r7
,
0
1
:
lfsx
fr0
,
r4
,
r7
lfsx
fr1
,
r5
,
r7
lfsx
fr2
,
r6
,
r7
fmadds
fr0
,
fr0
,
fr2
,
fr1
stfsx
fr0
,
r3
,
r7
addi
r7
,
r7
,
4
bdnz
1
b
lfd
fr2
,
32
(
r1
)
bl
fpdisable
lwz
r0
,
52
(
r1
)
mtlr
r0
addi
r1
,
r1
,
48
blr
/*
*
Vector
negative
multiply
and
subtract
,
floating
point
.
*/
.
globl
vnmsubfp
vnmsubfp
:
stwu
r1
,-
48
(
r1
)
mflr
r0
stw
r0
,
52
(
r1
)
bl
fpenable
stfd
fr2
,
32
(
r1
)
li
r0
,
4
mtctr
r0
li
r7
,
0
1
:
lfsx
fr0
,
r4
,
r7
lfsx
fr1
,
r5
,
r7
lfsx
fr2
,
r6
,
r7
fnmsubs
fr0
,
fr0
,
fr2
,
fr1
stfsx
fr0
,
r3
,
r7
addi
r7
,
r7
,
4
bdnz
1
b
lfd
fr2
,
32
(
r1
)
bl
fpdisable
lwz
r0
,
52
(
r1
)
mtlr
r0
addi
r1
,
r1
,
48
blr
/*
*
Vector
reciprocal
estimate
.
We
just
compute
1
.0
/
x
.
*
r3
->
destination
,
r4
->
source
.
*/
.
globl
vrefp
vrefp
:
stwu
r1
,-
32
(
r1
)
mflr
r0
stw
r0
,
36
(
r1
)
bl
fpenable
lis
r9
,
fpone
@
ha
li
r0
,
4
lfs
fr1
,
fpone
@
l
(
r9
)
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
fdivs
fr0
,
fr1
,
fr0
stfsx
fr0
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
bl
fpdisable
lwz
r0
,
36
(
r1
)
mtlr
r0
addi
r1
,
r1
,
32
blr
/*
*
Vector
reciprocal
square
-
root
estimate
,
floating
point
.
*
We
use
the
frsqrte
instruction
for
the
initial
estimate
followed
*
by
2
iterations
of
Newton
-
Raphson
to
get
sufficient
accuracy
.
*
r3
->
destination
,
r4
->
source
.
*/
.
globl
vrsqrtefp
vrsqrtefp
:
stwu
r1
,-
48
(
r1
)
mflr
r0
stw
r0
,
52
(
r1
)
bl
fpenable
stfd
fr2
,
32
(
r1
)
stfd
fr3
,
40
(
r1
)
stfd
fr4
,
48
(
r1
)
stfd
fr5
,
56
(
r1
)
lis
r9
,
fpone
@
ha
lis
r8
,
fphalf
@
ha
li
r0
,
4
lfs
fr4
,
fpone
@
l
(
r9
)
lfs
fr5
,
fphalf
@
l
(
r8
)
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
frsqrte
fr1
,
fr0
/*
r
=
frsqrte
(
s
)
*/
fmuls
fr3
,
fr1
,
fr0
/*
r
*
s
*/
fmuls
fr2
,
fr1
,
fr5
/*
r
*
0
.5
*/
fnmsubs
fr3
,
fr1
,
fr3
,
fr4
/*
1
-
s
*
r
*
r
*/
fmadds
fr1
,
fr2
,
fr3
,
fr1
/*
r
=
r
+
0
.5
*
r
*
(
1
-
s
*
r
*
r
)
*/
fmuls
fr3
,
fr1
,
fr0
/*
r
*
s
*/
fmuls
fr2
,
fr1
,
fr5
/*
r
*
0
.5
*/
fnmsubs
fr3
,
fr1
,
fr3
,
fr4
/*
1
-
s
*
r
*
r
*/
fmadds
fr1
,
fr2
,
fr3
,
fr1
/*
r
=
r
+
0
.5
*
r
*
(
1
-
s
*
r
*
r
)
*/
stfsx
fr1
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
lfd
fr5
,
56
(
r1
)
lfd
fr4
,
48
(
r1
)
lfd
fr3
,
40
(
r1
)
lfd
fr2
,
32
(
r1
)
bl
fpdisable
lwz
r0
,
36
(
r1
)
mtlr
r0
addi
r1
,
r1
,
32
blr
arch/ppc/syslib/ibm44x_common.c
View file @
292dcc86
...
...
@@ -178,7 +178,7 @@ void __init ibm44x_platform_init(void)
#endif
}
/* Called from
MachineCheckE
xception */
/* Called from
machine_check_e
xception */
void
platform_machine_check
(
struct
pt_regs
*
regs
)
{
printk
(
"PLB0: BEAR=0x%08x%08x ACR= 0x%08x BESR= 0x%08x
\n
"
,
...
...
arch/ppc/syslib/ppc4xx_setup.c
View file @
292dcc86
...
...
@@ -279,7 +279,7 @@ ppc4xx_init(unsigned long r3, unsigned long r4, unsigned long r5,
#endif
/* defined(CONFIG_PCI) && defined(CONFIG_IDE) */
}
/* Called from
MachineCheckE
xception */
/* Called from
machine_check_e
xception */
void
platform_machine_check
(
struct
pt_regs
*
regs
)
{
#if defined(DCRN_PLB0_BEAR)
...
...
arch/ppc64/Makefile
View file @
292dcc86
...
...
@@ -82,7 +82,7 @@ CFLAGS += $(call cc-option,-funit-at-a-time)
head-y
:=
arch
/ppc64/kernel/head.o
libs-y
+=
arch
/ppc64/lib/
core-y
+=
arch
/ppc64/kernel/
core-y
+=
arch
/ppc64/kernel/
arch
/powerpc/kernel/
core-y
+=
arch
/ppc64/mm/
core-y
+=
arch
/powerpc/platforms/
core-$(CONFIG_XMON)
+=
arch
/ppc64/xmon/
...
...
arch/ppc64/kernel/Makefile
View file @
292dcc86
...
...
@@ -3,14 +3,16 @@
#
EXTRA_CFLAGS
+=
-mno-minimal-toc
ifneq
($(CONFIG_PPC_MERGE),y)
extra-y
:=
head.o vmlinux.lds
endif
obj-y
:=
setup.o entry.o
traps.o
irq.o idle.o dma.o
\
obj-y
:=
setup.o entry.o irq.o idle.o dma.o
\
time.o process.o signal.o syscalls.o misc.o ptrace.o
\
align.o semaphore.o bitops.o pacaData.o
\
udbg.o binfmt_elf32.o sys_ppc32.o ioctl32.o
\
ptrace32.o signal32.o rtc.o init_task.o
\
lmb.o cputable.o cpu_setup_power4.o
idle_power4.o
\
lmb.o cputable.o cpu_setup_power4.o
\
iommu.o sysfs.o vdso.o pmc.o firmware.o prom.o
obj-y
+=
vdso32/ vdso64/
...
...
@@ -64,15 +66,13 @@ obj-$(CONFIG_PPC_BPA) += pSeries_smp.o
obj-$(CONFIG_PPC_MAPLE)
+=
smp-tbsync.o
endif
obj-$(CONFIG_ALTIVEC)
+=
vecemu.o vector.o
obj-$(CONFIG_KPROBES)
+=
kprobes.o
CFLAGS_ioctl32.o
+=
-Ifs
/
ifneq
($(CONFIG_PPC_MERGE),y)
ifeq
($(CONFIG_PPC_ISERIES),y)
arch/ppc64/kernel/head.o
:
arch/ppc64/kernel/lparmap.s
AFLAGS_head.o
+=
-Iarch
/ppc64/kernel
arch/ppc64/kernel/head.o
:
arch/powerpc/platforms/iseries/lparmap.s
AFLAGS_head.o
+=
-Iarch
/powerpc/platforms/iseries
endif
endif
# These are here while we do the architecture merge
vecemu-y
+=
../../powerpc/kernel/vecemu.o
arch/ppc64/kernel/traps.c
deleted
100644 → 0
View file @
c0c0d996
/*
* linux/arch/ppc64/kernel/traps.c
*
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Modified by Cort Dougan (cort@cs.nmt.edu)
* and Paul Mackerras (paulus@cs.anu.edu.au)
*/
/*
* This file handles the architecture-dependent parts of hardware exceptions
*/
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/stddef.h>
#include <linux/unistd.h>
#include <linux/slab.h>
#include <linux/user.h>
#include <linux/a.out.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/kprobes.h>
#include <asm/kdebug.h>
#include <asm/pgtable.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/processor.h>
#include <asm/ppcdebug.h>
#include <asm/rtas.h>
#include <asm/systemcfg.h>
#include <asm/machdep.h>
#include <asm/pmc.h>
#ifdef CONFIG_DEBUGGER
int
(
*
__debugger
)(
struct
pt_regs
*
regs
);
int
(
*
__debugger_ipi
)(
struct
pt_regs
*
regs
);
int
(
*
__debugger_bpt
)(
struct
pt_regs
*
regs
);
int
(
*
__debugger_sstep
)(
struct
pt_regs
*
regs
);
int
(
*
__debugger_iabr_match
)(
struct
pt_regs
*
regs
);
int
(
*
__debugger_dabr_match
)(
struct
pt_regs
*
regs
);
int
(
*
__debugger_fault_handler
)(
struct
pt_regs
*
regs
);
EXPORT_SYMBOL
(
__debugger
);
EXPORT_SYMBOL
(
__debugger_ipi
);
EXPORT_SYMBOL
(
__debugger_bpt
);
EXPORT_SYMBOL
(
__debugger_sstep
);
EXPORT_SYMBOL
(
__debugger_iabr_match
);
EXPORT_SYMBOL
(
__debugger_dabr_match
);
EXPORT_SYMBOL
(
__debugger_fault_handler
);
#endif
struct
notifier_block
*
powerpc_die_chain
;
static
DEFINE_SPINLOCK
(
die_notifier_lock
);
int
register_die_notifier
(
struct
notifier_block
*
nb
)
{
int
err
=
0
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
die_notifier_lock
,
flags
);
err
=
notifier_chain_register
(
&
powerpc_die_chain
,
nb
);
spin_unlock_irqrestore
(
&
die_notifier_lock
,
flags
);
return
err
;
}
/*
* Trap & Exception support
*/
static
DEFINE_SPINLOCK
(
die_lock
);
int
die
(
const
char
*
str
,
struct
pt_regs
*
regs
,
long
err
)
{
static
int
die_counter
;
int
nl
=
0
;
if
(
debugger
(
regs
))
return
1
;
console_verbose
();
spin_lock_irq
(
&
die_lock
);
bust_spinlocks
(
1
);
printk
(
"Oops: %s, sig: %ld [#%d]
\n
"
,
str
,
err
,
++
die_counter
);
#ifdef CONFIG_PREEMPT
printk
(
"PREEMPT "
);
nl
=
1
;
#endif
#ifdef CONFIG_SMP
printk
(
"SMP NR_CPUS=%d "
,
NR_CPUS
);
nl
=
1
;
#endif
#ifdef CONFIG_DEBUG_PAGEALLOC
printk
(
"DEBUG_PAGEALLOC "
);
nl
=
1
;
#endif
#ifdef CONFIG_NUMA
printk
(
"NUMA "
);
nl
=
1
;
#endif
switch
(
systemcfg
->
platform
)
{
case
PLATFORM_PSERIES
:
printk
(
"PSERIES "
);
nl
=
1
;
break
;
case
PLATFORM_PSERIES_LPAR
:
printk
(
"PSERIES LPAR "
);
nl
=
1
;
break
;
case
PLATFORM_ISERIES_LPAR
:
printk
(
"ISERIES LPAR "
);
nl
=
1
;
break
;
case
PLATFORM_POWERMAC
:
printk
(
"POWERMAC "
);
nl
=
1
;
break
;
case
PLATFORM_BPA
:
printk
(
"BPA "
);
nl
=
1
;
break
;
}
if
(
nl
)
printk
(
"
\n
"
);
print_modules
();
show_regs
(
regs
);
bust_spinlocks
(
0
);
spin_unlock_irq
(
&
die_lock
);
if
(
in_interrupt
())
panic
(
"Fatal exception in interrupt"
);
if
(
panic_on_oops
)
{
printk
(
KERN_EMERG
"Fatal exception: panic in 5 seconds
\n
"
);
ssleep
(
5
);
panic
(
"Fatal exception"
);
}
do_exit
(
SIGSEGV
);
return
0
;
}
void
_exception
(
int
signr
,
struct
pt_regs
*
regs
,
int
code
,
unsigned
long
addr
)
{
siginfo_t
info
;
if
(
!
user_mode
(
regs
))
{
if
(
die
(
"Exception in kernel mode"
,
regs
,
signr
))
return
;
}
memset
(
&
info
,
0
,
sizeof
(
info
));
info
.
si_signo
=
signr
;
info
.
si_code
=
code
;
info
.
si_addr
=
(
void
__user
*
)
addr
;
force_sig_info
(
signr
,
&
info
,
current
);
}
void
system_reset_exception
(
struct
pt_regs
*
regs
)
{
/* See if any machine dependent calls */
if
(
ppc_md
.
system_reset_exception
)
ppc_md
.
system_reset_exception
(
regs
);
die
(
"System Reset"
,
regs
,
0
);
/* Must die if the interrupt is not recoverable */
if
(
!
(
regs
->
msr
&
MSR_RI
))
panic
(
"Unrecoverable System Reset"
);
/* What should we do here? We could issue a shutdown or hard reset. */
}
void
machine_check_exception
(
struct
pt_regs
*
regs
)
{
int
recover
=
0
;
/* See if any machine dependent calls */
if
(
ppc_md
.
machine_check_exception
)
recover
=
ppc_md
.
machine_check_exception
(
regs
);
if
(
recover
)
return
;
if
(
debugger_fault_handler
(
regs
))
return
;
die
(
"Machine check"
,
regs
,
0
);
/* Must die if the interrupt is not recoverable */
if
(
!
(
regs
->
msr
&
MSR_RI
))
panic
(
"Unrecoverable Machine check"
);
}
void
unknown_exception
(
struct
pt_regs
*
regs
)
{
printk
(
"Bad trap at PC: %lx, SR: %lx, vector=%lx
\n
"
,
regs
->
nip
,
regs
->
msr
,
regs
->
trap
);
_exception
(
SIGTRAP
,
regs
,
0
,
0
);
}
void
instruction_breakpoint_exception
(
struct
pt_regs
*
regs
)
{
if
(
notify_die
(
DIE_IABR_MATCH
,
"iabr_match"
,
regs
,
5
,
5
,
SIGTRAP
)
==
NOTIFY_STOP
)
return
;
if
(
debugger_iabr_match
(
regs
))
return
;
_exception
(
SIGTRAP
,
regs
,
TRAP_BRKPT
,
regs
->
nip
);
}
void
__kprobes
single_step_exception
(
struct
pt_regs
*
regs
)
{
regs
->
msr
&=
~
MSR_SE
;
/* Turn off 'trace' bit */
if
(
notify_die
(
DIE_SSTEP
,
"single_step"
,
regs
,
5
,
5
,
SIGTRAP
)
==
NOTIFY_STOP
)
return
;
if
(
debugger_sstep
(
regs
))
return
;
_exception
(
SIGTRAP
,
regs
,
TRAP_TRACE
,
regs
->
nip
);
}
/*
* After we have successfully emulated an instruction, we have to
* check if the instruction was being single-stepped, and if so,
* pretend we got a single-step exception. This was pointed out
* by Kumar Gala. -- paulus
*/
static
inline
void
emulate_single_step
(
struct
pt_regs
*
regs
)
{
if
(
regs
->
msr
&
MSR_SE
)
single_step_exception
(
regs
);
}
static
void
parse_fpe
(
struct
pt_regs
*
regs
)
{
int
code
=
0
;
unsigned
long
fpscr
;
flush_fp_to_thread
(
current
);
fpscr
=
current
->
thread
.
fpscr
;
/* Invalid operation */
if
((
fpscr
&
FPSCR_VE
)
&&
(
fpscr
&
FPSCR_VX
))
code
=
FPE_FLTINV
;
/* Overflow */
else
if
((
fpscr
&
FPSCR_OE
)
&&
(
fpscr
&
FPSCR_OX
))
code
=
FPE_FLTOVF
;
/* Underflow */
else
if
((
fpscr
&
FPSCR_UE
)
&&
(
fpscr
&
FPSCR_UX
))
code
=
FPE_FLTUND
;
/* Divide by zero */
else
if
((
fpscr
&
FPSCR_ZE
)
&&
(
fpscr
&
FPSCR_ZX
))
code
=
FPE_FLTDIV
;
/* Inexact result */
else
if
((
fpscr
&
FPSCR_XE
)
&&
(
fpscr
&
FPSCR_XX
))
code
=
FPE_FLTRES
;
_exception
(
SIGFPE
,
regs
,
code
,
regs
->
nip
);
}
/*
* Illegal instruction emulation support. Return non-zero if we can't
* emulate, or -EFAULT if the associated memory access caused an access
* fault. Return zero on success.
*/
#define INST_MFSPR_PVR 0x7c1f42a6
#define INST_MFSPR_PVR_MASK 0xfc1fffff
#define INST_DCBA 0x7c0005ec
#define INST_DCBA_MASK 0x7c0007fe
#define INST_MCRXR 0x7c000400
#define INST_MCRXR_MASK 0x7c0007fe
static
int
emulate_instruction
(
struct
pt_regs
*
regs
)
{
unsigned
int
instword
;
if
(
!
user_mode
(
regs
))
return
-
EINVAL
;
CHECK_FULL_REGS
(
regs
);
if
(
get_user
(
instword
,
(
unsigned
int
__user
*
)(
regs
->
nip
)))
return
-
EFAULT
;
/* Emulate the mfspr rD, PVR. */
if
((
instword
&
INST_MFSPR_PVR_MASK
)
==
INST_MFSPR_PVR
)
{
unsigned
int
rd
;
rd
=
(
instword
>>
21
)
&
0x1f
;
regs
->
gpr
[
rd
]
=
mfspr
(
SPRN_PVR
);
return
0
;
}
/* Emulating the dcba insn is just a no-op. */
if
((
instword
&
INST_DCBA_MASK
)
==
INST_DCBA
)
{
static
int
warned
;
if
(
!
warned
)
{
printk
(
KERN_WARNING
"process %d (%s) uses obsolete 'dcba' insn
\n
"
,
current
->
pid
,
current
->
comm
);
warned
=
1
;
}
return
0
;
}
/* Emulate the mcrxr insn. */
if
((
instword
&
INST_MCRXR_MASK
)
==
INST_MCRXR
)
{
static
int
warned
;
unsigned
int
shift
;
if
(
!
warned
)
{
printk
(
KERN_WARNING
"process %d (%s) uses obsolete 'mcrxr' insn
\n
"
,
current
->
pid
,
current
->
comm
);
warned
=
1
;
}
shift
=
(
instword
>>
21
)
&
0x1c
;
regs
->
ccr
&=
~
(
0xf0000000
>>
shift
);
regs
->
ccr
|=
(
regs
->
xer
&
0xf0000000
)
>>
shift
;
regs
->
xer
&=
~
0xf0000000
;
return
0
;
}
return
-
EINVAL
;
}
/*
* Look through the list of trap instructions that are used for BUG(),
* BUG_ON() and WARN_ON() and see if we hit one. At this point we know
* that the exception was caused by a trap instruction of some kind.
* Returns 1 if we should continue (i.e. it was a WARN_ON) or 0
* otherwise.
*/
extern
struct
bug_entry
__start___bug_table
[],
__stop___bug_table
[];
#ifndef CONFIG_MODULES
#define module_find_bug(x) NULL
#endif
struct
bug_entry
*
find_bug
(
unsigned
long
bugaddr
)
{
struct
bug_entry
*
bug
;
for
(
bug
=
__start___bug_table
;
bug
<
__stop___bug_table
;
++
bug
)
if
(
bugaddr
==
bug
->
bug_addr
)
return
bug
;
return
module_find_bug
(
bugaddr
);
}
static
int
check_bug_trap
(
struct
pt_regs
*
regs
)
{
struct
bug_entry
*
bug
;
unsigned
long
addr
;
if
(
regs
->
msr
&
MSR_PR
)
return
0
;
/* not in kernel */
addr
=
regs
->
nip
;
/* address of trap instruction */
if
(
addr
<
PAGE_OFFSET
)
return
0
;
bug
=
find_bug
(
regs
->
nip
);
if
(
bug
==
NULL
)
return
0
;
if
(
bug
->
line
&
BUG_WARNING_TRAP
)
{
/* this is a WARN_ON rather than BUG/BUG_ON */
printk
(
KERN_ERR
"Badness in %s at %s:%d
\n
"
,
bug
->
function
,
bug
->
file
,
bug
->
line
&
~
BUG_WARNING_TRAP
);
show_stack
(
current
,
(
void
*
)
regs
->
gpr
[
1
]);
return
1
;
}
printk
(
KERN_CRIT
"kernel BUG in %s at %s:%d!
\n
"
,
bug
->
function
,
bug
->
file
,
bug
->
line
);
return
0
;
}
void
__kprobes
program_check_exception
(
struct
pt_regs
*
regs
)
{
if
(
debugger_fault_handler
(
regs
))
return
;
if
(
regs
->
msr
&
0x100000
)
{
/* IEEE FP exception */
parse_fpe
(
regs
);
}
else
if
(
regs
->
msr
&
0x20000
)
{
/* trap exception */
if
(
notify_die
(
DIE_BPT
,
"breakpoint"
,
regs
,
5
,
5
,
SIGTRAP
)
==
NOTIFY_STOP
)
return
;
if
(
debugger_bpt
(
regs
))
return
;
if
(
check_bug_trap
(
regs
))
{
regs
->
nip
+=
4
;
return
;
}
_exception
(
SIGTRAP
,
regs
,
TRAP_BRKPT
,
regs
->
nip
);
}
else
{
/* Privileged or illegal instruction; try to emulate it. */
switch
(
emulate_instruction
(
regs
))
{
case
0
:
regs
->
nip
+=
4
;
emulate_single_step
(
regs
);
break
;
case
-
EFAULT
:
_exception
(
SIGSEGV
,
regs
,
SEGV_MAPERR
,
regs
->
nip
);
break
;
default:
if
(
regs
->
msr
&
0x40000
)
/* priveleged */
_exception
(
SIGILL
,
regs
,
ILL_PRVOPC
,
regs
->
nip
);
else
/* illegal */
_exception
(
SIGILL
,
regs
,
ILL_ILLOPC
,
regs
->
nip
);
break
;
}
}
}
void
kernel_fp_unavailable_exception
(
struct
pt_regs
*
regs
)
{
printk
(
KERN_EMERG
"Unrecoverable FP Unavailable Exception "
"%lx at %lx
\n
"
,
regs
->
trap
,
regs
->
nip
);
die
(
"Unrecoverable FP Unavailable Exception"
,
regs
,
SIGABRT
);
}
void
altivec_unavailable_exception
(
struct
pt_regs
*
regs
)
{
if
(
user_mode
(
regs
))
{
/* A user program has executed an altivec instruction,
but this kernel doesn't support altivec. */
_exception
(
SIGILL
,
regs
,
ILL_ILLOPC
,
regs
->
nip
);
return
;
}
printk
(
KERN_EMERG
"Unrecoverable VMX/Altivec Unavailable Exception "
"%lx at %lx
\n
"
,
regs
->
trap
,
regs
->
nip
);
die
(
"Unrecoverable VMX/Altivec Unavailable Exception"
,
regs
,
SIGABRT
);
}
extern
perf_irq_t
perf_irq
;
void
performance_monitor_exception
(
struct
pt_regs
*
regs
)
{
perf_irq
(
regs
);
}
void
alignment_exception
(
struct
pt_regs
*
regs
)
{
int
fixed
;
fixed
=
fix_alignment
(
regs
);
if
(
fixed
==
1
)
{
regs
->
nip
+=
4
;
/* skip over emulated instruction */
emulate_single_step
(
regs
);
return
;
}
/* Operand address was bad */
if
(
fixed
==
-
EFAULT
)
{
if
(
user_mode
(
regs
))
{
_exception
(
SIGSEGV
,
regs
,
SEGV_MAPERR
,
regs
->
dar
);
}
else
{
/* Search exception table */
bad_page_fault
(
regs
,
regs
->
dar
,
SIGSEGV
);
}
return
;
}
_exception
(
SIGBUS
,
regs
,
BUS_ADRALN
,
regs
->
nip
);
}
#ifdef CONFIG_ALTIVEC
void
altivec_assist_exception
(
struct
pt_regs
*
regs
)
{
int
err
;
siginfo_t
info
;
if
(
!
user_mode
(
regs
))
{
printk
(
KERN_EMERG
"VMX/Altivec assist exception in kernel mode"
" at %lx
\n
"
,
regs
->
nip
);
die
(
"Kernel VMX/Altivec assist exception"
,
regs
,
SIGILL
);
}
flush_altivec_to_thread
(
current
);
err
=
emulate_altivec
(
regs
);
if
(
err
==
0
)
{
regs
->
nip
+=
4
;
/* skip emulated instruction */
emulate_single_step
(
regs
);
return
;
}
if
(
err
==
-
EFAULT
)
{
/* got an error reading the instruction */
info
.
si_signo
=
SIGSEGV
;
info
.
si_errno
=
0
;
info
.
si_code
=
SEGV_MAPERR
;
info
.
si_addr
=
(
void
__user
*
)
regs
->
nip
;
force_sig_info
(
SIGSEGV
,
&
info
,
current
);
}
else
{
/* didn't recognize the instruction */
/* XXX quick hack for now: set the non-Java bit in the VSCR */
if
(
printk_ratelimit
())
printk
(
KERN_ERR
"Unrecognized altivec instruction "
"in %s at %lx
\n
"
,
current
->
comm
,
regs
->
nip
);
current
->
thread
.
vscr
.
u
[
3
]
|=
0x10000
;
}
}
#endif
/* CONFIG_ALTIVEC */
/*
* We enter here if we get an unrecoverable exception, that is, one
* that happened at a point where the RI (recoverable interrupt) bit
* in the MSR is 0. This indicates that SRR0/1 are live, and that
* we therefore lost state by taking this exception.
*/
void
unrecoverable_exception
(
struct
pt_regs
*
regs
)
{
printk
(
KERN_EMERG
"Unrecoverable exception %lx at %lx
\n
"
,
regs
->
trap
,
regs
->
nip
);
die
(
"Unrecoverable exception"
,
regs
,
SIGABRT
);
}
/*
* We enter here if we discover during exception entry that we are
* running in supervisor mode with a userspace value in the stack pointer.
*/
void
kernel_bad_stack
(
struct
pt_regs
*
regs
)
{
printk
(
KERN_EMERG
"Bad kernel stack pointer %lx at %lx
\n
"
,
regs
->
gpr
[
1
],
regs
->
nip
);
die
(
"Bad kernel stack pointer"
,
regs
,
SIGABRT
);
}
void
__init
trap_init
(
void
)
{
}
arch/ppc64/kernel/vector.S
deleted
100644 → 0
View file @
c0c0d996
#include <asm/ppc_asm.h>
#include <asm/processor.h>
/*
*
The
routines
below
are
in
assembler
so
we
can
closely
control
the
*
usage
of
floating
-
point
registers
.
These
routines
must
be
called
*
with
preempt
disabled
.
*/
.
section
".toc"
,
"aw"
fpzero
:
.
tc
FD_0_0
[
TC
],
0
fpone
:
.
tc
FD_3ff00000_0
[
TC
],
0x3ff0000000000000
/*
1
.0
*/
fphalf
:
.
tc
FD_3fe00000_0
[
TC
],
0x3fe0000000000000
/*
0
.5
*/
.
text
/*
*
Internal
routine
to
enable
floating
point
and
set
FPSCR
to
0
.
*
Don
't call it from C; it doesn'
t
use
the
normal
calling
convention
.
*/
fpenable
:
mfmsr
r10
ori
r11
,
r10
,
MSR_FP
mtmsr
r11
isync
stfd
fr31
,-
8
(
r1
)
stfd
fr0
,-
16
(
r1
)
stfd
fr1
,-
24
(
r1
)
mffs
fr31
lfd
fr1
,
fpzero
@
toc
(
r2
)
mtfsf
0xff
,
fr1
blr
fpdisable
:
mtlr
r12
mtfsf
0xff
,
fr31
lfd
fr1
,-
24
(
r1
)
lfd
fr0
,-
16
(
r1
)
lfd
fr31
,-
8
(
r1
)
mtmsr
r10
isync
blr
/*
*
Vector
add
,
floating
point
.
*/
_GLOBAL
(
vaddfp
)
mflr
r12
bl
fpenable
li
r0
,
4
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
lfsx
fr1
,
r5
,
r6
fadds
fr0
,
fr0
,
fr1
stfsx
fr0
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
b
fpdisable
/*
*
Vector
subtract
,
floating
point
.
*/
_GLOBAL
(
vsubfp
)
mflr
r12
bl
fpenable
li
r0
,
4
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
lfsx
fr1
,
r5
,
r6
fsubs
fr0
,
fr0
,
fr1
stfsx
fr0
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
b
fpdisable
/*
*
Vector
multiply
and
add
,
floating
point
.
*/
_GLOBAL
(
vmaddfp
)
mflr
r12
bl
fpenable
stfd
fr2
,-
32
(
r1
)
li
r0
,
4
mtctr
r0
li
r7
,
0
1
:
lfsx
fr0
,
r4
,
r7
lfsx
fr1
,
r5
,
r7
lfsx
fr2
,
r6
,
r7
fmadds
fr0
,
fr0
,
fr2
,
fr1
stfsx
fr0
,
r3
,
r7
addi
r7
,
r7
,
4
bdnz
1
b
lfd
fr2
,-
32
(
r1
)
b
fpdisable
/*
*
Vector
negative
multiply
and
subtract
,
floating
point
.
*/
_GLOBAL
(
vnmsubfp
)
mflr
r12
bl
fpenable
stfd
fr2
,-
32
(
r1
)
li
r0
,
4
mtctr
r0
li
r7
,
0
1
:
lfsx
fr0
,
r4
,
r7
lfsx
fr1
,
r5
,
r7
lfsx
fr2
,
r6
,
r7
fnmsubs
fr0
,
fr0
,
fr2
,
fr1
stfsx
fr0
,
r3
,
r7
addi
r7
,
r7
,
4
bdnz
1
b
lfd
fr2
,-
32
(
r1
)
b
fpdisable
/*
*
Vector
reciprocal
estimate
.
We
just
compute
1
.0
/
x
.
*
r3
->
destination
,
r4
->
source
.
*/
_GLOBAL
(
vrefp
)
mflr
r12
bl
fpenable
li
r0
,
4
lfd
fr1
,
fpone
@
toc
(
r2
)
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
fdivs
fr0
,
fr1
,
fr0
stfsx
fr0
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
b
fpdisable
/*
*
Vector
reciprocal
square
-
root
estimate
,
floating
point
.
*
We
use
the
frsqrte
instruction
for
the
initial
estimate
followed
*
by
2
iterations
of
Newton
-
Raphson
to
get
sufficient
accuracy
.
*
r3
->
destination
,
r4
->
source
.
*/
_GLOBAL
(
vrsqrtefp
)
mflr
r12
bl
fpenable
stfd
fr2
,-
32
(
r1
)
stfd
fr3
,-
40
(
r1
)
stfd
fr4
,-
48
(
r1
)
stfd
fr5
,-
56
(
r1
)
li
r0
,
4
lfd
fr4
,
fpone
@
toc
(
r2
)
lfd
fr5
,
fphalf
@
toc
(
r2
)
mtctr
r0
li
r6
,
0
1
:
lfsx
fr0
,
r4
,
r6
frsqrte
fr1
,
fr0
/*
r
=
frsqrte
(
s
)
*/
fmuls
fr3
,
fr1
,
fr0
/*
r
*
s
*/
fmuls
fr2
,
fr1
,
fr5
/*
r
*
0
.5
*/
fnmsubs
fr3
,
fr1
,
fr3
,
fr4
/*
1
-
s
*
r
*
r
*/
fmadds
fr1
,
fr2
,
fr3
,
fr1
/*
r
=
r
+
0
.5
*
r
*
(
1
-
s
*
r
*
r
)
*/
fmuls
fr3
,
fr1
,
fr0
/*
r
*
s
*/
fmuls
fr2
,
fr1
,
fr5
/*
r
*
0
.5
*/
fnmsubs
fr3
,
fr1
,
fr3
,
fr4
/*
1
-
s
*
r
*
r
*/
fmadds
fr1
,
fr2
,
fr3
,
fr1
/*
r
=
r
+
0
.5
*
r
*
(
1
-
s
*
r
*
r
)
*/
stfsx
fr1
,
r3
,
r6
addi
r6
,
r6
,
4
bdnz
1
b
lfd
fr5
,-
56
(
r1
)
lfd
fr4
,-
48
(
r1
)
lfd
fr3
,-
40
(
r1
)
lfd
fr2
,-
32
(
r1
)
b
fpdisable
include/asm-powerpc/system.h
View file @
292dcc86
...
...
@@ -118,10 +118,10 @@ extern void _set_L3CR(unsigned long);
#endif
extern
void
via_cuda_init
(
void
);
extern
void
pmac_nvram_init
(
void
);
extern
void
read_rtc_time
(
void
);
extern
void
pmac_find_display
(
void
);
extern
void
giveup_fpu
(
struct
task_struct
*
);
extern
void
disable_kernel_fp
(
void
);
extern
void
enable_kernel_fp
(
void
);
extern
void
flush_fp_to_thread
(
struct
task_struct
*
);
extern
void
enable_kernel_altivec
(
void
);
...
...
@@ -346,5 +346,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new,
#define arch_align_stack(x) (x)
extern
unsigned
long
reloc_offset
(
void
);
#endif
/* __KERNEL__ */
#endif
/* _ASM_POWERPC_SYSTEM_H */
include/asm-ppc/system.h
View file @
292dcc86
...
...
@@ -87,7 +87,7 @@ extern void cacheable_memzero(void *p, unsigned int nb);
extern
void
*
cacheable_memcpy
(
void
*
,
const
void
*
,
unsigned
int
);
extern
int
do_page_fault
(
struct
pt_regs
*
,
unsigned
long
,
unsigned
long
);
extern
void
bad_page_fault
(
struct
pt_regs
*
,
unsigned
long
,
int
);
extern
void
die
(
const
char
*
,
struct
pt_regs
*
,
long
);
extern
int
die
(
const
char
*
,
struct
pt_regs
*
,
long
);
extern
void
_exception
(
int
,
struct
pt_regs
*
,
int
,
unsigned
long
);
#ifdef CONFIG_BOOKE_WDT
extern
u32
booke_wdt_enabled
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment