linux/arch/arm/boot/compressed/head.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 *  linux/arch/arm/boot/compressed/head.S
   4 *
   5 *  Copyright (C) 1996-2002 Russell King
   6 *  Copyright (C) 2004 Hyok S. Choi (MPU support)
   7 */
   8#include <linux/linkage.h>
   9#include <asm/assembler.h>
  10#include <asm/v7m.h>
  11
  12#include "efi-header.S"
  13
  14#ifdef __ARMEB__
  15#define OF_DT_MAGIC 0xd00dfeed
  16#else
  17#define OF_DT_MAGIC 0xedfe0dd0
  18#endif
  19
  20 AR_CLASS(      .arch   armv7-a )
  21 M_CLASS(       .arch   armv7-m )
  22
  23/*
  24 * Debugging stuff
  25 *
  26 * Note that these macros must not contain any code which is not
  27 * 100% relocatable.  Any attempt to do so will result in a crash.
  28 * Please select one of the following when turning on debugging.
  29 */
  30#ifdef DEBUG
  31
  32#if defined(CONFIG_DEBUG_ICEDCC)
  33
  34#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_V6K) || defined(CONFIG_CPU_V7)
  35                .macro  loadsp, rb, tmp1, tmp2
  36                .endm
  37                .macro  writeb, ch, rb, tmp
  38                mcr     p14, 0, \ch, c0, c5, 0
  39                .endm
  40#elif defined(CONFIG_CPU_XSCALE)
  41                .macro  loadsp, rb, tmp1, tmp2
  42                .endm
  43                .macro  writeb, ch, rb, tmp
  44                mcr     p14, 0, \ch, c8, c0, 0
  45                .endm
  46#else
  47                .macro  loadsp, rb, tmp1, tmp2
  48                .endm
  49                .macro  writeb, ch, rb, tmp
  50                mcr     p14, 0, \ch, c1, c0, 0
  51                .endm
  52#endif
  53
  54#else
  55
  56#include CONFIG_DEBUG_LL_INCLUDE
  57
  58                .macro  writeb, ch, rb, tmp
  59#ifdef CONFIG_DEBUG_UART_FLOW_CONTROL
  60                waituartcts \tmp, \rb
  61#endif
  62                waituarttxrdy \tmp, \rb
  63                senduart \ch, \rb
  64                busyuart \tmp, \rb
  65                .endm
  66
  67#if defined(CONFIG_ARCH_SA1100)
  68                .macro  loadsp, rb, tmp1, tmp2
  69                mov     \rb, #0x80000000        @ physical base address
  70#ifdef CONFIG_DEBUG_LL_SER3
  71                add     \rb, \rb, #0x00050000   @ Ser3
  72#else
  73                add     \rb, \rb, #0x00010000   @ Ser1
  74#endif
  75                .endm
  76#else
  77                .macro  loadsp, rb, tmp1, tmp2
  78                addruart \rb, \tmp1, \tmp2
  79                .endm
  80#endif
  81#endif
  82#endif
  83
  84                .macro  kputc,val
  85                mov     r0, \val
  86                bl      putc
  87                .endm
  88
  89                .macro  kphex,val,len
  90                mov     r0, \val
  91                mov     r1, #\len
  92                bl      phex
  93                .endm
  94
  95                /*
  96                 * Debug kernel copy by printing the memory addresses involved
  97                 */
  98                .macro dbgkc, begin, end, cbegin, cend
  99#ifdef DEBUG
 100                kputc   #'C'
 101                kputc   #':'
 102                kputc   #'0'
 103                kputc   #'x'
 104                kphex   \begin, 8       /* Start of compressed kernel */
 105                kputc   #'-'
 106                kputc   #'0'
 107                kputc   #'x'
 108                kphex   \end, 8         /* End of compressed kernel */
 109                kputc   #'-'
 110                kputc   #'>'
 111                kputc   #'0'
 112                kputc   #'x'
 113                kphex   \cbegin, 8      /* Start of kernel copy */
 114                kputc   #'-'
 115                kputc   #'0'
 116                kputc   #'x'
 117                kphex   \cend, 8        /* End of kernel copy */
 118                kputc   #'\n'
 119#endif
 120                .endm
 121
 122                /*
 123                 * Debug print of the final appended DTB location
 124                 */
 125                .macro dbgadtb, begin, size
 126#ifdef DEBUG
 127                kputc   #'D'
 128                kputc   #'T'
 129                kputc   #'B'
 130                kputc   #':'
 131                kputc   #'0'
 132                kputc   #'x'
 133                kphex   \begin, 8       /* Start of appended DTB */
 134                kputc   #' '
 135                kputc   #'('
 136                kputc   #'0'
 137                kputc   #'x'
 138                kphex   \size, 8        /* Size of appended DTB */
 139                kputc   #')'
 140                kputc   #'\n'
 141#endif
 142                .endm
 143
 144                .macro  enable_cp15_barriers, reg
 145                mrc     p15, 0, \reg, c1, c0, 0 @ read SCTLR
 146                tst     \reg, #(1 << 5)         @ CP15BEN bit set?
 147                bne     .L_\@
 148                orr     \reg, \reg, #(1 << 5)   @ CP15 barrier instructions
 149                mcr     p15, 0, \reg, c1, c0, 0 @ write SCTLR
 150 ARM(           .inst   0xf57ff06f              @ v7+ isb       )
 151 THUMB(         isb                                             )
 152.L_\@:
 153                .endm
 154
 155                /*
 156                 * The kernel build system appends the size of the
 157                 * decompressed kernel at the end of the compressed data
 158                 * in little-endian form.
 159                 */
 160                .macro  get_inflated_image_size, res:req, tmp1:req, tmp2:req
 161                adr     \res, .Linflated_image_size_offset
 162                ldr     \tmp1, [\res]
 163                add     \tmp1, \tmp1, \res      @ address of inflated image size
 164
 165                ldrb    \res, [\tmp1]           @ get_unaligned_le32
 166                ldrb    \tmp2, [\tmp1, #1]
 167                orr     \res, \res, \tmp2, lsl #8
 168                ldrb    \tmp2, [\tmp1, #2]
 169                ldrb    \tmp1, [\tmp1, #3]
 170                orr     \res, \res, \tmp2, lsl #16
 171                orr     \res, \res, \tmp1, lsl #24
 172                .endm
 173
 174                .macro  be32tocpu, val, tmp
 175#ifndef __ARMEB__
 176                /* convert to little endian */
 177                rev_l   \val, \tmp
 178#endif
 179                .endm
 180
 181                .section ".start", "ax"
 182/*
 183 * sort out different calling conventions
 184 */
 185                .align
 186                /*
 187                 * Always enter in ARM state for CPUs that support the ARM ISA.
 188                 * As of today (2014) that's exactly the members of the A and R
 189                 * classes.
 190                 */
 191 AR_CLASS(      .arm    )
 192start:
 193                .type   start,#function
 194                /*
 195                 * These 7 nops along with the 1 nop immediately below for
 196                 * !THUMB2 form 8 nops that make the compressed kernel bootable
 197                 * on legacy ARM systems that were assuming the kernel in a.out
 198                 * binary format. The boot loaders on these systems would
 199                 * jump 32 bytes into the image to skip the a.out header.
 200                 * with these 8 nops filling exactly 32 bytes, things still
 201                 * work as expected on these legacy systems. Thumb2 mode keeps
 202                 * 7 of the nops as it turns out that some boot loaders
 203                 * were patching the initial instructions of the kernel, i.e
 204                 * had started to exploit this "patch area".
 205                 */
 206                .rept   7
 207                __nop
 208                .endr
 209#ifndef CONFIG_THUMB2_KERNEL
 210                __nop
 211#else
 212 AR_CLASS(      sub     pc, pc, #3      )       @ A/R: switch to Thumb2 mode
 213  M_CLASS(      nop.w                   )       @ M: already in Thumb2 mode
 214                .thumb
 215#endif
 216                W(b)    1f
 217
 218                .word   _magic_sig      @ Magic numbers to help the loader
 219                .word   _magic_start    @ absolute load/run zImage address
 220                .word   _magic_end      @ zImage end address
 221                .word   0x04030201      @ endianness flag
 222                .word   0x45454545      @ another magic number to indicate
 223                .word   _magic_table    @ additional data table
 224
 225                __EFI_HEADER
 2261:
 227 ARM_BE8(       setend  be              )       @ go BE8 if compiled for BE8
 228 AR_CLASS(      mrs     r9, cpsr        )
 229#ifdef CONFIG_ARM_VIRT_EXT
 230                bl      __hyp_stub_install      @ get into SVC mode, reversibly
 231#endif
 232                mov     r7, r1                  @ save architecture ID
 233                mov     r8, r2                  @ save atags pointer
 234
 235#ifndef CONFIG_CPU_V7M
 236                /*
 237                 * Booting from Angel - need to enter SVC mode and disable
 238                 * FIQs/IRQs (numeric definitions from angel arm.h source).
 239                 * We only do this if we were in user mode on entry.
 240                 */
 241                mrs     r2, cpsr                @ get current mode
 242                tst     r2, #3                  @ not user?
 243                bne     not_angel
 244                mov     r0, #0x17               @ angel_SWIreason_EnterSVC
 245 ARM(           swi     0x123456        )       @ angel_SWI_ARM
 246 THUMB(         svc     0xab            )       @ angel_SWI_THUMB
 247not_angel:
 248                safe_svcmode_maskall r0
 249                msr     spsr_cxsf, r9           @ Save the CPU boot mode in
 250                                                @ SPSR
 251#endif
 252                /*
 253                 * Note that some cache flushing and other stuff may
 254                 * be needed here - is there an Angel SWI call for this?
 255                 */
 256
 257                /*
 258                 * some architecture specific code can be inserted
 259                 * by the linker here, but it should preserve r7, r8, and r9.
 260                 */
 261
 262                .text
 263
 264#ifdef CONFIG_AUTO_ZRELADDR
 265                /*
 266                 * Find the start of physical memory.  As we are executing
 267                 * without the MMU on, we are in the physical address space.
 268                 * We just need to get rid of any offset by aligning the
 269                 * address.
 270                 *
 271                 * This alignment is a balance between the requirements of
 272                 * different platforms - we have chosen 128MB to allow
 273                 * platforms which align the start of their physical memory
 274                 * to 128MB to use this feature, while allowing the zImage
 275                 * to be placed within the first 128MB of memory on other
 276                 * platforms.  Increasing the alignment means we place
 277                 * stricter alignment requirements on the start of physical
 278                 * memory, but relaxing it means that we break people who
 279                 * are already placing their zImage in (eg) the top 64MB
 280                 * of this range.
 281                 */
 282                mov     r0, pc
 283                and     r0, r0, #0xf8000000
 284#ifdef CONFIG_USE_OF
 285                adr     r1, LC1
 286#ifdef CONFIG_ARM_APPENDED_DTB
 287                /*
 288                 * Look for an appended DTB.  If found, we cannot use it to
 289                 * validate the calculated start of physical memory, as its
 290                 * memory nodes may need to be augmented by ATAGS stored at
 291                 * an offset from the same start of physical memory.
 292                 */
 293                ldr     r2, [r1, #4]    @ get &_edata
 294                add     r2, r2, r1      @ relocate it
 295                ldr     r2, [r2]        @ get DTB signature
 296                ldr     r3, =OF_DT_MAGIC
 297                cmp     r2, r3          @ do we have a DTB there?
 298                beq     1f              @ if yes, skip validation
 299#endif /* CONFIG_ARM_APPENDED_DTB */
 300
 301                /*
 302                 * Make sure we have some stack before calling C code.
 303                 * No GOT fixup has occurred yet, but none of the code we're
 304                 * about to call uses any global variables.
 305                 */
 306                ldr     sp, [r1]        @ get stack location
 307                add     sp, sp, r1      @ apply relocation
 308
 309                /* Validate calculated start against passed DTB */
 310                mov     r1, r8
 311                bl      fdt_check_mem_start
 3121:
 313#endif /* CONFIG_USE_OF */
 314                /* Determine final kernel image address. */
 315                add     r4, r0, #TEXT_OFFSET
 316#else
 317                ldr     r4, =zreladdr
 318#endif
 319
 320                /*
 321                 * Set up a page table only if it won't overwrite ourself.
 322                 * That means r4 < pc || r4 - 16k page directory > &_end.
 323                 * Given that r4 > &_end is most unfrequent, we add a rough
 324                 * additional 1MB of room for a possible appended DTB.
 325                 */
 326                mov     r0, pc
 327                cmp     r0, r4
 328                ldrcc   r0, .Lheadroom
 329                addcc   r0, r0, pc
 330                cmpcc   r4, r0
 331                orrcc   r4, r4, #1              @ remember we skipped cache_on
 332                blcs    cache_on
 333
 334restart:        adr     r0, LC1
 335                ldr     sp, [r0]
 336                ldr     r6, [r0, #4]
 337                add     sp, sp, r0
 338                add     r6, r6, r0
 339
 340                get_inflated_image_size r9, r10, lr
 341
 342#ifndef CONFIG_ZBOOT_ROM
 343                /* malloc space is above the relocated stack (64k max) */
 344                add     r10, sp, #MALLOC_SIZE
 345#else
 346                /*
 347                 * With ZBOOT_ROM the bss/stack is non relocatable,
 348                 * but someone could still run this code from RAM,
 349                 * in which case our reference is _edata.
 350                 */
 351                mov     r10, r6
 352#endif
 353
 354                mov     r5, #0                  @ init dtb size to 0
 355#ifdef CONFIG_ARM_APPENDED_DTB
 356/*
 357 *   r4  = final kernel address (possibly with LSB set)
 358 *   r5  = appended dtb size (still unknown)
 359 *   r6  = _edata
 360 *   r7  = architecture ID
 361 *   r8  = atags/device tree pointer
 362 *   r9  = size of decompressed image
 363 *   r10 = end of this image, including  bss/stack/malloc space if non XIP
 364 *   sp  = stack pointer
 365 *
 366 * if there are device trees (dtb) appended to zImage, advance r10 so that the
 367 * dtb data will get relocated along with the kernel if necessary.
 368 */
 369
 370                ldr     lr, [r6, #0]
 371                ldr     r1, =OF_DT_MAGIC
 372                cmp     lr, r1
 373                bne     dtb_check_done          @ not found
 374
 375#ifdef CONFIG_ARM_ATAG_DTB_COMPAT
 376                /*
 377                 * OK... Let's do some funky business here.
 378                 * If we do have a DTB appended to zImage, and we do have
 379                 * an ATAG list around, we want the later to be translated
 380                 * and folded into the former here. No GOT fixup has occurred
 381                 * yet, but none of the code we're about to call uses any
 382                 * global variable.
 383                */
 384
 385                /* Get the initial DTB size */
 386                ldr     r5, [r6, #4]
 387                be32tocpu r5, r1
 388                dbgadtb r6, r5
 389                /* 50% DTB growth should be good enough */
 390                add     r5, r5, r5, lsr #1
 391                /* preserve 64-bit alignment */
 392                add     r5, r5, #7
 393                bic     r5, r5, #7
 394                /* clamp to 32KB min and 1MB max */
 395                cmp     r5, #(1 << 15)
 396                movlo   r5, #(1 << 15)
 397                cmp     r5, #(1 << 20)
 398                movhi   r5, #(1 << 20)
 399                /* temporarily relocate the stack past the DTB work space */
 400                add     sp, sp, r5
 401
 402                mov     r0, r8
 403                mov     r1, r6
 404                mov     r2, r5
 405                bl      atags_to_fdt
 406
 407                /*
 408                 * If returned value is 1, there is no ATAG at the location
 409                 * pointed by r8.  Try the typical 0x100 offset from start
 410                 * of RAM and hope for the best.
 411                 */
 412                cmp     r0, #1
 413                sub     r0, r4, #TEXT_OFFSET
 414                bic     r0, r0, #1
 415                add     r0, r0, #0x100
 416                mov     r1, r6
 417                mov     r2, r5
 418                bleq    atags_to_fdt
 419
 420                sub     sp, sp, r5
 421#endif
 422
 423                mov     r8, r6                  @ use the appended device tree
 424
 425                /*
 426                 * Make sure that the DTB doesn't end up in the final
 427                 * kernel's .bss area. To do so, we adjust the decompressed
 428                 * kernel size to compensate if that .bss size is larger
 429                 * than the relocated code.
 430                 */
 431                ldr     r5, =_kernel_bss_size
 432                adr     r1, wont_overwrite
 433                sub     r1, r6, r1
 434                subs    r1, r5, r1
 435                addhi   r9, r9, r1
 436
 437                /* Get the current DTB size */
 438                ldr     r5, [r6, #4]
 439                be32tocpu r5, r1
 440
 441                /* preserve 64-bit alignment */
 442                add     r5, r5, #7
 443                bic     r5, r5, #7
 444
 445                /* relocate some pointers past the appended dtb */
 446                add     r6, r6, r5
 447                add     r10, r10, r5
 448                add     sp, sp, r5
 449dtb_check_done:
 450#endif
 451
 452/*
 453 * Check to see if we will overwrite ourselves.
 454 *   r4  = final kernel address (possibly with LSB set)
 455 *   r9  = size of decompressed image
 456 *   r10 = end of this image, including  bss/stack/malloc space if non XIP
 457 * We basically want:
 458 *   r4 - 16k page directory >= r10 -> OK
 459 *   r4 + image length <= address of wont_overwrite -> OK
 460 * Note: the possible LSB in r4 is harmless here.
 461 */
 462                add     r10, r10, #16384
 463                cmp     r4, r10
 464                bhs     wont_overwrite
 465                add     r10, r4, r9
 466                adr     r9, wont_overwrite
 467                cmp     r10, r9
 468                bls     wont_overwrite
 469
 470/*
 471 * Relocate ourselves past the end of the decompressed kernel.
 472 *   r6  = _edata
 473 *   r10 = end of the decompressed kernel
 474 * Because we always copy ahead, we need to do it from the end and go
 475 * backward in case the source and destination overlap.
 476 */
 477                /*
 478                 * Bump to the next 256-byte boundary with the size of
 479                 * the relocation code added. This avoids overwriting
 480                 * ourself when the offset is small.
 481                 */
 482                add     r10, r10, #((reloc_code_end - restart + 256) & ~255)
 483                bic     r10, r10, #255
 484
 485                /* Get start of code we want to copy and align it down. */
 486                adr     r5, restart
 487                bic     r5, r5, #31
 488
 489/* Relocate the hyp vector base if necessary */
 490#ifdef CONFIG_ARM_VIRT_EXT
 491                mrs     r0, spsr
 492                and     r0, r0, #MODE_MASK
 493                cmp     r0, #HYP_MODE
 494                bne     1f
 495
 496                /*
 497                 * Compute the address of the hyp vectors after relocation.
 498                 * Call __hyp_set_vectors with the new address so that we
 499                 * can HVC again after the copy.
 500                 */
 501                adr_l   r0, __hyp_stub_vectors
 502                sub     r0, r0, r5
 503                add     r0, r0, r10
 504                bl      __hyp_set_vectors
 5051:
 506#endif
 507
 508                sub     r9, r6, r5              @ size to copy
 509                add     r9, r9, #31             @ rounded up to a multiple
 510                bic     r9, r9, #31             @ ... of 32 bytes
 511                add     r6, r9, r5
 512                add     r9, r9, r10
 513
 514#ifdef DEBUG
 515                sub     r10, r6, r5
 516                sub     r10, r9, r10
 517                /*
 518                 * We are about to copy the kernel to a new memory area.
 519                 * The boundaries of the new memory area can be found in
 520                 * r10 and r9, whilst r5 and r6 contain the boundaries
 521                 * of the memory we are going to copy.
 522                 * Calling dbgkc will help with the printing of this
 523                 * information.
 524                 */
 525                dbgkc   r5, r6, r10, r9
 526#endif
 527
 5281:              ldmdb   r6!, {r0 - r3, r10 - r12, lr}
 529                cmp     r6, r5
 530                stmdb   r9!, {r0 - r3, r10 - r12, lr}
 531                bhi     1b
 532
 533                /* Preserve offset to relocated code. */
 534                sub     r6, r9, r6
 535
 536                mov     r0, r9                  @ start of relocated zImage
 537                add     r1, sp, r6              @ end of relocated zImage
 538                bl      cache_clean_flush
 539
 540                badr    r0, restart
 541                add     r0, r0, r6
 542                mov     pc, r0
 543
 544wont_overwrite:
 545                adr     r0, LC0
 546                ldmia   r0, {r1, r2, r3, r11, r12}
 547                sub     r0, r0, r1              @ calculate the delta offset
 548
 549/*
 550 * If delta is zero, we are running at the address we were linked at.
 551 *   r0  = delta
 552 *   r2  = BSS start
 553 *   r3  = BSS end
 554 *   r4  = kernel execution address (possibly with LSB set)
 555 *   r5  = appended dtb size (0 if not present)
 556 *   r7  = architecture ID
 557 *   r8  = atags pointer
 558 *   r11 = GOT start
 559 *   r12 = GOT end
 560 *   sp  = stack pointer
 561 */
 562                orrs    r1, r0, r5
 563                beq     not_relocated
 564
 565                add     r11, r11, r0
 566                add     r12, r12, r0
 567
 568#ifndef CONFIG_ZBOOT_ROM
 569                /*
 570                 * If we're running fully PIC === CONFIG_ZBOOT_ROM = n,
 571                 * we need to fix up pointers into the BSS region.
 572                 * Note that the stack pointer has already been fixed up.
 573                 */
 574                add     r2, r2, r0
 575                add     r3, r3, r0
 576
 577                /*
 578                 * Relocate all entries in the GOT table.
 579                 * Bump bss entries to _edata + dtb size
 580                 */
 5811:              ldr     r1, [r11, #0]           @ relocate entries in the GOT
 582                add     r1, r1, r0              @ This fixes up C references
 583                cmp     r1, r2                  @ if entry >= bss_start &&
 584                cmphs   r3, r1                  @       bss_end > entry
 585                addhi   r1, r1, r5              @    entry += dtb size
 586                str     r1, [r11], #4           @ next entry
 587                cmp     r11, r12
 588                blo     1b
 589
 590                /* bump our bss pointers too */
 591                add     r2, r2, r5
 592                add     r3, r3, r5
 593
 594#else
 595
 596                /*
 597                 * Relocate entries in the GOT table.  We only relocate
 598                 * the entries that are outside the (relocated) BSS region.
 599                 */
 6001:              ldr     r1, [r11, #0]           @ relocate entries in the GOT
 601                cmp     r1, r2                  @ entry < bss_start ||
 602                cmphs   r3, r1                  @ _end < entry
 603                addlo   r1, r1, r0              @ table.  This fixes up the
 604                str     r1, [r11], #4           @ C references.
 605                cmp     r11, r12
 606                blo     1b
 607#endif
 608
 609not_relocated:  mov     r0, #0
 6101:              str     r0, [r2], #4            @ clear bss
 611                str     r0, [r2], #4
 612                str     r0, [r2], #4
 613                str     r0, [r2], #4
 614                cmp     r2, r3
 615                blo     1b
 616
 617                /*
 618                 * Did we skip the cache setup earlier?
 619                 * That is indicated by the LSB in r4.
 620                 * Do it now if so.
 621                 */
 622                tst     r4, #1
 623                bic     r4, r4, #1
 624                blne    cache_on
 625
 626/*
 627 * The C runtime environment should now be setup sufficiently.
 628 * Set up some pointers, and start decompressing.
 629 *   r4  = kernel execution address
 630 *   r7  = architecture ID
 631 *   r8  = atags pointer
 632 */
 633                mov     r0, r4
 634                mov     r1, sp                  @ malloc space above stack
 635                add     r2, sp, #MALLOC_SIZE    @ 64k max
 636                mov     r3, r7
 637                bl      decompress_kernel
 638
 639                get_inflated_image_size r1, r2, r3
 640
 641                mov     r0, r4                  @ start of inflated image
 642                add     r1, r1, r0              @ end of inflated image
 643                bl      cache_clean_flush
 644                bl      cache_off
 645
 646#ifdef CONFIG_ARM_VIRT_EXT
 647                mrs     r0, spsr                @ Get saved CPU boot mode
 648                and     r0, r0, #MODE_MASK
 649                cmp     r0, #HYP_MODE           @ if not booted in HYP mode...
 650                bne     __enter_kernel          @ boot kernel directly
 651
 652                adr_l   r0, __hyp_reentry_vectors
 653                bl      __hyp_set_vectors
 654                __HVC(0)                        @ otherwise bounce to hyp mode
 655
 656                b       .                       @ should never be reached
 657#else
 658                b       __enter_kernel
 659#endif
 660
 661                .align  2
 662                .type   LC0, #object
 663LC0:            .word   LC0                     @ r1
 664                .word   __bss_start             @ r2
 665                .word   _end                    @ r3
 666                .word   _got_start              @ r11
 667                .word   _got_end                @ ip
 668                .size   LC0, . - LC0
 669
 670                .type   LC1, #object
 671LC1:            .word   .L_user_stack_end - LC1 @ sp
 672                .word   _edata - LC1            @ r6
 673                .size   LC1, . - LC1
 674
 675.Lheadroom:
 676                .word   _end - restart + 16384 + 1024*1024
 677
 678.Linflated_image_size_offset:
 679                .long   (input_data_end - 4) - .
 680
 681#ifdef CONFIG_ARCH_RPC
 682                .globl  params
 683params:         ldr     r0, =0x10000100         @ params_phys for RPC
 684                mov     pc, lr
 685                .ltorg
 686                .align
 687#endif
 688
 689/*
 690 * dcache_line_size - get the minimum D-cache line size from the CTR register
 691 * on ARMv7.
 692 */
 693                .macro  dcache_line_size, reg, tmp
 694#ifdef CONFIG_CPU_V7M
 695                movw    \tmp, #:lower16:BASEADDR_V7M_SCB + V7M_SCB_CTR
 696                movt    \tmp, #:upper16:BASEADDR_V7M_SCB + V7M_SCB_CTR
 697                ldr     \tmp, [\tmp]
 698#else
 699                mrc     p15, 0, \tmp, c0, c0, 1         @ read ctr
 700#endif
 701                lsr     \tmp, \tmp, #16
 702                and     \tmp, \tmp, #0xf                @ cache line size encoding
 703                mov     \reg, #4                        @ bytes per word
 704                mov     \reg, \reg, lsl \tmp            @ actual cache line size
 705                .endm
 706
 707/*
 708 * Turn on the cache.  We need to setup some page tables so that we
 709 * can have both the I and D caches on.
 710 *
 711 * We place the page tables 16k down from the kernel execution address,
 712 * and we hope that nothing else is using it.  If we're using it, we
 713 * will go pop!
 714 *
 715 * On entry,
 716 *  r4 = kernel execution address
 717 *  r7 = architecture number
 718 *  r8 = atags pointer
 719 * On exit,
 720 *  r0, r1, r2, r3, r9, r10, r12 corrupted
 721 * This routine must preserve:
 722 *  r4, r7, r8
 723 */
 724                .align  5
 725cache_on:       mov     r3, #8                  @ cache_on function
 726                b       call_cache_fn
 727
 728/*
 729 * Initialize the highest priority protection region, PR7
 730 * to cover all 32bit address and cacheable and bufferable.
 731 */
 732__armv4_mpu_cache_on:
 733                mov     r0, #0x3f               @ 4G, the whole
 734                mcr     p15, 0, r0, c6, c7, 0   @ PR7 Area Setting
 735                mcr     p15, 0, r0, c6, c7, 1
 736
 737                mov     r0, #0x80               @ PR7
 738                mcr     p15, 0, r0, c2, c0, 0   @ D-cache on
 739                mcr     p15, 0, r0, c2, c0, 1   @ I-cache on
 740                mcr     p15, 0, r0, c3, c0, 0   @ write-buffer on
 741
 742                mov     r0, #0xc000
 743                mcr     p15, 0, r0, c5, c0, 1   @ I-access permission
 744                mcr     p15, 0, r0, c5, c0, 0   @ D-access permission
 745
 746                mov     r0, #0
 747                mcr     p15, 0, r0, c7, c10, 4  @ drain write buffer
 748                mcr     p15, 0, r0, c7, c5, 0   @ flush(inval) I-Cache
 749                mcr     p15, 0, r0, c7, c6, 0   @ flush(inval) D-Cache
 750                mrc     p15, 0, r0, c1, c0, 0   @ read control reg
 751                                                @ ...I .... ..D. WC.M
 752                orr     r0, r0, #0x002d         @ .... .... ..1. 11.1
 753                orr     r0, r0, #0x1000         @ ...1 .... .... ....
 754
 755                mcr     p15, 0, r0, c1, c0, 0   @ write control reg
 756
 757                mov     r0, #0
 758                mcr     p15, 0, r0, c7, c5, 0   @ flush(inval) I-Cache
 759                mcr     p15, 0, r0, c7, c6, 0   @ flush(inval) D-Cache
 760                mov     pc, lr
 761
 762__armv3_mpu_cache_on:
 763                mov     r0, #0x3f               @ 4G, the whole
 764                mcr     p15, 0, r0, c6, c7, 0   @ PR7 Area Setting
 765
 766                mov     r0, #0x80               @ PR7
 767                mcr     p15, 0, r0, c2, c0, 0   @ cache on
 768                mcr     p15, 0, r0, c3, c0, 0   @ write-buffer on
 769
 770                mov     r0, #0xc000
 771                mcr     p15, 0, r0, c5, c0, 0   @ access permission
 772
 773                mov     r0, #0
 774                mcr     p15, 0, r0, c7, c0, 0   @ invalidate whole cache v3
 775                /*
 776                 * ?? ARMv3 MMU does not allow reading the control register,
 777                 * does this really work on ARMv3 MPU?
 778                 */
 779                mrc     p15, 0, r0, c1, c0, 0   @ read control reg
 780                                                @ .... .... .... WC.M
 781                orr     r0, r0, #0x000d         @ .... .... .... 11.1
 782                /* ?? this overwrites the value constructed above? */
 783                mov     r0, #0
 784                mcr     p15, 0, r0, c1, c0, 0   @ write control reg
 785
 786                /* ?? invalidate for the second time? */
 787                mcr     p15, 0, r0, c7, c0, 0   @ invalidate whole cache v3
 788                mov     pc, lr
 789
 790#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
 791#define CB_BITS 0x08
 792#else
 793#define CB_BITS 0x0c
 794#endif
 795
 796__setup_mmu:    sub     r3, r4, #16384          @ Page directory size
 797                bic     r3, r3, #0xff           @ Align the pointer
 798                bic     r3, r3, #0x3f00
 799/*
 800 * Initialise the page tables, turning on the cacheable and bufferable
 801 * bits for the RAM area only.
 802 */
 803                mov     r0, r3
 804                mov     r9, r0, lsr #18
 805                mov     r9, r9, lsl #18         @ start of RAM
 806                add     r10, r9, #0x10000000    @ a reasonable RAM size
 807                mov     r1, #0x12               @ XN|U + section mapping
 808                orr     r1, r1, #3 << 10        @ AP=11
 809                add     r2, r3, #16384
 8101:              cmp     r1, r9                  @ if virt > start of RAM
 811                cmphs   r10, r1                 @   && end of RAM > virt
 812                bic     r1, r1, #0x1c           @ clear XN|U + C + B
 813                orrlo   r1, r1, #0x10           @ Set XN|U for non-RAM
 814                orrhs   r1, r1, r6              @ set RAM section settings
 815                str     r1, [r0], #4            @ 1:1 mapping
 816                add     r1, r1, #1048576
 817                teq     r0, r2
 818                bne     1b
 819/*
 820 * If ever we are running from Flash, then we surely want the cache
 821 * to be enabled also for our execution instance...  We map 2MB of it
 822 * so there is no map overlap problem for up to 1 MB compressed kernel.
 823 * If the execution is in RAM then we would only be duplicating the above.
 824 */
 825                orr     r1, r6, #0x04           @ ensure B is set for this
 826                orr     r1, r1, #3 << 10
 827                mov     r2, pc
 828                mov     r2, r2, lsr #20
 829                orr     r1, r1, r2, lsl #20
 830                add     r0, r3, r2, lsl #2
 831                str     r1, [r0], #4
 832                add     r1, r1, #1048576
 833                str     r1, [r0]
 834                mov     pc, lr
 835ENDPROC(__setup_mmu)
 836
 837@ Enable unaligned access on v6, to allow better code generation
 838@ for the decompressor C code:
 839__armv6_mmu_cache_on:
 840                mrc     p15, 0, r0, c1, c0, 0   @ read SCTLR
 841                bic     r0, r0, #2              @ A (no unaligned access fault)
 842                orr     r0, r0, #1 << 22        @ U (v6 unaligned access model)
 843                mcr     p15, 0, r0, c1, c0, 0   @ write SCTLR
 844                b       __armv4_mmu_cache_on
 845
 846__arm926ejs_mmu_cache_on:
 847#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
 848                mov     r0, #4                  @ put dcache in WT mode
 849                mcr     p15, 7, r0, c15, c0, 0
 850#endif
 851
 852__armv4_mmu_cache_on:
 853                mov     r12, lr
 854#ifdef CONFIG_MMU
 855                mov     r6, #CB_BITS | 0x12     @ U
 856                bl      __setup_mmu
 857                mov     r0, #0
 858                mcr     p15, 0, r0, c7, c10, 4  @ drain write buffer
 859                mcr     p15, 0, r0, c8, c7, 0   @ flush I,D TLBs
 860                mrc     p15, 0, r0, c1, c0, 0   @ read control reg
 861                orr     r0, r0, #0x5000         @ I-cache enable, RR cache replacement
 862                orr     r0, r0, #0x0030
 863 ARM_BE8(       orr     r0, r0, #1 << 25 )      @ big-endian page tables
 864                bl      __common_mmu_cache_on
 865                mov     r0, #0
 866                mcr     p15, 0, r0, c8, c7, 0   @ flush I,D TLBs
 867#endif
 868                mov     pc, r12
 869
 870__armv7_mmu_cache_on:
 871                enable_cp15_barriers    r11
 872                mov     r12, lr
 873#ifdef CONFIG_MMU
 874                mrc     p15, 0, r11, c0, c1, 4  @ read ID_MMFR0
 875                tst     r11, #0xf               @ VMSA
 876                movne   r6, #CB_BITS | 0x02     @ !XN
 877                blne    __setup_mmu
 878                mov     r0, #0
 879                mcr     p15, 0, r0, c7, c10, 4  @ drain write buffer
 880                tst     r11, #0xf               @ VMSA
 881                mcrne   p15, 0, r0, c8, c7, 0   @ flush I,D TLBs
 882#endif
 883                mrc     p15, 0, r0, c1, c0, 0   @ read control reg
 884                bic     r0, r0, #1 << 28        @ clear SCTLR.TRE
 885                orr     r0, r0, #0x5000         @ I-cache enable, RR cache replacement
 886                orr     r0, r0, #0x003c         @ write buffer
 887                bic     r0, r0, #2              @ A (no unaligned access fault)
 888                orr     r0, r0, #1 << 22        @ U (v6 unaligned access model)
 889                                                @ (needed for ARM1176)
 890#ifdef CONFIG_MMU
 891 ARM_BE8(       orr     r0, r0, #1 << 25 )      @ big-endian page tables
 892                mrcne   p15, 0, r6, c2, c0, 2   @ read ttb control reg
 893                orrne   r0, r0, #1              @ MMU enabled
 894                movne   r1, #0xfffffffd         @ domain 0 = client
 895                bic     r6, r6, #1 << 31        @ 32-bit translation system
 896                bic     r6, r6, #(7 << 0) | (1 << 4)    @ use only ttbr0
 897                mcrne   p15, 0, r3, c2, c0, 0   @ load page table pointer
 898                mcrne   p15, 0, r1, c3, c0, 0   @ load domain access control
 899                mcrne   p15, 0, r6, c2, c0, 2   @ load ttb control
 900#endif
 901                mcr     p15, 0, r0, c7, c5, 4   @ ISB
 902                mcr     p15, 0, r0, c1, c0, 0   @ load control register
 903                mrc     p15, 0, r0, c1, c0, 0   @ and read it back
 904                mov     r0, #0
 905                mcr     p15, 0, r0, c7, c5, 4   @ ISB
 906                mov     pc, r12
 907
 908__fa526_cache_on:
 909                mov     r12, lr
 910                mov     r6, #CB_BITS | 0x12     @ U
 911                bl      __setup_mmu
 912                mov     r0, #0
 913                mcr     p15, 0, r0, c7, c7, 0   @ Invalidate whole cache
 914                mcr     p15, 0, r0, c7, c10, 4  @ drain write buffer
 915                mcr     p15, 0, r0, c8, c7, 0   @ flush UTLB
 916                mrc     p15, 0, r0, c1, c0, 0   @ read control reg
 917                orr     r0, r0, #0x1000         @ I-cache enable
 918                bl      __common_mmu_cache_on
 919                mov     r0, #0
 920                mcr     p15, 0, r0, c8, c7, 0   @ flush UTLB
 921                mov     pc, r12
 922
 923__common_mmu_cache_on:
 924#ifndef CONFIG_THUMB2_KERNEL
 925#ifndef DEBUG
 926                orr     r0, r0, #0x000d         @ Write buffer, mmu
 927#endif
 928                mov     r1, #-1
 929                mcr     p15, 0, r3, c2, c0, 0   @ load page table pointer
 930                mcr     p15, 0, r1, c3, c0, 0   @ load domain access control
 931                b       1f
 932                .align  5                       @ cache line aligned
 9331:              mcr     p15, 0, r0, c1, c0, 0   @ load control register
 934                mrc     p15, 0, r0, c1, c0, 0   @ and read it back to
 935                sub     pc, lr, r0, lsr #32     @ properly flush pipeline
 936#endif
 937
 938#define PROC_ENTRY_SIZE (4*5)
 939
 940/*
 941 * Here follow the relocatable cache support functions for the
 942 * various processors.  This is a generic hook for locating an
 943 * entry and jumping to an instruction at the specified offset
 944 * from the start of the block.  Please note this is all position
 945 * independent code.
 946 *
 947 *  r1  = corrupted
 948 *  r2  = corrupted
 949 *  r3  = block offset
 950 *  r9  = corrupted
 951 *  r12 = corrupted
 952 */
 953
 954call_cache_fn:  adr     r12, proc_types
 955#ifdef CONFIG_CPU_CP15
 956                mrc     p15, 0, r9, c0, c0      @ get processor ID
 957#elif defined(CONFIG_CPU_V7M)
 958                /*
 959                 * On v7-M the processor id is located in the V7M_SCB_CPUID
 960                 * register, but as cache handling is IMPLEMENTATION DEFINED on
 961                 * v7-M (if existant at all) we just return early here.
 962                 * If V7M_SCB_CPUID were used the cpu ID functions (i.e.
 963                 * __armv7_mmu_cache_{on,off,flush}) would be selected which
 964                 * use cp15 registers that are not implemented on v7-M.
 965                 */
 966                bx      lr
 967#else
 968                ldr     r9, =CONFIG_PROCESSOR_ID
 969#endif
 9701:              ldr     r1, [r12, #0]           @ get value
 971                ldr     r2, [r12, #4]           @ get mask
 972                eor     r1, r1, r9              @ (real ^ match)
 973                tst     r1, r2                  @       & mask
 974 ARM(           addeq   pc, r12, r3             ) @ call cache function
 975 THUMB(         addeq   r12, r3                 )
 976 THUMB(         moveq   pc, r12                 ) @ call cache function
 977                add     r12, r12, #PROC_ENTRY_SIZE
 978                b       1b
 979
 980/*
 981 * Table for cache operations.  This is basically:
 982 *   - CPU ID match
 983 *   - CPU ID mask
 984 *   - 'cache on' method instruction
 985 *   - 'cache off' method instruction
 986 *   - 'cache flush' method instruction
 987 *
 988 * We match an entry using: ((real_id ^ match) & mask) == 0
 989 *
 990 * Writethrough caches generally only need 'on' and 'off'
 991 * methods.  Writeback caches _must_ have the flush method
 992 * defined.
 993 */
 994                .align  2
 995                .type   proc_types,#object
 996proc_types:
 997                .word   0x41000000              @ old ARM ID
 998                .word   0xff00f000
 999                mov     pc, lr
1000 THUMB(         nop                             )
1001                mov     pc, lr
1002 THUMB(         nop                             )
1003                mov     pc, lr
1004 THUMB(         nop                             )
1005
1006                .word   0x41007000              @ ARM7/710
1007                .word   0xfff8fe00
1008                mov     pc, lr
1009 THUMB(         nop                             )
1010                mov     pc, lr
1011 THUMB(         nop                             )
1012                mov     pc, lr
1013 THUMB(         nop                             )
1014
1015                .word   0x41807200              @ ARM720T (writethrough)
1016                .word   0xffffff00
1017                W(b)    __armv4_mmu_cache_on
1018                W(b)    __armv4_mmu_cache_off
1019                mov     pc, lr
1020 THUMB(         nop                             )
1021
1022                .word   0x41007400              @ ARM74x
1023                .word   0xff00ff00
1024                W(b)    __armv3_mpu_cache_on
1025                W(b)    __armv3_mpu_cache_off
1026                W(b)    __armv3_mpu_cache_flush
1027                
1028                .word   0x41009400              @ ARM94x
1029                .word   0xff00ff00
1030                W(b)    __armv4_mpu_cache_on
1031                W(b)    __armv4_mpu_cache_off
1032                W(b)    __armv4_mpu_cache_flush
1033
1034                .word   0x41069260              @ ARM926EJ-S (v5TEJ)
1035                .word   0xff0ffff0
1036                W(b)    __arm926ejs_mmu_cache_on
1037                W(b)    __armv4_mmu_cache_off
1038                W(b)    __armv5tej_mmu_cache_flush
1039
1040                .word   0x00007000              @ ARM7 IDs
1041                .word   0x0000f000
1042                mov     pc, lr
1043 THUMB(         nop                             )
1044                mov     pc, lr
1045 THUMB(         nop                             )
1046                mov     pc, lr
1047 THUMB(         nop                             )
1048
1049                @ Everything from here on will be the new ID system.
1050
1051                .word   0x4401a100              @ sa110 / sa1100
1052                .word   0xffffffe0
1053                W(b)    __armv4_mmu_cache_on
1054                W(b)    __armv4_mmu_cache_off
1055                W(b)    __armv4_mmu_cache_flush
1056
1057                .word   0x6901b110              @ sa1110
1058                .word   0xfffffff0
1059                W(b)    __armv4_mmu_cache_on
1060                W(b)    __armv4_mmu_cache_off
1061                W(b)    __armv4_mmu_cache_flush
1062
1063                .word   0x56056900
1064                .word   0xffffff00              @ PXA9xx
1065                W(b)    __armv4_mmu_cache_on
1066                W(b)    __armv4_mmu_cache_off
1067                W(b)    __armv4_mmu_cache_flush
1068
1069                .word   0x56158000              @ PXA168
1070                .word   0xfffff000
1071                W(b)    __armv4_mmu_cache_on
1072                W(b)    __armv4_mmu_cache_off
1073                W(b)    __armv5tej_mmu_cache_flush
1074
1075                .word   0x56050000              @ Feroceon
1076                .word   0xff0f0000
1077                W(b)    __armv4_mmu_cache_on
1078                W(b)    __armv4_mmu_cache_off
1079                W(b)    __armv5tej_mmu_cache_flush
1080
1081#ifdef CONFIG_CPU_FEROCEON_OLD_ID
1082                /* this conflicts with the standard ARMv5TE entry */
1083                .long   0x41009260              @ Old Feroceon
1084                .long   0xff00fff0
1085                b       __armv4_mmu_cache_on
1086                b       __armv4_mmu_cache_off
1087                b       __armv5tej_mmu_cache_flush
1088#endif
1089
1090                .word   0x66015261              @ FA526
1091                .word   0xff01fff1
1092                W(b)    __fa526_cache_on
1093                W(b)    __armv4_mmu_cache_off
1094                W(b)    __fa526_cache_flush
1095
1096                @ These match on the architecture ID
1097
1098                .word   0x00020000              @ ARMv4T
1099                .word   0x000f0000
1100                W(b)    __armv4_mmu_cache_on
1101                W(b)    __armv4_mmu_cache_off
1102                W(b)    __armv4_mmu_cache_flush
1103
1104                .word   0x00050000              @ ARMv5TE
1105                .word   0x000f0000
1106                W(b)    __armv4_mmu_cache_on
1107                W(b)    __armv4_mmu_cache_off
1108                W(b)    __armv4_mmu_cache_flush
1109
1110                .word   0x00060000              @ ARMv5TEJ
1111                .word   0x000f0000
1112                W(b)    __armv4_mmu_cache_on
1113                W(b)    __armv4_mmu_cache_off
1114                W(b)    __armv5tej_mmu_cache_flush
1115
1116                .word   0x0007b000              @ ARMv6
1117                .word   0x000ff000
1118                W(b)    __armv6_mmu_cache_on
1119                W(b)    __armv4_mmu_cache_off
1120                W(b)    __armv6_mmu_cache_flush
1121
1122                .word   0x000f0000              @ new CPU Id
1123                .word   0x000f0000
1124                W(b)    __armv7_mmu_cache_on
1125                W(b)    __armv7_mmu_cache_off
1126                W(b)    __armv7_mmu_cache_flush
1127
1128                .word   0                       @ unrecognised type
1129                .word   0
1130                mov     pc, lr
1131 THUMB(         nop                             )
1132                mov     pc, lr
1133 THUMB(         nop                             )
1134                mov     pc, lr
1135 THUMB(         nop                             )
1136
1137                .size   proc_types, . - proc_types
1138
1139                /*
1140                 * If you get a "non-constant expression in ".if" statement"
1141                 * error from the assembler on this line, check that you have
1142                 * not accidentally written a "b" instruction where you should
1143                 * have written W(b).
1144                 */
1145                .if (. - proc_types) % PROC_ENTRY_SIZE != 0
1146                .error "The size of one or more proc_types entries is wrong."
1147                .endif
1148
1149/*
1150 * Turn off the Cache and MMU.  ARMv3 does not support
1151 * reading the control register, but ARMv4 does.
1152 *
1153 * On exit,
1154 *  r0, r1, r2, r3, r9, r12 corrupted
1155 * This routine must preserve:
1156 *  r4, r7, r8
1157 */
1158                .align  5
1159cache_off:      mov     r3, #12                 @ cache_off function
1160                b       call_cache_fn
1161
1162__armv4_mpu_cache_off:
1163                mrc     p15, 0, r0, c1, c0
1164                bic     r0, r0, #0x000d
1165                mcr     p15, 0, r0, c1, c0      @ turn MPU and cache off
1166                mov     r0, #0
1167                mcr     p15, 0, r0, c7, c10, 4  @ drain write buffer
1168                mcr     p15, 0, r0, c7, c6, 0   @ flush D-Cache
1169                mcr     p15, 0, r0, c7, c5, 0   @ flush I-Cache
1170                mov     pc, lr
1171
1172__armv3_mpu_cache_off:
1173                mrc     p15, 0, r0, c1, c0
1174                bic     r0, r0, #0x000d
1175                mcr     p15, 0, r0, c1, c0, 0   @ turn MPU and cache off
1176                mov     r0, #0
1177                mcr     p15, 0, r0, c7, c0, 0   @ invalidate whole cache v3
1178                mov     pc, lr
1179
1180__armv4_mmu_cache_off:
1181#ifdef CONFIG_MMU
1182                mrc     p15, 0, r0, c1, c0
1183                bic     r0, r0, #0x000d
1184                mcr     p15, 0, r0, c1, c0      @ turn MMU and cache off
1185                mov     r0, #0
1186                mcr     p15, 0, r0, c7, c7      @ invalidate whole cache v4
1187                mcr     p15, 0, r0, c8, c7      @ invalidate whole TLB v4
1188#endif
1189                mov     pc, lr
1190
1191__armv7_mmu_cache_off:
1192                mrc     p15, 0, r0, c1, c0
1193#ifdef CONFIG_MMU
1194                bic     r0, r0, #0x0005
1195#else
1196                bic     r0, r0, #0x0004
1197#endif
1198                mcr     p15, 0, r0, c1, c0      @ turn MMU and cache off
1199                mov     r0, #0
1200#ifdef CONFIG_MMU
1201                mcr     p15, 0, r0, c8, c7, 0   @ invalidate whole TLB
1202#endif
1203                mcr     p15, 0, r0, c7, c5, 6   @ invalidate BTC
1204                mcr     p15, 0, r0, c7, c10, 4  @ DSB
1205                mcr     p15, 0, r0, c7, c5, 4   @ ISB
1206                mov     pc, lr
1207
1208/*
1209 * Clean and flush the cache to maintain consistency.
1210 *
1211 * On entry,
1212 *  r0 = start address
1213 *  r1 = end address (exclusive)
1214 * On exit,
1215 *  r1, r2, r3, r9, r10, r11, r12 corrupted
1216 * This routine must preserve:
1217 *  r4, r6, r7, r8
1218 */
1219                .align  5
1220cache_clean_flush:
1221                mov     r3, #16
1222                mov     r11, r1
1223                b       call_cache_fn
1224
1225__armv4_mpu_cache_flush:
1226                tst     r4, #1
1227                movne   pc, lr
1228                mov     r2, #1
1229                mov     r3, #0
1230                mcr     p15, 0, ip, c7, c6, 0   @ invalidate D cache
1231                mov     r1, #7 << 5             @ 8 segments
12321:              orr     r3, r1, #63 << 26       @ 64 entries
12332:              mcr     p15, 0, r3, c7, c14, 2  @ clean & invalidate D index
1234                subs    r3, r3, #1 << 26
1235                bcs     2b                      @ entries 63 to 0
1236                subs    r1, r1, #1 << 5
1237                bcs     1b                      @ segments 7 to 0
1238
1239                teq     r2, #0
1240                mcrne   p15, 0, ip, c7, c5, 0   @ invalidate I cache
1241                mcr     p15, 0, ip, c7, c10, 4  @ drain WB
1242                mov     pc, lr
1243                
1244__fa526_cache_flush:
1245                tst     r4, #1
1246                movne   pc, lr
1247                mov     r1, #0
1248                mcr     p15, 0, r1, c7, c14, 0  @ clean and invalidate D cache
1249                mcr     p15, 0, r1, c7, c5, 0   @ flush I cache
1250                mcr     p15, 0, r1, c7, c10, 4  @ drain WB
1251                mov     pc, lr
1252
1253__armv6_mmu_cache_flush:
1254                mov     r1, #0
1255                tst     r4, #1
1256                mcreq   p15, 0, r1, c7, c14, 0  @ clean+invalidate D
1257                mcr     p15, 0, r1, c7, c5, 0   @ invalidate I+BTB
1258                mcreq   p15, 0, r1, c7, c15, 0  @ clean+invalidate unified
1259                mcr     p15, 0, r1, c7, c10, 4  @ drain WB
1260                mov     pc, lr
1261
1262__armv7_mmu_cache_flush:
1263                enable_cp15_barriers    r10
1264                tst     r4, #1
1265                bne     iflush
1266                mrc     p15, 0, r10, c0, c1, 5  @ read ID_MMFR1
1267                tst     r10, #0xf << 16         @ hierarchical cache (ARMv7)
1268                mov     r10, #0
1269                beq     hierarchical
1270                mcr     p15, 0, r10, c7, c14, 0 @ clean+invalidate D
1271                b       iflush
1272hierarchical:
1273                dcache_line_size r1, r2         @ r1 := dcache min line size
1274                sub     r2, r1, #1              @ r2 := line size mask
1275                bic     r0, r0, r2              @ round down start to line size
1276                sub     r11, r11, #1            @ end address is exclusive
1277                bic     r11, r11, r2            @ round down end to line size
12780:              cmp     r0, r11                 @ finished?
1279                bgt     iflush
1280                mcr     p15, 0, r0, c7, c14, 1  @ Dcache clean/invalidate by VA
1281                add     r0, r0, r1
1282                b       0b
1283iflush:
1284                mcr     p15, 0, r10, c7, c10, 4 @ DSB
1285                mcr     p15, 0, r10, c7, c5, 0  @ invalidate I+BTB
1286                mcr     p15, 0, r10, c7, c10, 4 @ DSB
1287                mcr     p15, 0, r10, c7, c5, 4  @ ISB
1288                mov     pc, lr
1289
1290__armv5tej_mmu_cache_flush:
1291                tst     r4, #1
1292                movne   pc, lr
12931:              mrc     p15, 0, APSR_nzcv, c7, c14, 3   @ test,clean,invalidate D cache
1294                bne     1b
1295                mcr     p15, 0, r0, c7, c5, 0   @ flush I cache
1296                mcr     p15, 0, r0, c7, c10, 4  @ drain WB
1297                mov     pc, lr
1298
1299__armv4_mmu_cache_flush:
1300                tst     r4, #1
1301                movne   pc, lr
1302                mov     r2, #64*1024            @ default: 32K dcache size (*2)
1303                mov     r11, #32                @ default: 32 byte line size
1304                mrc     p15, 0, r3, c0, c0, 1   @ read cache type
1305                teq     r3, r9                  @ cache ID register present?
1306                beq     no_cache_id
1307                mov     r1, r3, lsr #18
1308                and     r1, r1, #7
1309                mov     r2, #1024
1310                mov     r2, r2, lsl r1          @ base dcache size *2
1311                tst     r3, #1 << 14            @ test M bit
1312                addne   r2, r2, r2, lsr #1      @ +1/2 size if M == 1
1313                mov     r3, r3, lsr #12
1314                and     r3, r3, #3
1315                mov     r11, #8
1316                mov     r11, r11, lsl r3        @ cache line size in bytes
1317no_cache_id:
1318                mov     r1, pc
1319                bic     r1, r1, #63             @ align to longest cache line
1320                add     r2, r1, r2
13211:
1322 ARM(           ldr     r3, [r1], r11           ) @ s/w flush D cache
1323 THUMB(         ldr     r3, [r1]                ) @ s/w flush D cache
1324 THUMB(         add     r1, r1, r11             )
1325                teq     r1, r2
1326                bne     1b
1327
1328                mcr     p15, 0, r1, c7, c5, 0   @ flush I cache
1329                mcr     p15, 0, r1, c7, c6, 0   @ flush D cache
1330                mcr     p15, 0, r1, c7, c10, 4  @ drain WB
1331                mov     pc, lr
1332
1333__armv3_mmu_cache_flush:
1334__armv3_mpu_cache_flush:
1335                tst     r4, #1
1336                movne   pc, lr
1337                mov     r1, #0
1338                mcr     p15, 0, r1, c7, c0, 0   @ invalidate whole cache v3
1339                mov     pc, lr
1340
1341/*
1342 * Various debugging routines for printing hex characters and
1343 * memory, which again must be relocatable.
1344 */
1345#ifdef DEBUG
1346                .align  2
1347                .type   phexbuf,#object
1348phexbuf:        .space  12
1349                .size   phexbuf, . - phexbuf
1350
1351@ phex corrupts {r0, r1, r2, r3}
1352phex:           adr     r3, phexbuf
1353                mov     r2, #0
1354                strb    r2, [r3, r1]
13551:              subs    r1, r1, #1
1356                movmi   r0, r3
1357                bmi     puts
1358                and     r2, r0, #15
1359                mov     r0, r0, lsr #4
1360                cmp     r2, #10
1361                addge   r2, r2, #7
1362                add     r2, r2, #'0'
1363                strb    r2, [r3, r1]
1364                b       1b
1365
1366@ puts corrupts {r0, r1, r2, r3}
1367puts:           loadsp  r3, r2, r1
13681:              ldrb    r2, [r0], #1
1369                teq     r2, #0
1370                moveq   pc, lr
13712:              writeb  r2, r3, r1
1372                mov     r1, #0x00020000
13733:              subs    r1, r1, #1
1374                bne     3b
1375                teq     r2, #'\n'
1376                moveq   r2, #'\r'
1377                beq     2b
1378                teq     r0, #0
1379                bne     1b
1380                mov     pc, lr
1381@ putc corrupts {r0, r1, r2, r3}
1382putc:
1383                mov     r2, r0
1384                loadsp  r3, r1, r0
1385                mov     r0, #0
1386                b       2b
1387
1388@ memdump corrupts {r0, r1, r2, r3, r10, r11, r12, lr}
1389memdump:        mov     r12, r0
1390                mov     r10, lr
1391                mov     r11, #0
13922:              mov     r0, r11, lsl #2
1393                add     r0, r0, r12
1394                mov     r1, #8
1395                bl      phex
1396                mov     r0, #':'
1397                bl      putc
13981:              mov     r0, #' '
1399                bl      putc
1400                ldr     r0, [r12, r11, lsl #2]
1401                mov     r1, #8
1402                bl      phex
1403                and     r0, r11, #7
1404                teq     r0, #3
1405                moveq   r0, #' '
1406                bleq    putc
1407                and     r0, r11, #7
1408                add     r11, r11, #1
1409                teq     r0, #7
1410                bne     1b
1411                mov     r0, #'\n'
1412                bl      putc
1413                cmp     r11, #64
1414                blt     2b
1415                mov     pc, r10
1416#endif
1417
1418                .ltorg
1419
1420#ifdef CONFIG_ARM_VIRT_EXT
1421.align 5
1422__hyp_reentry_vectors:
1423                W(b)    .                       @ reset
1424                W(b)    .                       @ undef
1425#ifdef CONFIG_EFI_STUB
1426                W(b)    __enter_kernel_from_hyp @ hvc from HYP
1427#else
1428                W(b)    .                       @ svc
1429#endif
1430                W(b)    .                       @ pabort
1431                W(b)    .                       @ dabort
1432                W(b)    __enter_kernel          @ hyp
1433                W(b)    .                       @ irq
1434                W(b)    .                       @ fiq
1435#endif /* CONFIG_ARM_VIRT_EXT */
1436
1437__enter_kernel:
1438                mov     r0, #0                  @ must be 0
1439                mov     r1, r7                  @ restore architecture number
1440                mov     r2, r8                  @ restore atags pointer
1441 ARM(           mov     pc, r4          )       @ call kernel
1442 M_CLASS(       add     r4, r4, #1      )       @ enter in Thumb mode for M class
1443 THUMB(         bx      r4              )       @ entry point is always ARM for A/R classes
1444
1445reloc_code_end:
1446
1447#ifdef CONFIG_EFI_STUB
1448__enter_kernel_from_hyp:
1449                mrc     p15, 4, r0, c1, c0, 0   @ read HSCTLR
1450                bic     r0, r0, #0x5            @ disable MMU and caches
1451                mcr     p15, 4, r0, c1, c0, 0   @ write HSCTLR
1452                isb
1453                b       __enter_kernel
1454
1455ENTRY(efi_enter_kernel)
1456                mov     r4, r0                  @ preserve image base
1457                mov     r8, r1                  @ preserve DT pointer
1458
1459                adr_l   r0, call_cache_fn
1460                adr     r1, 0f                  @ clean the region of code we
1461                bl      cache_clean_flush       @ may run with the MMU off
1462
1463#ifdef CONFIG_ARM_VIRT_EXT
1464                @
1465                @ The EFI spec does not support booting on ARM in HYP mode,
1466                @ since it mandates that the MMU and caches are on, with all
1467                @ 32-bit addressable DRAM mapped 1:1 using short descriptors.
1468                @
1469                @ While the EDK2 reference implementation adheres to this,
1470                @ U-Boot might decide to enter the EFI stub in HYP mode
1471                @ anyway, with the MMU and caches either on or off.
1472                @
1473                mrs     r0, cpsr                @ get the current mode
1474                msr     spsr_cxsf, r0           @ record boot mode
1475                and     r0, r0, #MODE_MASK      @ are we running in HYP mode?
1476                cmp     r0, #HYP_MODE
1477                bne     .Lefi_svc
1478
1479                mrc     p15, 4, r1, c1, c0, 0   @ read HSCTLR
1480                tst     r1, #0x1                @ MMU enabled at HYP?
1481                beq     1f
1482
1483                @
1484                @ When running in HYP mode with the caches on, we're better
1485                @ off just carrying on using the cached 1:1 mapping that the
1486                @ firmware provided. Set up the HYP vectors so HVC instructions
1487                @ issued from HYP mode take us to the correct handler code. We
1488                @ will disable the MMU before jumping to the kernel proper.
1489                @
1490 ARM(           bic     r1, r1, #(1 << 30)      ) @ clear HSCTLR.TE
1491 THUMB(         orr     r1, r1, #(1 << 30)      ) @ set HSCTLR.TE
1492                mcr     p15, 4, r1, c1, c0, 0
1493                adr     r0, __hyp_reentry_vectors
1494                mcr     p15, 4, r0, c12, c0, 0  @ set HYP vector base (HVBAR)
1495                isb
1496                b       .Lefi_hyp
1497
1498                @
1499                @ When running in HYP mode with the caches off, we need to drop
1500                @ into SVC mode now, and let the decompressor set up its cached
1501                @ 1:1 mapping as usual.
1502                @
15031:              mov     r9, r4                  @ preserve image base
1504                bl      __hyp_stub_install      @ install HYP stub vectors
1505                safe_svcmode_maskall    r1      @ drop to SVC mode
1506                msr     spsr_cxsf, r0           @ record boot mode
1507                orr     r4, r9, #1              @ restore image base and set LSB
1508                b       .Lefi_hyp
1509.Lefi_svc:
1510#endif
1511                mrc     p15, 0, r0, c1, c0, 0   @ read SCTLR
1512                tst     r0, #0x1                @ MMU enabled?
1513                orreq   r4, r4, #1              @ set LSB if not
1514
1515.Lefi_hyp:
1516                mov     r0, r8                  @ DT start
1517                add     r1, r8, r2              @ DT end
1518                bl      cache_clean_flush
1519
1520                adr     r0, 0f                  @ switch to our stack
1521                ldr     sp, [r0]
1522                add     sp, sp, r0
1523
1524                mov     r5, #0                  @ appended DTB size
1525                mov     r7, #0xFFFFFFFF         @ machine ID
1526                b       wont_overwrite
1527ENDPROC(efi_enter_kernel)
15280:              .long   .L_user_stack_end - .
1529#endif
1530
1531                .align
1532                .section ".stack", "aw", %nobits
1533.L_user_stack:  .space  4096
1534.L_user_stack_end:
1535