#include <p32xxxx.h>
#ifdef __LIBBUILD__
   .file 1 "general-exception.S"
   .loc 1 0
#endif
  ###################
  # Default general exception handler
  ###################
  .section .text.general_exception,"ax",@progbits
  .set noreorder
  .set noat
  .globl _general_exception_context
  .ent _general_exception_context

_general_exception_context:

  # Save off the non-callee saved registers that may get mucked with
  addiu sp, sp, -80
  sw $1,  0(sp)
  sw v0,  4(sp)
  sw v1,  8(sp)
  sw a0, 12(sp)
  sw a1, 16(sp)
  sw a2, 20(sp)
  sw a3, 24(sp)
  sw t0, 28(sp)
  sw t1, 32(sp)
  sw t2, 36(sp)
  sw t3, 40(sp)
  sw t4, 44(sp)
  sw t5, 48(sp)
  sw t6, 52(sp)
  sw t7, 56(sp)
  sw t8, 60(sp)
  sw t9, 64(sp)
  sw ra, 68(sp)
  mflo t0
  sw t0, 72(sp)
  mfhi t0
  sw t0, 80(sp)

  # Pass Cause and Status to the handler function
  mfc0 a0, _CP0_CAUSE
  mfc0 a1, _CP0_STATUS
  jal _general_exception_handler
  nop

  lw t0, 80(sp)
  mthi t0
  lw t0, 72(sp)
  mtlo t0

  lw $1,  0(sp)
  lw v0,  4(sp)
  lw v1,  8(sp)
  lw a0, 12(sp)
  lw a1, 16(sp)
  lw a2, 20(sp)
  lw a3, 24(sp)
  lw t0, 28(sp)
  lw t1, 32(sp)
  lw t2, 36(sp)
  lw t3, 40(sp)
  lw t4, 44(sp)
  lw t5, 48(sp)
  lw t6, 52(sp)
  lw t7, 56(sp)
  lw t8, 60(sp)
  lw t9, 64(sp)
  lw ra, 68(sp)
  addiu sp, sp, 80

  ehb  # do we need this? Execution hazard barriers?
  eret

  .end _general_exception_context

