Changeset 8e0eb63 in mainline for arch/amd64/src


Ignore:
Timestamp:
2006-03-15T18:01:43Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
9e1c942
Parents:
2f7342d
Message:

Hopefully final version of interrupt handlers for amd64 and ia32.
amd64 has been especially tricky to debug.
Error code detection is now done in compile time.

Location:
arch/amd64/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/src/asm_utils.S

    r2f7342d r8e0eb63  
    2727#
    2828
     29#define IREGISTER_SPACE 120
     30
     31#define IOFFSET_RAX 0x0
     32#define IOFFSET_RBX 0x8
     33#define IOFFSET_RCX 0x10
     34#define IOFFSET_RDX 0x18
     35#define IOFFSET_RSI 0x20
     36#define IOFFSET_RDI 0x28
     37#define IOFFSET_R8 0x30
     38#define IOFFSET_R9 0x38
     39#define IOFFSET_R10 0x40
     40#define IOFFSET_R11 0x48
     41#define IOFFSET_R12 0x50
     42#define IOFFSET_R13 0x58
     43#define IOFFSET_R14 0x60
     44#define IOFFSET_R15 0x68
     45#define IOFFSET_RBP 0x70
    2946
    3047#  Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error word
    3148# and 1 means interrupt with error word
    32 
    33        
    3449#define ERROR_WORD_INTERRUPT_LIST 0x00027D00
    3550
    3651#include <arch/pm.h>
    37 #include <arch/context_offset.h>
    3852#include <arch/mm/page.h>
    3953       
     
    142156        movq IOFFSET_R15(%rsp), %r15
    143157.endm
    144        
     158
    145159## Declare interrupt handlers
    146160#
     
    148162# vectors starting at vector i.
    149163#
    150 # The handlers setup data segment registers
    151 # and call exc_dispatch().
     164# The handlers call exc_dispatch().
    152165#
    153166.macro handler i n
    154         subq $IREGISTER_SPACE, %rsp
     167
     168        /*
     169         * Choose between version with error code and version without error code.
     170         * Both versions have to be of the same size. amd64 assembly is, however,
     171         * a little bit tricky. For instance, subq $0x80, %rsp and subq $0x78, %rsp
     172         * can result in two instructions with different op-code lengths.
     173         * Therefore, pay special attention to the extra NOP's that serve as
     174         * a necessary fill.
     175         */
     176
     177        .iflt \i-32
     178                .if (1 << \i) & ERROR_WORD_INTERRUPT_LIST
     179                        /*
     180                         * Version with error word.
     181                         */
     182                        subq $IREGISTER_SPACE, %rsp
     183                        nop
     184                        nop
     185                        nop
     186                .else
     187                        /*
     188                         * Version without error word,
     189                         */
     190                        subq $(IREGISTER_SPACE+8), %rsp
     191                .endif
     192        .else
     193                /*
     194                 * Version without error word,
     195                 */
     196                subq $(IREGISTER_SPACE+8), %rsp
     197        .endif 
     198
    155199        save_all_gpr
    156200
    157         movq $(\i),%rdi   # %rdi - first parameter
    158         movq %rsp, %rsi   # %rsi - pointer to interrupt_context
    159         call exc_dispatch       # exc_dispatch(i, stack)
    160 
    161 # Test if this is interrupt with error word or not
    162         mov $\i,%cl;
    163         movl $1,%eax;
    164         test $0xe0,%cl;
    165         jnz 0f;
    166         and $0x1f,%cl;
    167         shl %cl,%eax;
    168         and $ERROR_WORD_INTERRUPT_LIST,%eax;
    169         jz 0f;
    170 
    171 
    172 # Return with error word
     201        movq $(\i), %rdi        # %rdi - first parameter
     202        movq %rsp, %rsi         # %rsi - pointer to istate
     203        call exc_dispatch       # exc_dispatch(i, istate)
     204       
    173205        restore_all_gpr
    174206        # $8 = Skip error word
    175         addq $IREGISTER_SPACE + 0x8, %rsp
    176         iretq
    177 
    178 0:
    179 # Return with no error word
    180         restore_all_gpr
    181         addq $IREGISTER_SPACE, %rsp
     207        addq $(IREGISTER_SPACE+8), %rsp
    182208        iretq
    183209
  • arch/amd64/src/interrupt.c

    r2f7342d r8e0eb63  
    4848        __u64 *x = &istate->stack[0];
    4949
    50         if (!(symbol=get_symtab_entry(x[1])))
     50        if (!(symbol=get_symtab_entry(istate->rip)))
    5151                symbol = "";
    5252
    53         printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n,__FUNCTION__);
    54         printf("%%rip: %Q (%s)\n",istate->stack[1],symbol);
    55         printf("ERROR_WORD=%Q\n", istate->stack[0]);
    56         printf("%%rcs=%Q,flags=%Q, %%cr0=%Q\n", istate->stack[2],
    57                istate->stack[3],read_cr0());
     53        printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n, __FUNCTION__);
     54        printf("%%rip: %Q (%s)\n",istate->rip, symbol);
     55        printf("ERROR_WORD=%Q\n", istate->error_word);
     56        printf("%%rcs=%Q, flags=%Q, %%cr0=%Q\n", istate->cs, istate->rflags,read_cr0());
    5857        printf("%%rax=%Q, %%rbx=%Q, %%rcx=%Q\n",istate->rax,istate->rbx,istate->rcx);
    5958        printf("%%rdx=%Q, %%rsi=%Q, %%rdi=%Q\n",istate->rdx,istate->rsi,istate->rdi);
     
    7877void null_interrupt(int n, istate_t *istate)
    7978{
    80         printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n",n,__FUNCTION__); \
    81         printf("stack: %X, %X, %X, %X\n", istate->stack[0], istate->stack[1],
    82                istate->stack[2], istate->stack[3]);
     79        print_info_errcode(n, istate);
    8380        panic("unserviced interrupt\n");
    8481}
Note: See TracChangeset for help on using the changeset viewer.