summaryrefslogtreecommitdiffstats
path: root/src/ssx/ppc405/ppc405_mmu_asm.S
blob: d5fefd36589821de5ea155438c54148a7e382126 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: src/ssx/ppc405/ppc405_mmu_asm.S $                             */
/*                                                                        */
/* OpenPOWER OnChipController Project                                     */
/*                                                                        */
/* Contributors Listed Below - COPYRIGHT 2014,2015                        */
/* [+] International Business Machines Corp.                              */
/*                                                                        */
/*                                                                        */
/* Licensed under the Apache License, Version 2.0 (the "License");        */
/* you may not use this file except in compliance with the License.       */
/* You may obtain a copy of the License at                                */
/*                                                                        */
/*     http://www.apache.org/licenses/LICENSE-2.0                         */
/*                                                                        */
/* Unless required by applicable law or agreed to in writing, software    */
/* distributed under the License is distributed on an "AS IS" BASIS,      */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
/* implied. See the License for the specific language governing           */
/* permissions and limitations under the License.                         */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
//-----------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2014
// *! 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