1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 #include <asm/asm-offsets.h>
  16 #include <asm/psw.h>
  17 #include <asm/pdc.h>
  18         
  19 #include <asm/assembly.h>
  20 #include <asm/pgtable.h>
  21 
  22 #include <linux/linkage.h>
  23 #include <linux/init.h>
  24 
  25         .level  PA_ASM_LEVEL
  26 
  27         __INITDATA
  28 ENTRY(boot_args)
  29         .word 0 
  30         .word 0 
  31         .word 0 
  32         .word 0 
  33 END(boot_args)
  34 
  35         __HEAD
  36 
  37         .align  4
  38         .import init_thread_union,data
  39         .import fault_vector_20,code    
  40 #ifndef CONFIG_64BIT
  41         .import fault_vector_11,code    
  42         .import $global$                
  43 #endif 
  44 ENTRY(parisc_kernel_start)
  45         .proc
  46         .callinfo
  47 
  48         
  49         mtsp    %r0,%sr4
  50         mtsp    %r0,%sr5
  51         mtsp    %r0,%sr6
  52         mtsp    %r0,%sr7
  53 
  54         
  55 
  56         .import __bss_start,data
  57         .import __bss_stop,data
  58 
  59         load32          PA(__bss_start),%r3
  60         load32          PA(__bss_stop),%r4
  61 $bss_loop:
  62         cmpb,<<,n       %r3,%r4,$bss_loop
  63         stw,ma          %r0,4(%r3)
  64 
  65         
  66         load32          PA(boot_args),%r1
  67         stw,ma          %arg0,4(%r1)
  68         stw,ma          %arg1,4(%r1)
  69         stw,ma          %arg2,4(%r1)
  70         stw,ma          %arg3,4(%r1)
  71 
  72         
  73         load32          PA(swapper_pg_dir),%r4
  74         mtctl           %r4,%cr24       
  75         mtctl           %r4,%cr25       
  76 
  77 #if CONFIG_PGTABLE_LEVELS == 3
  78         
  79         load32          PA(pmd0),%r5
  80         shrd            %r5,PxD_VALUE_SHIFT,%r3 
  81         ldo             (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
  82         stw             %r3,ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4)
  83         ldo             ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r4
  84 #else
  85         
  86         ldo             ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4
  87 #endif
  88 
  89         
  90         load32          PA(pg0),%r1
  91         SHRREG          %r1,PxD_VALUE_SHIFT,%r3
  92         ldo             (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
  93 
  94         ldi             ASM_PT_INITIAL,%r1
  95 
  96 1:
  97         stw             %r3,0(%r4)
  98         ldo             (PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
  99         addib,>         -1,%r1,1b
 100 #if CONFIG_PGTABLE_LEVELS == 3
 101         ldo             ASM_PMD_ENTRY_SIZE(%r4),%r4
 102 #else
 103         ldo             ASM_PGD_ENTRY_SIZE(%r4),%r4
 104 #endif
 105 
 106 
 107         
 108 
 109         ldo             0+_PAGE_KERNEL_RWX(%r0),%r3 
 110         load32          (1<<(KERNEL_INITIAL_ORDER-PAGE_SHIFT)),%r11 
 111         load32          PA(pg0),%r1
 112 
 113 $pgt_fill_loop:
 114         STREGM          %r3,ASM_PTE_ENTRY_SIZE(%r1)
 115         ldo             (1<<PFN_PTE_SHIFT)(%r3),%r3 
 116         addib,>         -1,%r11,$pgt_fill_loop
 117         nop
 118 
 119         
 120         copy            %r0,%r2
 121 
 122         
 123         load32          start_parisc,%r11
 124 
 125         
 126         load32          init_thread_union,%r6
 127         mtctl           %r6,%cr30
 128 
 129         
 130         ldo             THREAD_SZ_ALGN(%r6),%sp
 131 
 132 #if defined(CONFIG_64BIT) && defined(CONFIG_FUNCTION_TRACER)
 133         .import _mcount,data
 134         
 135         
 136         loadgp
 137         load32          PA(_mcount), %r10
 138         std             %dp,0x18(%r10)
 139 #endif
 140 
 141 #ifdef CONFIG_64BIT
 142         
 143 #define MEM_PDC_LO 0x388
 144 #define MEM_PDC_HI 0x35C
 145         ldw             MEM_PDC_LO(%r0),%r3
 146         ldw             MEM_PDC_HI(%r0),%r10
 147         depd            %r10, 31, 32, %r3        
 148 #endif
 149 
 150 
 151 #ifdef CONFIG_SMP
 152         
 153 
 154 
 155 
 156 
 157         load32          PA(smp_slave_stext),%r10
 158         stw             %r10,0x10(%r0)  
 159         stw             %r0,0x28(%r0)   
 160 
 161         
 162         .procend
 163 
 164         
 165 
 166 
 167 
 168 
 169 
 170 
 171 
 172 
 173 
 174 
 175 
 176 
 177 
 178 
 179 common_stext:
 180         .proc
 181         .callinfo
 182 #else
 183         
 184         stw             %r0,0x10(%r0)   
 185         stw             %r0,0x28(%r0)   
 186 #endif 
 187 
 188 #ifdef CONFIG_64BIT
 189         tophys_r1       %sp
 190 
 191         
 192         ldd             TI_TASK-THREAD_SZ_ALGN(%sp), %r10
 193         tophys_r1       %r10
 194         std             %r11,  TASK_PT_GR11(%r10)
 195         
 196 
 197 
 198 1:      mfia            %rp             
 199         ldo             2f-1b(%rp),%rp
 200         depdi           0,31,32,%rp
 201         bv              (%rp)
 202         ssm             PSW_SM_W,%r0
 203 
 204         
 205 
 206 
 207 
 208 2:
 209         mfctl           %cr30,%r6               
 210 
 211         ldo             PDC_PSW(%r0),%arg0              
 212         ldo             PDC_PSW_SET_DEFAULTS(%r0),%arg1 
 213         ldo             PDC_PSW_WIDE_BIT(%r0),%arg2     
 214         load32          PA(stext_pdc_ret), %rp
 215         bv              (%r3)
 216         copy            %r0,%arg3
 217 
 218 stext_pdc_ret:
 219         mtctl           %r6,%cr30               
 220 
 221         
 222         ldd             TI_TASK-THREAD_SZ_ALGN(%sp), %r10
 223         tophys_r1       %r10
 224         ldd             TASK_PT_GR11(%r10), %r11
 225         tovirt_r1       %sp
 226 #endif
 227         
 228         
 229         mtsp    %r0,%sr0
 230         mtsp    %r0,%sr1
 231         mtsp    %r0,%sr2
 232         mtsp    %r0,%sr3
 233 
 234         
 235         mtctl   %r0,%cr8
 236         mtctl   %r0,%cr9
 237         mtctl   %r0,%cr12
 238         mtctl   %r0,%cr13
 239 
 240         
 241         loadgp
 242 
 243         
 244 
 245 
 246 
 247 
 248 
 249 #ifndef CONFIG_64BIT
 250         ldi             32,%r10
 251         mtctl           %r10,%cr11
 252         .level 2.0
 253         mfctl,w         %cr11,%r10
 254         .level 1.1
 255         comib,<>,n      0,%r10,$is_pa20
 256         ldil            L%PA(fault_vector_11),%r10
 257         b               $install_iva
 258         ldo             R%PA(fault_vector_11)(%r10),%r10
 259 
 260 $is_pa20:
 261         .level          PA_ASM_LEVEL 
 262 #endif 
 263         load32          PA(fault_vector_20),%r10
 264 
 265 $install_iva:
 266         mtctl           %r10,%cr14
 267 
 268         b               aligned_rfi  
 269         nop
 270 
 271         .align 128
 272 aligned_rfi:
 273         pcxt_ssm_bug
 274 
 275         copy            %r3, %arg0      
 276 
 277         rsm             PSW_SM_QUIET,%r0        
 278         
 279 
 280         mtctl           %r0,%cr17       
 281         mtctl           %r0,%cr17       
 282 
 283         
 284         mtctl           %r11,%cr18      
 285         ldo             4(%r11),%r11
 286         mtctl           %r11,%cr18      
 287 
 288         load32          KERNEL_PSW,%r10
 289         mtctl           %r10,%ipsw
 290         
 291         
 292         rfi
 293         nop
 294 
 295         .procend
 296 
 297 #ifdef CONFIG_SMP
 298 
 299         .import smp_init_current_idle_task,data
 300         .import smp_callin,code
 301 
 302 #ifndef CONFIG_64BIT
 303 smp_callin_rtn:
 304         .proc
 305         .callinfo
 306         break   1,1             
 307         nop
 308         nop
 309         .procend
 310 #endif 
 311 
 312 
 313 
 314 
 315 
 316 
 317 
 318 
 319 
 320 smp_slave_stext:
 321         .proc
 322         .callinfo
 323 
 324         
 325 
 326 
 327         mtsp       %r0,%sr4
 328         mtsp       %r0,%sr5
 329         mtsp       %r0,%sr6
 330         mtsp       %r0,%sr7
 331 
 332 #ifdef CONFIG_64BIT
 333         
 334 
 335 
 336 
 337 1:      mfia            %rp             
 338         ldo             2f-1b(%rp),%rp
 339         depdi           0,31,32,%rp
 340         bv              (%rp)
 341         ssm             PSW_SM_W,%r0
 342 2:
 343 #endif
 344 
 345         
 346         load32          PA(smp_init_current_idle_task),%sp
 347         LDREG           0(%sp),%sp      
 348         tophys_r1       %sp
 349         LDREG           TASK_THREAD_INFO(%sp),%sp
 350         mtctl           %sp,%cr30       
 351         ldo             THREAD_SZ_ALGN(%sp),%sp
 352 
 353         
 354         load32          PA(swapper_pg_dir),%r4
 355         mtctl           %r4,%cr24       
 356         mtctl           %r4,%cr25       
 357 
 358 #ifdef CONFIG_64BIT
 359         
 360         copy            %arg0,%r3
 361 #else
 362         
 363         load32          smp_callin_rtn,%r2
 364 #endif
 365         
 366         
 367         load32          smp_callin,%r11
 368         
 369         
 370         b               common_stext
 371         nop
 372 
 373         .procend
 374 #endif 
 375 
 376 ENDPROC(parisc_kernel_start)
 377 
 378 #ifndef CONFIG_64BIT
 379         .section .data..ro_after_init
 380 
 381         .align  4
 382         .export $global$,data
 383 
 384         .type   $global$,@object
 385         .size   $global$,4
 386 $global$:       
 387         .word 0
 388 #endif