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

Last change on this file since 234 was 234, checked in by haoliu, 11 years ago

add initialization of proc_time to zero in reset.S

File size: 5.7 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
[207]67        jal             boot_putd
[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
[207]78        jal             boot_putd
[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
[204]88        jal             boot_putx
[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
[204]98        jal             boot_putx
[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
[204]108        jal             boot_putx
[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
[199]117    mfc0        a0,     CP0_BVAR
[204]118        jal             boot_putx
[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
[234]141    # initialize the proc_time to zero 
142    mtc0    $0, CP0_TIME
143
[189]144    # get the procid
[160]145    mfc0        k0,     CP0_PROCID
[189]146    andi        k0,     k0,     0xFFF   # no more than 4096 processors
[160]147
[189]148    # Only processor 0 does init
149    bne         k0,     zero,   boot_wait_signature
[160]150    nop
151
[189]152    # Processor 0 get a temporary stack
[165]153    la      sp, seg_boot_stack_base
[189]154    addiu       sp,     sp,     0x3000                          # SP <= seg_boot_stack + 12K
[160]155
[189]156    # Processor 0 initialises all kernel structures
157    jal boot_init
[160]158    nop
[165]159 
[189]160    # jump to kernel_init
[165]161    j           boot_to_kernel_init
[160]162    nop
163
164boot_wait_signature:
[165]165
[189]166    # all other processors are waiting signature change
167    la          k0, seg_mapping_base
168    cache   0x11,   0(k0)                               # invalidate local cache copy
169    lw          k0, 0(k0)                                       # k0 <= mapping_info[0]       
170    li          k1, OUT_MAPPING_SIGNATURE
171    bne         k1, k0, boot_wait_signature
[160]172    nop
173       
[189]174    # all other processors initialise SP register: temporary stack of 256 bytes
[165]175    la      sp, seg_boot_stack_base
176    addiu   sp, sp, 0x3100                             
177    mfc0        k0, CP0_PROCID
178    andi    k0, k0, 0xFFF
179    sll     k0, k0, 8                                   
[189]180    addu    sp, sp, k0          # SP <= seg_boot_stack_base + 12K + (pid+1)*256
[160]181
[165]182boot_to_kernel_init:
[160]183
[189]184    # all processors initialise SCHED register with boot_schedulers_paddr[pid]
185    mfc0        k0, CP0_PROCID
186    andi    k0, k0, 0xFFF
187    sll         k0, k0, 2               # k0 <= 4*pid
188    la          k1, boot_schedulers_paddr
189    addu    k1, k1, k0          # k1 <= &boot_scheduler_paddr[pid]
190    lw          k1,     0(k1)           
191    mtc0        k1, CP0_SCHED
192
193    # all processors initialize PTPR register with boot_ptabs_paddr[0]
194    la      k1, boot_ptabs_paddr
[160]195    lw      k1, 0(k1)   
196    srl     k1, k1, 13
[189]197    mtc2        k1,     CP2_PTPR       
[160]198
[189]199        # all processors activate MMU
[165]200    li      k1, 0xF
[189]201    mtc2    k1, CP2_MODE
[160]202
[189]203    # all processors jump to kernel_init
[165]204    la      k0, seg_kernel_init_base
[160]205    j       k0
206    nop
207
[189]208boot_error_string:      .asciiz "\n[BOOT] Fatal Error at cycle "
[165]209boot_pid_string:        .asciiz "    PID  = "
[160]210boot_sr_string:         .asciiz "    SR   = "
211boot_cr_string:         .asciiz "    CR   = "
212boot_epc_string:        .asciiz "    EPC  = "
213boot_bar_string:        .asciiz "    BAR  = "
214boot_lf_string:         .asciiz "\n"
215
[189]216boot_tty0_lock:         .word   0
[160]217
[189]218        .set    reorder
[160]219
[189]220
Note: See TracBrowser for help on using the repository browser.