1. 31 5月, 2007 1 次提交
  2. 29 5月, 2007 3 次提交
  3. 16 5月, 2007 1 次提交
    • D
      [SPARC64]: Add hypervisor API negotiation and fix console bugs. · c7754d46
      David S. Miller 提交于
      Hypervisor interfaces need to be negotiated in order to use
      some API calls reliably.  So add a small set of interfaces
      to request API versions and query current settings.
      
      This allows us to fix some bugs in the hypervisor console:
      
      1) If we can negotiate API group CORE of at least major 1
         minor 1 we can use con_read and con_write which can improve
         console performance quite a bit.
      
      2) When we do a console write request, we should hold the
         spinlock around the whole request, not a byte at a time.
         What would happen is that it's easy for output from
         different cpus to get mixed with each other.
      
      3) Use consistent udelay() based polling, udelay(1) each
         loop with a limit of 1000 polls to handle stuck hypervisor
         console.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c7754d46
  4. 10 12月, 2006 1 次提交
  5. 06 11月, 2006 1 次提交
    • D
      [SPARC]: Fix robust futex syscalls and wire up migrate_pages. · 59359ff8
      David S. Miller 提交于
      When I added the entries for the robust futex syscall entries, I
      forgot to bump NR_SYSCALLS.  The current situation is error-prone
      because NR_SYSCALLS lives in entry.S where the system call limit
      checks are enforced.  Move the definition to asm/unistd.h in order to
      make this mistake much more difficult to make.
      
      And wire up sys_migrate_pages since the powerpc folks implemented the
      compat wrapper for us.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      59359ff8
  6. 01 7月, 2006 1 次提交
  7. 20 6月, 2006 2 次提交
    • D
      [SPARC64]: Move over to GENERIC_HARDIRQS. · e18e2a00
      David S. Miller 提交于
      This is the long overdue conversion of sparc64 over to
      the generic IRQ layer.
      
      The kernel image is slightly larger, but the BSS is ~60K
      smaller due to the reduced size of struct ino_bucket.
      
      A lot of IRQ implementation details, including ino_bucket,
      were moved out of asm-sparc64/irq.h and are now private to
      arch/sparc64/kernel/irq.c, and most of the code in irq.c
      totally disappeared.
      
      One thing that's different at the moment is IRQ distribution,
      we do it at enable_irq() time.  If the cpu mask is ALL then
      we round-robin using a global rotating cpu counter, else
      we pick the first cpu in the mask to support single cpu
      targetting.  This is similar to what powerpc's XICS IRQ
      support code does.
      
      This works fine on my UP SB1000, and the SMP build goes
      fine and runs on that machine, but lots of testing on
      different setups is needed.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e18e2a00
    • D
      [SPARC64]: Send all device interrupts via one PIL. · fd0504c3
      David S. Miller 提交于
      This is the first in a series of cleanups that will hopefully
      allow a seamless attempt at using the generic IRQ handling
      infrastructure in the Linux kernel.
      
      Define PIL_DEVICE_IRQ and vector all device interrupts through
      there.
      
      Get rid of the ugly pil0_dummy_{bucket,desc}, instead vector
      the timer interrupt directly to a specific handler since the
      timer interrupt is the only event that will be signaled on
      PIL 14.
      
      The irq_worklist is now in the per-cpu trap_block[].
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      fd0504c3
  8. 20 3月, 2006 13 次提交
    • D
      [SPARC64]: Fix bugs in SUN4V cpu mondo dispatch. · b830ab66
      David S. Miller 提交于
      There were several bugs in the SUN4V cpu mondo dispatch code.
      
      In fact, if we ever got a EWOULDBLOCK or other error from
      the hypervisor call, we'd potentially send a cpu mondo multiple
      times to the same cpu and even worse we could loop until the
      timeout resending the same mondo over and over to such cpus.
      
      So let's bulletproof this thing as follows:
      
      1) Implement cpu_mondo_send() and cpu_state() hypervisor calls
         in arch/sparc64/kernel/entry.S, add prototypes to asm/hypervisor.h
      
      2) Don't build and update the cpulist using inline functions, this
         was causing the cpu mask to not get updated in the caller.
      
      3) Disable interrupts during the entire mondo send, otherwise our
         cpu list and/or mondo block could get overwritten if we take
         an interrupt and do a cpu mondo send on the current cpu.
      
      4) Check for all possible error return types from the cpu_mondo_send()
         hypervisor call.  In particular:
      
         HV_EOK) Our work is done, all cpus have received the mondo.
         HV_CPUERROR) One or more of the cpus in the cpu list we passed
                      to the hypervisor are in error state.  Use cpu_state()
                      calls over the entries in the cpu list to see which
      		ones.  Record them in "error_mask" and report this
      		after we are done sending the mondo to cpus which are
      		not in error state.
         HV_EWOULDBLOCK) We need to keep trying.
      
         Any other error we consider fatal, we report the event and exit
         immediately.
      
      5) We only timeout if forward progress is not made.  Forward progress
         is defined as having at least one cpu get the mondo successfully
         in a given cpu_mondo_send() call.  Otherwise we bump a counter
         and delay a little.  If the counter hits a limit, we signal an
         error and report the event.
      
      Also, smp_call_function_mask() error handling reports the number
      of cpus incorrectly.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b830ab66
    • D
      [SPARC64]: Add sun4v_cpu_yield(). · 6f5374c9
      David S. Miller 提交于
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      6f5374c9
    • D
      [SPARC64]: Fix uniprocessor IRQ targetting on SUN4V. · ebd8c56c
      David S. Miller 提交于
      We need to use the real hardware processor ID when
      targetting interrupts, not the "define to 0" thing
      the uniprocessor build gives us.
      
      Also, fill in the Node-ID and Agent-ID fields properly
      on sun4u/Safari.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ebd8c56c
    • D
      [SPARC64]: Add sun4v_cpu_qconf() hypervisor call. · 94f8762d
      David S. Miller 提交于
      Call it from register_one_mondo().
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      94f8762d
    • D
    • D
    • D
      [SPARC64]: Move devino_to_sysino out of pci_sun4v_asm.S · 85dfa19b
      David S. Miller 提交于
      It is not PCI specific, it is for all system interrupts.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      85dfa19b
    • D
      [SPARC64]: Patch up mmu context register writes for sun4v. · 8b11bd12
      David S. Miller 提交于
      sun4v uses ASI_MMU instead of ASI_DMMU
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8b11bd12
    • D
      [SPARC64]: Add explicit register args to trap state loading macros. · ffe483d5
      David S. Miller 提交于
      This, as well as making the code cleaner, allows a simplification in
      the TSB miss handling path.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ffe483d5
    • D
      [SPARC64]: Refine code sequences to get the cpu id. · 92704a1c
      David S. Miller 提交于
      On uniprocessor, it's always zero for optimize that.
      
      On SMP, the jmpl to the stub kills the return address stack in the cpu
      branch prediction logic, so expand the code sequence inline and use a
      code patching section to fix things up.  This also always better and
      explicit register selection, which will be taken advantage of in a
      future changeset.
      
      The hard_smp_processor_id() function is big, so do not inline it.
      
      Fix up tests for Jalapeno to also test for Serrano chips too.  These
      tests want "jbus Ultra-IIIi" cases to match, so that is what we should
      test for.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      92704a1c
    • D
      [SPARC64]: Kill hard-coded %pstate setting in sparc_exit. · 764afe2e
      David S. Miller 提交于
      Just flip the bit off of whatever it's currently set to.
      PSTATE_IE is guarenteed to be enabled when we get here.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      764afe2e
    • D
      [SPARC64]: Kill {save,restore}_alternate_globals() · 96c6e0d8
      David S. Miller 提交于
      No longer needed now that we no longer have hard-coded
      alternate global register usage.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      96c6e0d8
    • D
      [SPARC64]: Elminate all usage of hard-coded trap globals. · 56fb4df6
      David S. Miller 提交于
      UltraSPARC has special sets of global registers which are switched to
      for certain trap types.  There is one set for MMU related traps, one
      set of Interrupt Vector processing, and another set (called the
      Alternate globals) for all other trap types.
      
      For what seems like forever we've hard coded the values in some of
      these trap registers.  Some examples include:
      
      1) Interrupt Vector global %g6 holds current processors interrupt
         work struct where received interrupts are managed for IRQ handler
         dispatch.
      
      2) MMU global %g7 holds the base of the page tables of the currently
         active address space.
      
      3) Alternate global %g6 held the current_thread_info() value.
      
      Such hardcoding has resulted in some serious issues in many areas.
      There are some code sequences where having another register available
      would help clean up the implementation.  Taking traps such as
      cross-calls from the OBP firmware requires some trick code sequences
      wherein we have to save away and restore all of the special sets of
      global registers when we enter/exit OBP.
      
      We were also using the IMMU TSB register on SMP to hold the per-cpu
      area base address, which doesn't work any longer now that we actually
      use the TSB facility of the cpu.
      
      The implementation is pretty straight forward.  One tricky bit is
      getting the current processor ID as that is different on different cpu
      variants.  We use a stub with a fancy calling convention which we
      patch at boot time.  The calling convention is that the stub is
      branched to and the (PC - 4) to return to is in register %g1.  The cpu
      number is left in %g6.  This stub can be invoked by using the
      __GET_CPUID macro.
      
      We use an array of per-cpu trap state to store the current thread and
      physical address of the current address space's page tables.  The
      TRAP_LOAD_THREAD_REG loads %g6 with the current thread from this
      table, it uses __GET_CPUID and also clobbers %g1.
      
      TRAP_LOAD_IRQ_WORK is used by the interrupt vector processing to load
      the current processor's IRQ software state into %g6.  It also uses
      __GET_CPUID and clobbers %g1.
      
      Finally, TRAP_LOAD_PGD_PHYS loads the physical address base of the
      current address space's page tables into %g7, it clobbers %g1 and uses
      __GET_CPUID.
      
      Many refinements are possible, as well as some tuning, with this stuff
      in place.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      56fb4df6
  9. 08 2月, 2006 1 次提交
  10. 23 1月, 2006 1 次提交
  11. 19 1月, 2006 1 次提交
  12. 10 1月, 2006 1 次提交
    • R
      [SPARC64]: Fix ptrace/strace · 695ca07b
      Richard Mortimer 提交于
      Don't clobber register %l0 while checking TI_SYS_NOERROR value in
      syscall return path.  This bug was introduced by:
      
      db7d9a4e
      
      Problem narrowed down by Luis F. Ortiz and Richard Mortimer.
      
      I tried using %l2 as suggested by Luis and that works for me.
      
      Looking at the code I wonder if it makes sense to simplify the code
      a little bit. The following works for me but I'm not sure how to
      exercise the "NOERROR" codepath.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      695ca07b
  13. 08 10月, 2005 1 次提交
  14. 05 10月, 2005 1 次提交
  15. 26 9月, 2005 1 次提交
    • D
      [SPARC64]: Probe D/I/E-cache config and use. · 80dc0d6b
      David S. Miller 提交于
      At boot time, determine the D-cache, I-cache and E-cache size and
      line-size.  Use them in cache flushes when appropriate.
      
      This change was motivated by discovering that the D-cache on
      UltraSparc-IIIi and later are 64K not 32K, and the flushes done by the
      Cheetah error handlers were assuming a 32K size.
      
      There are still some pieces of code that are hard coding things and
      will need to be fixed up at some point.
      
      While we're here, fix the D-cache and I-cache parity error handlers
      to run with interrupts disabled, and when the trap occurs at trap
      level > 1 log the event via a counter displayed in /proc/cpuinfo.
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      80dc0d6b
  16. 22 9月, 2005 1 次提交
  17. 21 9月, 2005 1 次提交
  18. 31 8月, 2005 1 次提交
  19. 30 8月, 2005 3 次提交
  20. 25 7月, 2005 1 次提交
  21. 11 7月, 2005 3 次提交