Subversion Repositories HelenOS-historic

Rev

Rev 1022 | Rev 1068 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

#
# Copyright (C) 2006 Martin Decky
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# - Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
# - The name of the author may not be used to endorse or promote products
#   derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

#include "asm.h"
#include "regname.h"

.data

flush_buffer:
    .space (L1_CACHE_LINES * L1_CACHE_BYTES)

.text

.global halt
.global jump_to_kernel

halt:
    b halt

jump_to_kernel:
    
    # r3 = memmap (pa)
    # r4 = trans (pa)
    # r5 = number of kernel pages
    # r6 = real_mode (pa)
    
    mtspr srr0, r6
    
    # jumps to real_mode
    
    mfmsr r31
    lis r30, ~0@h
    ori r30, r30, ~(msr_ir | msr_dr)@l
    and r31, r31, r30
    mtspr srr1, r31
    rfi

.section REALMODE
.align PAGE_WIDTH
.global real_mode

real_mode:
    
    # copy kernel to proper location
    #
    # r4 = trans (pa)
    # r5 = number of kernel pages
    
    li r31, PAGE_SIZE >> 3
    li r30, 0
    
    page_copy:
        
        cmpwi r5, 0
        beq copy_end
        
        # copy single page
        
        mtctr r31
        lwz r29, 0(r4)
        
        copy_loop:
            
            lwz r28, 0(r29)
            stw r28, 0(r30)
            
            addi r29, r29, 4
            addi r30, r30, 4
            
            bdnz copy_loop
        
        subi r5, r5, 1
        addi r4, r4, 4
        b page_copy
    
    copy_end:
        
    # fill segment registers

    li r31, 16
    mtctr r31
    li r31, 0
    li r30, 0x2000
    
    seg_fill:
    
        mtsrin r30, r31
        
        addis r31, r31, 0x1000    # add 256 MB
        addi  r30, r30, 0x111     # move to next SR
        
        bdnz seg_fill
    
    # create identity mapping
    
    tlbia
    
    # start the kernel
    #
    # r3 = memmap (pa)
    
    lis r31, KERNEL_START_ADDR@ha
    addi r31, r31, KERNEL_START_ADDR@l
    
    mtspr srr0, r31
    
    mfmsr r31
    ori r31, r31, (msr_ir | msr_dr)@l
    mtspr srr1, r31
    
    rfi

.align PAGE_WIDTH
.global trans
trans:
    .space (TRANS_SIZE * TRANS_ITEM_SIZE)