Merge branch 'header-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6.git] / arch / xtensa / kernel / head.S
index 6e9b522..67e6913 100644 (file)
  * Kevin Chea
  */
 
-#include <xtensa/cacheasm.h>
-#include <linux/config.h>
 #include <asm/processor.h>
 #include <asm/page.h>
+#include <asm/cacheasm.h>
+
+#include <linux/linkage.h>
 
 /*
  * This module contains the entry code for kernel images. It performs the
  *
  */
 
-       .macro  iterate from, to , cmd
-               .ifeq   ((\to - \from) & ~0xfff)
-                       \cmd    \from
-                       iterate "(\from+1)", \to, \cmd
-               .endif
-       .endm
-
 /*
  *  _start
  *
@@ -65,7 +59,7 @@ _startup:
 
        /* Disable interrupts and exceptions. */
 
-       movi    a0, XCHAL_PS_EXCM_MASK
+       movi    a0, LOCKLEVEL
        wsr     a0, PS
 
        /* Preserve the pointer to the boot parameter list in EXCSAVE_1 */
@@ -92,11 +86,11 @@ _startup:
        movi    a1, 15
        wsr     a0, ICOUNTLEVEL
 
-       .macro reset_dbreak num
-       wsr     a0, DBREAKC + \num
-       .endm
-
-        iterate 0, XCHAL_NUM_IBREAK-1, reset_dbreak
+       .set    _index, 0
+       .rept   XCHAL_NUM_DBREAK - 1
+       wsr     a0, DBREAKC + _index
+       .set    _index, _index + 1
+       .endr
 #endif
 
        /* Clear CCOUNT (not really necessary, but nice) */
@@ -111,10 +105,11 @@ _startup:
 
        /* Disable all timers. */
 
-       .macro  reset_timer     num
-       wsr     a0, CCOMPARE_0 + \num
-       .endm
-       iterate 0, XCHAL_NUM_TIMERS-1, reset_timer
+       .set    _index, 0
+       .rept   XCHAL_NUM_TIMERS - 1
+       wsr     a0, CCOMPARE + _index
+       .set    _index, _index + 1
+       .endr
 
        /* Interrupt initialization. */
 
@@ -140,12 +135,21 @@ _startup:
        rsync
 
        /*  Initialize the caches.
-        *  Does not include flushing writeback d-cache.
-        *  a6, a7 are just working registers (clobbered).
+        *  a2, a3 are just working registers (clobbered).
         */
 
-       icache_reset  a2, a3
-       dcache_reset  a2, a3
+#if XCHAL_DCACHE_LINE_LOCKABLE
+       ___unlock_dcache_all a2 a3
+#endif
+
+#if XCHAL_ICACHE_LINE_LOCKABLE
+       ___unlock_icache_all a2 a3
+#endif
+
+       ___invalidate_dcache_all a2 a3
+       ___invalidate_icache_all a2 a3
+
+       isync
 
        /* Unpack data sections
         *
@@ -182,9 +186,9 @@ _startup:
        movi    a2, _bss_start  # start of BSS
        movi    a3, _bss_end    # end of BSS
 
-1:     addi    a2, a2, 4
+       __loopt a2, a3, a4, 2
        s32i    a0, a2, 0
-       blt     a2, a3, 1b
+       __endla a2, a4, 4
 
 #if XCHAL_DCACHE_IS_WRITEBACK
 
@@ -192,7 +196,7 @@ _startup:
         * instructions/data are available.
         */
 
-       dcache_writeback_all    a2, a3
+       ___flush_dcache_all a2 a3
 #endif
 
        /* Setup stack and enable window exceptions (keep irqs disabled) */
@@ -225,13 +229,14 @@ _startup:
 should_never_return:
        j       should_never_return
 
-       /* Define some common data structures here.  We define them
-        * here in this assembly file due to their unusual alignment
-        * requirements.
-        */
 
-       .comm   swapper_pg_dir,PAGE_SIZE,PAGE_SIZE
-       .comm   empty_bad_page_table,PAGE_SIZE,PAGE_SIZE
-       .comm   empty_bad_page,PAGE_SIZE,PAGE_SIZE
-       .comm   empty_zero_page,PAGE_SIZE,PAGE_SIZE
+/*
+ * BSS section
+ */
+       
+.section ".bss.page_aligned", "w"
+ENTRY(swapper_pg_dir)
+       .fill   PAGE_SIZE, 1, 0
+ENTRY(empty_zero_page)
+       .fill   PAGE_SIZE, 1, 0