-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
sparc64: Split entry.S up into seperate files.
entry.S was a hodge-podge of several totally unrelated sets of assembler routines, ranging from FPU trap handlers to hypervisor call functions. Split it up into topic-sized pieces. Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
David S. Miller
committed
Apr 28, 2008
1 parent
194f1a6
commit 6eda3a7
Showing
12 changed files
with
2,641 additions
and
2,576 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,384 @@ | ||
/* This is trivial with the new code... */ | ||
.globl do_fpdis | ||
.type do_fpdis,#function | ||
do_fpdis: | ||
sethi %hi(TSTATE_PEF), %g4 | ||
rdpr %tstate, %g5 | ||
andcc %g5, %g4, %g0 | ||
be,pt %xcc, 1f | ||
nop | ||
rd %fprs, %g5 | ||
andcc %g5, FPRS_FEF, %g0 | ||
be,pt %xcc, 1f | ||
nop | ||
|
||
/* Legal state when DCR_IFPOE is set in Cheetah %dcr. */ | ||
sethi %hi(109f), %g7 | ||
ba,pt %xcc, etrap | ||
109: or %g7, %lo(109b), %g7 | ||
add %g0, %g0, %g0 | ||
ba,a,pt %xcc, rtrap | ||
|
||
1: TRAP_LOAD_THREAD_REG(%g6, %g1) | ||
ldub [%g6 + TI_FPSAVED], %g5 | ||
wr %g0, FPRS_FEF, %fprs | ||
andcc %g5, FPRS_FEF, %g0 | ||
be,a,pt %icc, 1f | ||
clr %g7 | ||
ldx [%g6 + TI_GSR], %g7 | ||
1: andcc %g5, FPRS_DL, %g0 | ||
bne,pn %icc, 2f | ||
fzero %f0 | ||
andcc %g5, FPRS_DU, %g0 | ||
bne,pn %icc, 1f | ||
fzero %f2 | ||
faddd %f0, %f2, %f4 | ||
fmuld %f0, %f2, %f6 | ||
faddd %f0, %f2, %f8 | ||
fmuld %f0, %f2, %f10 | ||
faddd %f0, %f2, %f12 | ||
fmuld %f0, %f2, %f14 | ||
faddd %f0, %f2, %f16 | ||
fmuld %f0, %f2, %f18 | ||
faddd %f0, %f2, %f20 | ||
fmuld %f0, %f2, %f22 | ||
faddd %f0, %f2, %f24 | ||
fmuld %f0, %f2, %f26 | ||
faddd %f0, %f2, %f28 | ||
fmuld %f0, %f2, %f30 | ||
faddd %f0, %f2, %f32 | ||
fmuld %f0, %f2, %f34 | ||
faddd %f0, %f2, %f36 | ||
fmuld %f0, %f2, %f38 | ||
faddd %f0, %f2, %f40 | ||
fmuld %f0, %f2, %f42 | ||
faddd %f0, %f2, %f44 | ||
fmuld %f0, %f2, %f46 | ||
faddd %f0, %f2, %f48 | ||
fmuld %f0, %f2, %f50 | ||
faddd %f0, %f2, %f52 | ||
fmuld %f0, %f2, %f54 | ||
faddd %f0, %f2, %f56 | ||
fmuld %f0, %f2, %f58 | ||
b,pt %xcc, fpdis_exit2 | ||
faddd %f0, %f2, %f60 | ||
1: mov SECONDARY_CONTEXT, %g3 | ||
add %g6, TI_FPREGS + 0x80, %g1 | ||
faddd %f0, %f2, %f4 | ||
fmuld %f0, %f2, %f6 | ||
|
||
661: ldxa [%g3] ASI_DMMU, %g5 | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
ldxa [%g3] ASI_MMU, %g5 | ||
.previous | ||
|
||
sethi %hi(sparc64_kern_sec_context), %g2 | ||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | ||
|
||
661: stxa %g2, [%g3] ASI_DMMU | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
stxa %g2, [%g3] ASI_MMU | ||
.previous | ||
|
||
membar #Sync | ||
add %g6, TI_FPREGS + 0xc0, %g2 | ||
faddd %f0, %f2, %f8 | ||
fmuld %f0, %f2, %f10 | ||
membar #Sync | ||
ldda [%g1] ASI_BLK_S, %f32 | ||
ldda [%g2] ASI_BLK_S, %f48 | ||
membar #Sync | ||
faddd %f0, %f2, %f12 | ||
fmuld %f0, %f2, %f14 | ||
faddd %f0, %f2, %f16 | ||
fmuld %f0, %f2, %f18 | ||
faddd %f0, %f2, %f20 | ||
fmuld %f0, %f2, %f22 | ||
faddd %f0, %f2, %f24 | ||
fmuld %f0, %f2, %f26 | ||
faddd %f0, %f2, %f28 | ||
fmuld %f0, %f2, %f30 | ||
b,pt %xcc, fpdis_exit | ||
nop | ||
2: andcc %g5, FPRS_DU, %g0 | ||
bne,pt %icc, 3f | ||
fzero %f32 | ||
mov SECONDARY_CONTEXT, %g3 | ||
fzero %f34 | ||
|
||
661: ldxa [%g3] ASI_DMMU, %g5 | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
ldxa [%g3] ASI_MMU, %g5 | ||
.previous | ||
|
||
add %g6, TI_FPREGS, %g1 | ||
sethi %hi(sparc64_kern_sec_context), %g2 | ||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | ||
|
||
661: stxa %g2, [%g3] ASI_DMMU | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
stxa %g2, [%g3] ASI_MMU | ||
.previous | ||
|
||
membar #Sync | ||
add %g6, TI_FPREGS + 0x40, %g2 | ||
faddd %f32, %f34, %f36 | ||
fmuld %f32, %f34, %f38 | ||
membar #Sync | ||
ldda [%g1] ASI_BLK_S, %f0 | ||
ldda [%g2] ASI_BLK_S, %f16 | ||
membar #Sync | ||
faddd %f32, %f34, %f40 | ||
fmuld %f32, %f34, %f42 | ||
faddd %f32, %f34, %f44 | ||
fmuld %f32, %f34, %f46 | ||
faddd %f32, %f34, %f48 | ||
fmuld %f32, %f34, %f50 | ||
faddd %f32, %f34, %f52 | ||
fmuld %f32, %f34, %f54 | ||
faddd %f32, %f34, %f56 | ||
fmuld %f32, %f34, %f58 | ||
faddd %f32, %f34, %f60 | ||
fmuld %f32, %f34, %f62 | ||
ba,pt %xcc, fpdis_exit | ||
nop | ||
3: mov SECONDARY_CONTEXT, %g3 | ||
add %g6, TI_FPREGS, %g1 | ||
|
||
661: ldxa [%g3] ASI_DMMU, %g5 | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
ldxa [%g3] ASI_MMU, %g5 | ||
.previous | ||
|
||
sethi %hi(sparc64_kern_sec_context), %g2 | ||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | ||
|
||
661: stxa %g2, [%g3] ASI_DMMU | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
stxa %g2, [%g3] ASI_MMU | ||
.previous | ||
|
||
membar #Sync | ||
mov 0x40, %g2 | ||
membar #Sync | ||
ldda [%g1] ASI_BLK_S, %f0 | ||
ldda [%g1 + %g2] ASI_BLK_S, %f16 | ||
add %g1, 0x80, %g1 | ||
ldda [%g1] ASI_BLK_S, %f32 | ||
ldda [%g1 + %g2] ASI_BLK_S, %f48 | ||
membar #Sync | ||
fpdis_exit: | ||
|
||
661: stxa %g5, [%g3] ASI_DMMU | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
stxa %g5, [%g3] ASI_MMU | ||
.previous | ||
|
||
membar #Sync | ||
fpdis_exit2: | ||
wr %g7, 0, %gsr | ||
ldx [%g6 + TI_XFSR], %fsr | ||
rdpr %tstate, %g3 | ||
or %g3, %g4, %g3 ! anal... | ||
wrpr %g3, %tstate | ||
wr %g0, FPRS_FEF, %fprs ! clean DU/DL bits | ||
retry | ||
.size do_fpdis,.-do_fpdis | ||
|
||
.align 32 | ||
.type fp_other_bounce,#function | ||
fp_other_bounce: | ||
call do_fpother | ||
add %sp, PTREGS_OFF, %o0 | ||
ba,pt %xcc, rtrap | ||
nop | ||
.size fp_other_bounce,.-fp_other_bounce | ||
|
||
.align 32 | ||
.globl do_fpother_check_fitos | ||
.type do_fpother_check_fitos,#function | ||
do_fpother_check_fitos: | ||
TRAP_LOAD_THREAD_REG(%g6, %g1) | ||
sethi %hi(fp_other_bounce - 4), %g7 | ||
or %g7, %lo(fp_other_bounce - 4), %g7 | ||
|
||
/* NOTE: Need to preserve %g7 until we fully commit | ||
* to the fitos fixup. | ||
*/ | ||
stx %fsr, [%g6 + TI_XFSR] | ||
rdpr %tstate, %g3 | ||
andcc %g3, TSTATE_PRIV, %g0 | ||
bne,pn %xcc, do_fptrap_after_fsr | ||
nop | ||
ldx [%g6 + TI_XFSR], %g3 | ||
srlx %g3, 14, %g1 | ||
and %g1, 7, %g1 | ||
cmp %g1, 2 ! Unfinished FP-OP | ||
bne,pn %xcc, do_fptrap_after_fsr | ||
sethi %hi(1 << 23), %g1 ! Inexact | ||
andcc %g3, %g1, %g0 | ||
bne,pn %xcc, do_fptrap_after_fsr | ||
rdpr %tpc, %g1 | ||
lduwa [%g1] ASI_AIUP, %g3 ! This cannot ever fail | ||
#define FITOS_MASK 0xc1f83fe0 | ||
#define FITOS_COMPARE 0x81a01880 | ||
sethi %hi(FITOS_MASK), %g1 | ||
or %g1, %lo(FITOS_MASK), %g1 | ||
and %g3, %g1, %g1 | ||
sethi %hi(FITOS_COMPARE), %g2 | ||
or %g2, %lo(FITOS_COMPARE), %g2 | ||
cmp %g1, %g2 | ||
bne,pn %xcc, do_fptrap_after_fsr | ||
nop | ||
std %f62, [%g6 + TI_FPREGS + (62 * 4)] | ||
sethi %hi(fitos_table_1), %g1 | ||
and %g3, 0x1f, %g2 | ||
or %g1, %lo(fitos_table_1), %g1 | ||
sllx %g2, 2, %g2 | ||
jmpl %g1 + %g2, %g0 | ||
ba,pt %xcc, fitos_emul_continue | ||
|
||
fitos_table_1: | ||
fitod %f0, %f62 | ||
fitod %f1, %f62 | ||
fitod %f2, %f62 | ||
fitod %f3, %f62 | ||
fitod %f4, %f62 | ||
fitod %f5, %f62 | ||
fitod %f6, %f62 | ||
fitod %f7, %f62 | ||
fitod %f8, %f62 | ||
fitod %f9, %f62 | ||
fitod %f10, %f62 | ||
fitod %f11, %f62 | ||
fitod %f12, %f62 | ||
fitod %f13, %f62 | ||
fitod %f14, %f62 | ||
fitod %f15, %f62 | ||
fitod %f16, %f62 | ||
fitod %f17, %f62 | ||
fitod %f18, %f62 | ||
fitod %f19, %f62 | ||
fitod %f20, %f62 | ||
fitod %f21, %f62 | ||
fitod %f22, %f62 | ||
fitod %f23, %f62 | ||
fitod %f24, %f62 | ||
fitod %f25, %f62 | ||
fitod %f26, %f62 | ||
fitod %f27, %f62 | ||
fitod %f28, %f62 | ||
fitod %f29, %f62 | ||
fitod %f30, %f62 | ||
fitod %f31, %f62 | ||
|
||
fitos_emul_continue: | ||
sethi %hi(fitos_table_2), %g1 | ||
srl %g3, 25, %g2 | ||
or %g1, %lo(fitos_table_2), %g1 | ||
and %g2, 0x1f, %g2 | ||
sllx %g2, 2, %g2 | ||
jmpl %g1 + %g2, %g0 | ||
ba,pt %xcc, fitos_emul_fini | ||
|
||
fitos_table_2: | ||
fdtos %f62, %f0 | ||
fdtos %f62, %f1 | ||
fdtos %f62, %f2 | ||
fdtos %f62, %f3 | ||
fdtos %f62, %f4 | ||
fdtos %f62, %f5 | ||
fdtos %f62, %f6 | ||
fdtos %f62, %f7 | ||
fdtos %f62, %f8 | ||
fdtos %f62, %f9 | ||
fdtos %f62, %f10 | ||
fdtos %f62, %f11 | ||
fdtos %f62, %f12 | ||
fdtos %f62, %f13 | ||
fdtos %f62, %f14 | ||
fdtos %f62, %f15 | ||
fdtos %f62, %f16 | ||
fdtos %f62, %f17 | ||
fdtos %f62, %f18 | ||
fdtos %f62, %f19 | ||
fdtos %f62, %f20 | ||
fdtos %f62, %f21 | ||
fdtos %f62, %f22 | ||
fdtos %f62, %f23 | ||
fdtos %f62, %f24 | ||
fdtos %f62, %f25 | ||
fdtos %f62, %f26 | ||
fdtos %f62, %f27 | ||
fdtos %f62, %f28 | ||
fdtos %f62, %f29 | ||
fdtos %f62, %f30 | ||
fdtos %f62, %f31 | ||
|
||
fitos_emul_fini: | ||
ldd [%g6 + TI_FPREGS + (62 * 4)], %f62 | ||
done | ||
.size do_fpother_check_fitos,.-do_fpother_check_fitos | ||
|
||
.align 32 | ||
.globl do_fptrap | ||
.type do_fptrap,#function | ||
do_fptrap: | ||
TRAP_LOAD_THREAD_REG(%g6, %g1) | ||
stx %fsr, [%g6 + TI_XFSR] | ||
do_fptrap_after_fsr: | ||
ldub [%g6 + TI_FPSAVED], %g3 | ||
rd %fprs, %g1 | ||
or %g3, %g1, %g3 | ||
stb %g3, [%g6 + TI_FPSAVED] | ||
rd %gsr, %g3 | ||
stx %g3, [%g6 + TI_GSR] | ||
mov SECONDARY_CONTEXT, %g3 | ||
|
||
661: ldxa [%g3] ASI_DMMU, %g5 | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
ldxa [%g3] ASI_MMU, %g5 | ||
.previous | ||
|
||
sethi %hi(sparc64_kern_sec_context), %g2 | ||
ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2 | ||
|
||
661: stxa %g2, [%g3] ASI_DMMU | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
stxa %g2, [%g3] ASI_MMU | ||
.previous | ||
|
||
membar #Sync | ||
add %g6, TI_FPREGS, %g2 | ||
andcc %g1, FPRS_DL, %g0 | ||
be,pn %icc, 4f | ||
mov 0x40, %g3 | ||
stda %f0, [%g2] ASI_BLK_S | ||
stda %f16, [%g2 + %g3] ASI_BLK_S | ||
andcc %g1, FPRS_DU, %g0 | ||
be,pn %icc, 5f | ||
4: add %g2, 128, %g2 | ||
stda %f32, [%g2] ASI_BLK_S | ||
stda %f48, [%g2 + %g3] ASI_BLK_S | ||
5: mov SECONDARY_CONTEXT, %g1 | ||
membar #Sync | ||
|
||
661: stxa %g5, [%g1] ASI_DMMU | ||
.section .sun4v_1insn_patch, "ax" | ||
.word 661b | ||
stxa %g5, [%g1] ASI_MMU | ||
.previous | ||
|
||
membar #Sync | ||
ba,pt %xcc, etrap | ||
wr %g0, 0, %fprs | ||
.size do_fptrap,.-do_fptrap |
Oops, something went wrong.