source: soft/giet_vm/boot/reset.S @ 189

Last change on this file since 189 was 189, checked in by alain, 12 years ago

Introducing a new release where all initialisation
is done in the boot code.

File size: 5.6 KB
RevLine 
[160]1/********************************************************************************/
[165]2/*      File : reset.S                                                              */
3/*      Author : Alain Greiner  & Mohamed karaoui                                   */
4/*      Date : 03/06/2012                                                                                       */
[160]5/********************************************************************************/
6/* This boot code is for a multi-cluster, multi-processor architecture,             */
[165]7/* running one or several multi-tasks software application(s) defined in        */
[160]8/* the mapping_info data-structure.                                                                     */
[189]9/* Procesor 0 uses the mapping_info data structure to statically initialize             */
10/* the kernel structures:                                                                                                               */
11/* - build page tables for all vspaces                                                                                  */
12/* - initializes the vobjs not initialized by GCC                                                               */
13/* - initialize the schedulers and task contexts for all processeurs                    */
14/* - initialize the peripherals                                                                                                 */                             
[160]15/* Other processors are waiting until the mapping_info signature has been       */
[189]16/* modified by processor 0.                                                                                                             */
17/*                                                                                                                                                              */
[165]18/* Implementation note:                                                                                                                 */
[160]19/* The entry point is 0xbfc00000, but the actual boot code starts at address    */
20/* 0xbfc00500, and a minimal boot exception handler is implemented at address   */
21/* 0xbfc0380.                                                                                                   */
22/********************************************************************************/
23               
24#include <giet_config.h>
[165]25#include "../sys/mips32_registers.h"
[160]26
27#define EXCEP_ORG               0x380
28#define START_ORG               0x500
29
30#define OUT_MAPPING_SIGNATURE   0xBABEF00D
31
32        .section .boot,"ax",@progbits
33        .align  2
34        .set noreorder
35
36/********************************************************/
37/* reset entry point                                    */
38/* (address 0xBFC00000 imposed by the hardware)         */
39/********************************************************/
40boot_reset:
41    j   boot_start
42        nop
43
44/*******************************************************/
45/* handling exceptions in the boot phase               */
46/* (address 0xBFC00380 imposed by the hardware         */
47/*******************************************************/
48        .align  2
49    .org        EXCEP_ORG
[189]50
[160]51boot_excep:
[189]52
53    # get the lock protecting TTY0
54    la          k0, boot_tty0_lock
55    ll          k1, 0(k0)
56    bnez        k1, boot_excep
57    li          k1, 1
58    sc      k1, 0(k0)
59    beqz        k1, boot_excep
[160]60    nop
[189]61
62    # display error messages on TTY0 
63    la          a0,     boot_error_string
64    jal         boot_puts
65    nop
[160]66    mfc0        a0,     CP0_TIME
[189]67        jal             boot_putw
[160]68        nop
[189]69    la          a0,     boot_lf_string
70    jal         boot_puts
[160]71    nop
72
[189]73        la              a0,     boot_pid_string
74    jal         boot_puts
[165]75    nop
76    mfc0        k0,     CP0_PROCID
77    andi        a0,     k0,     0xFFF
[189]78        jal             boot_putw
[165]79    nop
[189]80    la          a0,     boot_lf_string
81    jal         boot_puts
[165]82    nop
83
[189]84        la              a0,     boot_epc_string
85    jal         boot_puts
[160]86    nop
87    mfc0        a0,     CP0_EPC
[189]88        jal             boot_putw
[160]89    nop
[189]90    la          a0,     boot_lf_string
91    jal         boot_puts
[160]92    nop
93
[189]94        la              a0,     boot_cr_string
95    jal         boot_puts
[160]96    nop
97    mfc0        a0,     CP0_CR
[189]98        jal             boot_putw
[160]99    nop
[189]100    la          a0,     boot_lf_string
101    jal         boot_puts
[160]102    nop
103
[189]104        la              a0,     boot_sr_string
105    jal         boot_puts
[160]106    nop
107    mfc0        a0,     CP0_SR
[189]108        jal             boot_putw
[160]109    nop
[189]110    la          a0,     boot_lf_string
111    jal         boot_puts
[160]112    nop
113
[189]114        la              a0,     boot_bar_string
115    jal         boot_puts
[160]116    nop
117    mfc0        a0,     CP0_BAR
[189]118        jal             boot_putw
[160]119    nop
[189]120    la          a0,     boot_lf_string
121    jal         boot_puts
[160]122    nop
123
[189]124    # release the lock 
125    la          k0,     boot_tty0_lock
126    li          k1,     0
127    sw          k1, 0(k0)
128
129    # exit
[160]130        j       boot_exit
131        nop
132
133/*******************************************/
134/* actual starting point for the boot code */
135/*******************************************/
136    .align      2
[165]137    .org        START_ORG
[160]138
139boot_start:
[189]140
141    # get the procid
[160]142    mfc0        k0,     CP0_PROCID
[189]143    andi        k0,     k0,     0xFFF   # no more than 4096 processors
[160]144
[189]145    # Only processor 0 does init
146    bne         k0,     zero,   boot_wait_signature
[160]147    nop
148
[189]149    # Processor 0 get a temporary stack
[165]150    la      sp, seg_boot_stack_base
[189]151    addiu       sp,     sp,     0x3000                          # SP <= seg_boot_stack + 12K
[160]152
[189]153    # Processor 0 initialises all kernel structures
154    jal boot_init
[160]155    nop
[165]156 
[189]157    # jump to kernel_init
[165]158    j           boot_to_kernel_init
[160]159    nop
160
161boot_wait_signature:
[165]162
[189]163    # all other processors are waiting signature change
164    la          k0, seg_mapping_base
165    cache   0x11,   0(k0)                               # invalidate local cache copy
166    lw          k0, 0(k0)                                       # k0 <= mapping_info[0]       
167    li          k1, OUT_MAPPING_SIGNATURE
168    bne         k1, k0, boot_wait_signature
[160]169    nop
170       
[189]171    # all other processors initialise SP register: temporary stack of 256 bytes
[165]172    la      sp, seg_boot_stack_base
173    addiu   sp, sp, 0x3100                             
174    mfc0        k0, CP0_PROCID
175    andi    k0, k0, 0xFFF
176    sll     k0, k0, 8                                   
[189]177    addu    sp, sp, k0          # SP <= seg_boot_stack_base + 12K + (pid+1)*256
[160]178
[165]179boot_to_kernel_init:
[160]180
[189]181    # all processors initialise SCHED register with boot_schedulers_paddr[pid]
182    mfc0        k0, CP0_PROCID
183    andi    k0, k0, 0xFFF
184    sll         k0, k0, 2               # k0 <= 4*pid
185    la          k1, boot_schedulers_paddr
186    addu    k1, k1, k0          # k1 <= &boot_scheduler_paddr[pid]
187    lw          k1,     0(k1)           
188    mtc0        k1, CP0_SCHED
189
190    # all processors initialize PTPR register with boot_ptabs_paddr[0]
191    la      k1, boot_ptabs_paddr
[160]192    lw      k1, 0(k1)   
193    srl     k1, k1, 13
[189]194    mtc2        k1,     CP2_PTPR       
[160]195
[189]196        # all processors activate MMU
[165]197    li      k1, 0xF
[189]198    mtc2    k1, CP2_MODE
[160]199
[189]200    # all processors jump to kernel_init
[165]201    la      k0, seg_kernel_init_base
[160]202    j       k0
203    nop
204
[189]205boot_error_string:      .asciiz "\n[BOOT] Fatal Error at cycle "
[165]206boot_pid_string:        .asciiz "    PID  = "
[160]207boot_sr_string:         .asciiz "    SR   = "
208boot_cr_string:         .asciiz "    CR   = "
209boot_epc_string:        .asciiz "    EPC  = "
210boot_bar_string:        .asciiz "    BAR  = "
211boot_lf_string:         .asciiz "\n"
212
[189]213boot_tty0_lock:         .word   0
[160]214
[189]215        .set    reorder
[160]216
[189]217
Note: See TracBrowser for help on using the repository browser.