Changeset 7cb53f62 in mainline for arch/sparc64/src/trap


Ignore:
Timestamp:
2006-02-26T12:02:25Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4767721
Parents:
7a255e69
Message:

sparc64 work.
Switch console to framebuffer (needs proper detection and initialization).
No native keyboard support, so far.
Memory management trap handler fixes.
Do not use OpenFirmware trap table anymore.

Location:
arch/sparc64/src/trap
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/src/trap/exception.c

    r7a255e69 r7cb53f62  
    2828
    2929#include <arch/trap/exception.h>
     30#include <arch/asm.h>
    3031#include <debug.h>
    3132
     
    4142        panic("Memory Address Not Aligned\n");
    4243}
     44
     45/** Handle mem_address_not_aligned. */
     46void do_illegal_instruction(void)
     47{
     48        panic("Illegal Instruction: %P\n", tpc_read());
     49}
  • arch/sparc64/src/trap/trap.c

    r7a255e69 r7cb53f62  
    4343void trap_init(void)
    4444{
    45         /*
    46          * Save kernel provided trap handlers.
    47          */
    48         memcpy((void *) trap_table_save, (void *) trap_table, TRAP_TABLE_SIZE);
    49 
    50         /*
    51          * Copy OFW's trap table into kernel.
    52          */
    53         memcpy((void *) trap_table, (void *) tba_read(), TRAP_TABLE_SIZE);
    54        
    55         /*
    56          * Install kernel-provided handlers.
    57          */
    58         trap_install_handler(TT_INSTRUCTION_ACCESS_EXCEPTION, TRAP_TABLE_ENTRY_SIZE, false);
    59         trap_install_handler(TT_CLEAN_WINDOW, CLEAN_WINDOW_HANDLER_SIZE, false);
    60         trap_install_handler(TT_MEM_ADDRESS_NOT_ALIGNED, TRAP_TABLE_ENTRY_SIZE, false);
    61         trap_install_handler(TT_SPILL_0_NORMAL, SPILL_HANDLER_SIZE, false);
    62         trap_install_handler(TT_FILL_0_NORMAL, FILL_HANDLER_SIZE, false);
    63         trap_install_handler(TT_INSTRUCTION_ACCESS_EXCEPTION, TRAP_TABLE_ENTRY_SIZE, true);
    64         trap_install_handler(TT_CLEAN_WINDOW, CLEAN_WINDOW_HANDLER_SIZE, true);
    65         trap_install_handler(TT_MEM_ADDRESS_NOT_ALIGNED, TRAP_TABLE_ENTRY_SIZE, true);
    66         trap_install_handler(TT_SPILL_0_NORMAL, SPILL_HANDLER_SIZE, true);
    67         trap_install_handler(TT_FILL_0_NORMAL, FILL_HANDLER_SIZE, true);
    68         trap_install_handler(TT_INTERRUPT_LEVEL_1, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    69         trap_install_handler(TT_INTERRUPT_LEVEL_2, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    70         trap_install_handler(TT_INTERRUPT_LEVEL_3, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    71         trap_install_handler(TT_INTERRUPT_LEVEL_4, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    72         trap_install_handler(TT_INTERRUPT_LEVEL_5, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    73         trap_install_handler(TT_INTERRUPT_LEVEL_6, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    74         trap_install_handler(TT_INTERRUPT_LEVEL_7, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    75         trap_install_handler(TT_INTERRUPT_LEVEL_8, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    76         trap_install_handler(TT_INTERRUPT_LEVEL_9, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    77         trap_install_handler(TT_INTERRUPT_LEVEL_10, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    78         trap_install_handler(TT_INTERRUPT_LEVEL_11, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    79         trap_install_handler(TT_INTERRUPT_LEVEL_12, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    80         trap_install_handler(TT_INTERRUPT_LEVEL_13, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    81         trap_install_handler(TT_INTERRUPT_LEVEL_14, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    82         trap_install_handler(TT_INTERRUPT_LEVEL_15, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    83         trap_install_handler(TT_INTERRUPT_VECTOR_TRAP, INTERRUPT_VECTOR_TRAP_HANDLER_SIZE, false);
    84 
    85         /*
    86          * Kernel must become independent on Open Firmware calls before MMU handlers are enabled.
    87          */
    88 /*
    89         trap_install_handler(TT_FAST_INSTRUCTION_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, false);
    90         trap_install_handler(TT_FAST_DATA_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, false);
    91         trap_install_handler(TT_FAST_DATA_ACCESS_PROTECTION, FAST_MMU_HANDLER_SIZE, false);
    92         trap_install_handler(TT_FAST_INSTRUCTION_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, true);
    93         trap_install_handler(TT_FAST_DATA_ACCESS_MMU_MISS, FAST_MMU_HANDLER_SIZE, true);
    94         trap_install_handler(TT_FAST_DATA_ACCESS_PROTECTION, FAST_MMU_HANDLER_SIZE, true);
    95 */
    96 
    9745}
    98 
    99 /** Copy trap handler to active trap table.
    100  *
    101  * The handler is copied from trap_table_kernel to trap_handler.
    102  *
    103  * @param tt Trap type. An index that uniquelly identifies handler code.
    104  * @param len Length of the handler in bytes. Must be multiple of TRAP_TABLE_ENTRY_SIZE (i.e. 32).
    105  * @param tlnonz If false, tt is considered from the lower half of trap table. If true, the upper half is chosen.
    106  */
    107 void trap_install_handler(index_t tt, size_t len, bool tlnonz)
    108 {
    109         count_t cnt;
    110         int i;
    111 
    112         ASSERT(tt < TRAP_TABLE_ENTRY_COUNT/2);
    113         ASSERT(len % TRAP_TABLE_ENTRY_SIZE == 0);
    114 
    115         if (tlnonz)
    116                 tt += TRAP_TABLE_ENTRY_COUNT/2;
    117 
    118         cnt = len/TRAP_TABLE_ENTRY_SIZE;
    119        
    120         for (i = tt; i < tt + cnt; i++) {
    121                 trap_table[i] = trap_table_save[i];
    122         }       
    123 }
  • arch/sparc64/src/trap/trap_table.S

    r7a255e69 r7cb53f62  
    2828
    2929/**
    30  * This file contains two trap tables.
    31  * First, trap_table, is the one wich contains handlers implemented by
    32  * kernel. During initialization, these handlers are copied out to
    33  * the second trap table, trap_table_save, and the first table is
    34  * overwritten with copy of OFW's own trap table. The copy is then patched
    35  * from the trap_table_save.
    36  *
    37  * This arrangement is beneficial because kernel handlers stay on their
    38  * link-time addresses which is good for debugging.
     30 * This file contains kernel trap table.
    3931 */
    4032
     
    6961        SIMPLE_HANDLER do_instruction_access_exc
    7062
     63/* TT = 0x10, TL = 0, illegal_instruction */
     64.org trap_table + TT_ILLEGAL_INSTRUCTION*ENTRY_SIZE
     65.global illegal_instruction
     66illegal_instruction:
     67        SIMPLE_HANDLER do_illegal_instruction
     68
    7169/* TT = 0x24, TL = 0, clean_window handler */
    7270.org trap_table + TT_CLEAN_WINDOW*ENTRY_SIZE
     
    217215        SIMPLE_HANDLER do_instruction_access_exc
    218216
     217/* TT = 0x10, TL > 0, illegal_instruction */
     218.org trap_table + (TT_ILLEGAL_INSTRUCTION+512)*ENTRY_SIZE
     219.global illegal_instruction_high
     220illegal_instruction_high:
     221        SIMPLE_HANDLER do_illegal_instruction
     222
    219223/* TT = 0x24, TL > 0, clean_window handler */
    220224.org trap_table + (TT_CLEAN_WINDOW+512)*ENTRY_SIZE
     
    258262fill_0_normal_high:
    259263        FILL_NORMAL_HANDLER
    260 
    261 
    262 
    263 /*
    264  * Save trap table.
    265  */
    266 .align TABLE_SIZE
    267 .global trap_table_save
    268 trap_table_save:
    269         .space TABLE_SIZE, 0
    270264
    271265
Note: See TracChangeset for help on using the changeset viewer.