summaryrefslogtreecommitdiffstats
path: root/src/ssx/ppc405/ppc405_mmu_asm.S
blob: 1118779f59ea5a31e5caac3179090cd1d793dc49 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// $Id: ppc405_mmu_asm.S,v 1.1.1.1 2013/12/11 21:03:27 bcbrock Exp $
// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ssx/ppc405/ppc405_mmu_asm.S,v $
//-----------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2013
// *! All Rights Reserved -- Property of IBM
// *! *** IBM Confidential ***
//-----------------------------------------------------------------------------
        
/// \file ppc405_mmu_asm.S
/// \brief Assembler support for PPC405 MMU operations
///
/// Currently the only API in this file - ppc405_mmu_start() - is likely an
/// initialization-only API that could be removed from the run-time image.
        
        .nolist
#include "ssx.h"
        .list

/// Start MMU mode on the PPC405
///
/// This API enables PPC405 address translation of the type supported by SSX -
/// simple 1 to 1 effective - real translation for the purpose of
/// protection. It is coded in assembler to ensure that this transition is
/// done as cache-safely as generically possible.  The API enters a critical
/// section and flushes the data cache and invalidates the I-cache, then
/// enables the translation modes specifed by PPC405_RELOCATION_MODE.
/// Following is a final invalidation of the I-cache.
///
/// \cond

        .global_function ppc405_mmu_start
ppc405_mmu_start:

        ## Create and link a stack frame

        stwu    %r1, -16(%r1)
        mflr    %r0
        stw     %r0, 20(%r1)
        
        ## Enter critical section, save original MSR in R31
        
        stw     %r31, 8(%r1)
        _ssx_critical_section_enter SSX_CRITICAL, %r31, %r4

        ## Flush D-cache, Invalidate I-Cache

        bl      dcache_flush_all
        bl      icache_invalidate_all

        ## Enter translation mode on original MSR (removing critical section) 

        _liw    %r3, 1f
        mtsrr0  %r3
        _liwa   %r3, PPC405_RELOCATION_MODE
        or      %r3, %r31, %r3
        mtsrr1  %r3
        rfi
1:
        ## Invalidate I-cache again

        bl      icache_invalidate_all

        ## Restore R31, Unwind stack and return

        lwz     %r31, 8(%r1)
        lwz     %r0, 20(%r1)
        mtlr    %r0
        addi    %r1, %r1, 16
        blr

        .epilogue ppc405_mmu_start

/// \endcond
OpenPOWER on IntegriCloud