forked from 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.
80 lines
1.4 KiB
80 lines
1.4 KiB
/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|
/* |
|
* This file contains low-level assembler routines for managing |
|
* the PowerPC 603 tlb invalidation. |
|
*/ |
|
|
|
#include <asm/page.h> |
|
#include <asm/ppc_asm.h> |
|
#include <asm/asm-offsets.h> |
|
|
|
/* |
|
* Flush an entry from the TLB |
|
*/ |
|
#ifdef CONFIG_SMP |
|
_GLOBAL(_tlbie) |
|
lwz r8,TASK_CPU(r2) |
|
oris r8,r8,11 |
|
mfmsr r10 |
|
rlwinm r0,r10,0,17,15 /* clear bit 16 (MSR_EE) */ |
|
rlwinm r0,r0,0,28,26 /* clear DR */ |
|
mtmsr r0 |
|
isync |
|
lis r9,mmu_hash_lock@h |
|
ori r9,r9,mmu_hash_lock@l |
|
tophys(r9,r9) |
|
10: lwarx r7,0,r9 |
|
cmpwi 0,r7,0 |
|
bne- 10b |
|
stwcx. r8,0,r9 |
|
bne- 10b |
|
eieio |
|
tlbie r3 |
|
sync |
|
TLBSYNC |
|
li r0,0 |
|
stw r0,0(r9) /* clear mmu_hash_lock */ |
|
mtmsr r10 |
|
isync |
|
blr |
|
_ASM_NOKPROBE_SYMBOL(_tlbie) |
|
#endif /* CONFIG_SMP */ |
|
|
|
/* |
|
* Flush the entire TLB. 603/603e only |
|
*/ |
|
_GLOBAL(_tlbia) |
|
#if defined(CONFIG_SMP) |
|
lwz r8,TASK_CPU(r2) |
|
oris r8,r8,10 |
|
mfmsr r10 |
|
rlwinm r0,r10,0,17,15 /* clear bit 16 (MSR_EE) */ |
|
rlwinm r0,r0,0,28,26 /* clear DR */ |
|
mtmsr r0 |
|
isync |
|
lis r9,mmu_hash_lock@h |
|
ori r9,r9,mmu_hash_lock@l |
|
tophys(r9,r9) |
|
10: lwarx r7,0,r9 |
|
cmpwi 0,r7,0 |
|
bne- 10b |
|
stwcx. r8,0,r9 |
|
bne- 10b |
|
#endif /* CONFIG_SMP */ |
|
li r5, 32 |
|
lis r4, KERNELBASE@h |
|
mtctr r5 |
|
sync |
|
0: tlbie r4 |
|
addi r4, r4, 0x1000 |
|
bdnz 0b |
|
sync |
|
#ifdef CONFIG_SMP |
|
TLBSYNC |
|
li r0,0 |
|
stw r0,0(r9) /* clear mmu_hash_lock */ |
|
mtmsr r10 |
|
isync |
|
#endif /* CONFIG_SMP */ |
|
blr |
|
_ASM_NOKPROBE_SYMBOL(_tlbia)
|
|
|