Skip to content
Snippets Groups Projects
  1. Jan 30, 2013
    • Gabor Juhos's avatar
      MIPS: simplify relocated _G_O_T_ address calculation · 025f2b33
      Gabor Juhos authored
      
      The difference between the address of the original
      and the relocated _GLOBAL_OFFSET_TABLE_ is always
      the same as the relocation offset.
      
      The relocation offset is already computed and it is
      available in the 's1/t6' register. Use that to adjust
      the relocated _G_O_T_ address, instead of calculating
      the offset again from the _gp value.
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      Cc: Xiangfu Liu <xiangfu@openmobilefree.net>
      025f2b33
  2. Jan 27, 2013
    • Gabor Juhos's avatar
      MIPS: start.S: don't save flush_cache parameters in advance · 67d80c9f
      Gabor Juhos authored
      
      Saving the parameters in advance unnecessarily complicates
      the code. The destination address is already saved in the
      's2' register, and that register is not clobbered by the
      copy loop. The size of the copied data can be computed
      after the copy loop is done.
      
      Change the code to compute the size parameter right
      before calling flush_cache, and set the destination
      address parameter in the delay slot of the actuall
      call.
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      67d80c9f
    • Gabor Juhos's avatar
      MIPS: start.S: simplify relocation offset calculation · 248fe03f
      Gabor Juhos authored
      
      The current code uses four instructions and a
      temporary register to calculate the relocation
      offset and to adjust the gp register.
      
      The relocation offset can be calculated directly
      from the CONFIG_SYS_MONITOR_BASE constant and from
      the destination address. The resulting offset can
      be used to adjust the gp pointer.
      
      This approach makes the code a bit simpler because
      it needs two instructions only.
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      248fe03f
    • Gabor Juhos's avatar
      MIPS: start.S: save reused arguments earlier in relocate_code · b2fe86f8
      Gabor Juhos authored
      
      Save the reused parameters at the beginning
      of the 'relocate_code' function. This makes
      the function a bit more readable.
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      b2fe86f8
    • Gabor Juhos's avatar
      MIPS: start.S: set sp register directly · f321b0f9
      Gabor Juhos authored
      
      The current code uses two instructions to load
      the stack pointer into the 'sp' register.
      
      This results in the following assembly code:
      
          468:   3c088040        lui     t0,0x8040
          46c:   251d0000        addiu   sp,t0,0
      
      The first instuction loads the stack pointer into
      the 't0' register then the value of the 'sp' register
      is computed by adding zero to the value of the 't0'
      register. The same issue present on the 64-bit version
      as well:
      
          56c:   3c0c8040        lui     t0,0x8040
          570:   659d0000        daddiu  sp,t0,0
      
      Change the code to load the stack pointer directly
      into the 'sp' register. The generated code is functionally
      equivalent to the previous version but it is simpler.
      
        32-bit:
          468:   3c1d8040        lui     sp,0x8040
      
        64-bit:
          56c:   3c1d8040        lui     sp,0x8040
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      f321b0f9
    • Gabor Juhos's avatar
      MIPS: start.S: fix boundary check in relocate_code · 5b7dd816
      Gabor Juhos authored
      
      The loop code copies more data with one than
      necessary due to the 'ble' instuction. Use the
      'blt' instruction instead to fix that.
      
      Due to the lack of suitable hardware the Xburst
      specific code is compile tested only. However the
      change is quite obvious.
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      5b7dd816
  3. Jan 22, 2013
    • Gabor Juhos's avatar
      MIPS: start{, 64}.S: fill branch delay slots with NOP instructions · 14fdd1a8
      Gabor Juhos authored
      
      The romReserved and romExcHandle handlers are
      accessed by a branch instruction however the
      delay slots of those instructions are not filled.
      
      Because the start.S uses the 'noreorder' directive,
      the assembler will not fill the delay slots either,
      and leads to the following assembly code:
      
        0000056c <romReserved>:
         56c:   1000ffff        b       56c <romReserved>
      
        00000570 <romExcHandle>:
         570:   1000ffff        b       570 <romExcHandle>
      
      In the resulting code, the second branch instruction
      is placed into the delay slot of the first branch
      instruction, which is not allowed on the MIPS
      architecture.
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      14fdd1a8
    • Gabor Juhos's avatar
      MIPS: convert IO port accessor functions to 'static inline' · 0ef48d4c
      Gabor Juhos authored
      
      The currently used 'extern inline' directive causes
      the following compiler warnings if CONFIG_SWAP_IO_SPACE
      is defined:
      
        <...>/include/asm/io.h:345:1: warning: '__fswab32' is static but used in inline function '__outlc_p' which is not static [enabled by default]
        <...>/include/asm/io.h:345:1: warning: '__fswab32' is static but used in inline function '__outl_p' which is not static [enabled by default]
        <...>/include/asm/io.h:345:1: warning: '__fswab32' is static but used in inline function '__outlc' which is not static [enabled by default]
        <...>/include/asm/io.h:345:1: warning: '__fswab32' is static but used in inline function '__outl' which is not static [enabled by default]
        <...>/include/asm/io.h:344:1: warning: '__fswab16' is static but used in inline function '__outwc_p' which is not static [enabled by default]
        <...>/include/asm/io.h:344:1: warning: '__fswab16' is static but used in inline function '__outw_p' which is not static [enabled by default]
        <...>/include/asm/io.h:344:1: warning: '__fswab16' is static but used in inline function '__outwc' which is not static [enabled by default]
        <...>/include/asm/io.h:344:1: warning: '__fswab16' is static but used in inline function '__outw' which is not static [enabled by default]
        <...>/include/asm/io.h:341:1: warning: '__fswab32' is static but used in inline function '__inlc_p' which is not static [enabled by default]
        <...>/include/asm/io.h:341:1: warning: '__fswab32' is static but used in inline function '__inl_p' which is not static [enabled by default]
        <...>/include/asm/io.h:341:1: warning: '__fswab32' is static but used in inline function '__inlc' which is not static [enabled by default]
        <...>/include/asm/io.h:341:1: warning: '__fswab32' is static but used in inline function '__inl' which is not static [enabled by default]
        <...>/include/asm/io.h:340:1: warning: '__fswab16' is static but used in inline function '__inwc_p' which is not static [enabled by default]
        <...>/include/asm/io.h:340:1: warning: '__fswab16' is static but used in inline function '__inw_p' which is not static [enabled by default]
        <...>/include/asm/io.h:340:1: warning: '__fswab16' is static but used in inline function '__inwc' which is not static [enabled by default]
        <...>/include/asm/io.h:340:1: warning: '__fswab16' is static but used in inline function '__inw' which is not static [enabled by default]
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      0ef48d4c
    • Gabor Juhos's avatar
      MIPS: use inline directive for __in*s functions · be002d00
      Gabor Juhos authored
      
      All other IO accessor functions are using the
      'inline' directive. Use that also for the __in*s
      to make it consistent with the other variants.
      
      Signed-off-by: default avatarGabor Juhos <juhosg@openwrt.org>
      Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
      be002d00
  4. Jan 16, 2013
  5. Jan 15, 2013
  6. Jan 14, 2013
  7. Jan 13, 2013
Loading