mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.2 KiB
52 lines
1.2 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
/* The registers for cross calls will be: |
|
* |
|
* DATA 0: [low 32-bits] Address of function to call, jmp to this |
|
* [high 32-bits] MMU Context Argument 0, place in %g5 |
|
* DATA 1: Address Argument 1, place in %g1 |
|
* DATA 2: Address Argument 2, place in %g7 |
|
* |
|
* With this method we can do most of the cross-call tlb/cache |
|
* flushing very quickly. |
|
*/ |
|
.align 32 |
|
.globl do_ivec |
|
.type do_ivec,#function |
|
do_ivec: |
|
mov 0x40, %g3 |
|
ldxa [%g3 + %g0] ASI_INTR_R, %g3 |
|
sethi %hi(KERNBASE), %g4 |
|
cmp %g3, %g4 |
|
bgeu,pn %xcc, do_ivec_xcall |
|
srlx %g3, 32, %g5 |
|
stxa %g0, [%g0] ASI_INTR_RECEIVE |
|
membar #Sync |
|
|
|
sethi %hi(ivector_table_pa), %g2 |
|
ldx [%g2 + %lo(ivector_table_pa)], %g2 |
|
sllx %g3, 4, %g3 |
|
add %g2, %g3, %g3 |
|
|
|
TRAP_LOAD_IRQ_WORK_PA(%g6, %g1) |
|
|
|
ldx [%g6], %g5 |
|
stxa %g5, [%g3] ASI_PHYS_USE_EC |
|
stx %g3, [%g6] |
|
wr %g0, 1 << PIL_DEVICE_IRQ, %set_softint |
|
retry |
|
do_ivec_xcall: |
|
mov 0x50, %g1 |
|
ldxa [%g1 + %g0] ASI_INTR_R, %g1 |
|
srl %g3, 0, %g3 |
|
|
|
mov 0x60, %g7 |
|
ldxa [%g7 + %g0] ASI_INTR_R, %g7 |
|
stxa %g0, [%g0] ASI_INTR_RECEIVE |
|
membar #Sync |
|
ba,pt %xcc, 1f |
|
nop |
|
|
|
.align 32 |
|
1: jmpl %g3, %g0 |
|
nop |
|
.size do_ivec,.-do_ivec
|
|
|