Changeset 39494010 in mainline


Ignore:
Timestamp:
2005-12-26T01:05:47Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1120276
Parents:
5b1ced0
Message:

sparc64 work.
Interrupt Levels 1 - 15 serviced.
Minor changes in the exc_* functions.

Files:
4 added
11 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/Makefile.inc

    r5b1ced0 r39494010  
    6161        arch/$(ARCH)/src/trap/trap_table.S \
    6262        arch/$(ARCH)/src/trap/trap.c \
    63         arch/$(ARCH)/src/trap/interrupt.c
     63        arch/$(ARCH)/src/trap/interrupt.c \
     64        arch/$(ARCH)/src/drivers/tick.c
  • arch/sparc64/include/asm.h

    r5b1ced0 r39494010  
    101101}
    102102
     103/** Read SOFTINT Register.
     104 *
     105 * @return Value of SOFTINT register.
     106 */
     107static inline __u64 softint_read(void)
     108{
     109        __u64 v;
     110
     111        __asm__ volatile ("rd %%softint, %0\n" : "=r" (v));
     112
     113        return v;
     114}
     115
     116/** Write SOFTINT Register.
     117 *
     118 * @param New value of SOFTINT register.
     119 */
     120static inline void softint_write(__u64 v)
     121{
     122        __asm__ volatile ("wr %0, %1, %%softint\n" : : "r" (v), "i" (0));
     123}
    103124
    104125/** Enable interrupts.
  • arch/sparc64/include/interrupt.h

    r5b1ced0 r39494010  
    3030#define __sparc64_INTERRUPT_H__
    3131
     32#include <typedefs.h>
     33
     34#define IVT_ITEMS       15
     35#define IVT_FIRST       1
     36
     37extern void interrupt_register(int n, const char *name, iroutine f);
     38
    3239#endif
  • arch/sparc64/include/register.h

    r5b1ced0 r39494010  
    8181        __u64 value;
    8282        struct {
    83                 unsigned int_dis : 1;   /**< TICK_INT interrupt enable. */
     83                unsigned int_dis : 1;   /**< TICK_INT interrupt disabled flag. */
    8484                __u64 tick_cmpr : 63;   /**< Compare value for TICK interrupts. */
    8585        } __attribute__ ((packed));
     
    8787typedef union tick_compare_reg tick_compare_reg_t;
    8888
     89/** SOFTINT Register. */
     90union softint_reg {
     91        __u64 value;
     92        struct {
     93                __u64 : 47;
     94                unsigned stick_int : 1;
     95                unsigned int_level : 15;
     96                unsigned tick_int : 1;
     97        } __attribute__ ((packed));
     98};
     99typedef union softint_reg softint_reg_t;
     100
    89101#endif
  • arch/sparc64/src/console.c

    r5b1ced0 r39494010  
    3131#include <console/chardev.h>
    3232#include <console/console.h>
     33#include <arch/asm.h>
     34#include <arch/register.h>
    3335
    3436static void ofw_sparc64_putchar(chardev_t *d, const char ch);
     
    5153void ofw_sparc64_putchar(chardev_t *d, const char ch)
    5254{
     55        pstate_reg_t pstate;
     56
     57        /*
     58         * 32-bit OpenFirmware depends on PSTATE.AM bit set.
     59         */     
     60        pstate.value = pstate_read();
     61        pstate.am = true;
     62        pstate_write(pstate.value);
     63
    5364        if (ch == '\n')
    5465                ofw_putchar('\r');
    5566        ofw_putchar(ch);
     67       
     68        pstate.am = false;
     69        pstate_write(pstate.value);
    5670}
  • arch/sparc64/src/sparc64.c

    r5b1ced0 r39494010  
    3131#include <arch/trap/trap.h>
    3232#include <arch/console.h>
     33#include <arch/drivers/tick.h>
    3334
    3435void arch_pre_mm_init(void)
     
    3738        ofw_sparc64_console_init();
    3839        trap_init();
     40        tick_init();
    3941}
    4042
  • arch/sparc64/src/trap/trap.c

    r5b1ced0 r39494010  
    3636#include <arch/types.h>
    3737#include <typedefs.h>
     38#include <arch/drivers/tick.h>
    3839
    3940/** Initialize trap table. */
     
    5960        trap_install_handler(TT_SPILL_0_NORMAL, SPILL_HANDLER_SIZE, true);
    6061        trap_install_handler(TT_FILL_0_NORMAL, FILL_HANDLER_SIZE, true);
    61        
     62        trap_install_handler(TT_INTERRUPT_LEVEL_1, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     63        trap_install_handler(TT_INTERRUPT_LEVEL_2, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     64        trap_install_handler(TT_INTERRUPT_LEVEL_3, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     65        trap_install_handler(TT_INTERRUPT_LEVEL_4, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     66        trap_install_handler(TT_INTERRUPT_LEVEL_5, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     67        trap_install_handler(TT_INTERRUPT_LEVEL_6, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     68        trap_install_handler(TT_INTERRUPT_LEVEL_7, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     69        trap_install_handler(TT_INTERRUPT_LEVEL_8, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     70        trap_install_handler(TT_INTERRUPT_LEVEL_9, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     71        trap_install_handler(TT_INTERRUPT_LEVEL_10, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     72        trap_install_handler(TT_INTERRUPT_LEVEL_11, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     73        trap_install_handler(TT_INTERRUPT_LEVEL_12, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     74        trap_install_handler(TT_INTERRUPT_LEVEL_13, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     75        trap_install_handler(TT_INTERRUPT_LEVEL_14, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
     76        trap_install_handler(TT_INTERRUPT_LEVEL_15, INTERRUPT_LEVEL_N_HANDLER_SIZE, false);
    6277        trap_install_handler(TT_INTERRUPT_VECTOR_TRAP, INTERRUPT_VECTOR_TRAP_HANDLER_SIZE, false);
    6378}
  • arch/sparc64/src/trap/trap_table.S

    r5b1ced0 r39494010  
    6161        CLEAN_WINDOW_HANDLER
    6262
     63/* TT = 0x41, TL = 0, interrupt_level_1 handler */
     64.org trap_table + TT_INTERRUPT_LEVEL_1*ENTRY_SIZE
     65.global interrupt_level_1_handler
     66interrupt_level_1_handler:
     67        INTERRUPT_LEVEL_N_HANDLER 1
     68
     69/* TT = 0x42, TL = 0, interrupt_level_2 handler */
     70.org trap_table + TT_INTERRUPT_LEVEL_2*ENTRY_SIZE
     71.global interrupt_level_2_handler
     72interrupt_level_2_handler:
     73        INTERRUPT_LEVEL_N_HANDLER 2
     74
     75/* TT = 0x43, TL = 0, interrupt_level_3 handler */
     76.org trap_table + TT_INTERRUPT_LEVEL_3*ENTRY_SIZE
     77.global interrupt_level_3_handler
     78interrupt_level_3_handler:
     79        INTERRUPT_LEVEL_N_HANDLER 3
     80
     81/* TT = 0x44, TL = 0, interrupt_level_4 handler */
     82.org trap_table + TT_INTERRUPT_LEVEL_4*ENTRY_SIZE
     83.global interrupt_level_4_handler
     84interrupt_level_4_handler:
     85        INTERRUPT_LEVEL_N_HANDLER 4
     86
     87/* TT = 0x45, TL = 0, interrupt_level_5 handler */
     88.org trap_table + TT_INTERRUPT_LEVEL_5*ENTRY_SIZE
     89.global interrupt_level_5_handler
     90interrupt_level_5_handler:
     91        INTERRUPT_LEVEL_N_HANDLER 5
     92
     93/* TT = 0x46, TL = 0, interrupt_level_6 handler */
     94.org trap_table + TT_INTERRUPT_LEVEL_6*ENTRY_SIZE
     95.global interrupt_level_6_handler
     96interrupt_level_6_handler:
     97        INTERRUPT_LEVEL_N_HANDLER 6
     98
     99/* TT = 0x47, TL = 0, interrupt_level_7 handler */
     100.org trap_table + TT_INTERRUPT_LEVEL_7*ENTRY_SIZE
     101.global interrupt_level_7_handler
     102interrupt_level_7_handler:
     103        INTERRUPT_LEVEL_N_HANDLER 7
     104
     105/* TT = 0x48, TL = 0, interrupt_level_8 handler */
     106.org trap_table + TT_INTERRUPT_LEVEL_8*ENTRY_SIZE
     107.global interrupt_level_8_handler
     108interrupt_level_8_handler:
     109        INTERRUPT_LEVEL_N_HANDLER 8
     110
     111/* TT = 0x49, TL = 0, interrupt_level_9 handler */
     112.org trap_table + TT_INTERRUPT_LEVEL_9*ENTRY_SIZE
     113.global interrupt_level_9_handler
     114interrupt_level_9_handler:
     115        INTERRUPT_LEVEL_N_HANDLER 9
     116
     117/* TT = 0x4a, TL = 0, interrupt_level_10 handler */
     118.org trap_table + TT_INTERRUPT_LEVEL_10*ENTRY_SIZE
     119.global interrupt_level_10_handler
     120interrupt_level_10_handler:
     121        INTERRUPT_LEVEL_N_HANDLER 10
     122
     123/* TT = 0x4b, TL = 0, interrupt_level_11 handler */
     124.org trap_table + TT_INTERRUPT_LEVEL_11*ENTRY_SIZE
     125.global interrupt_level_11_handler
     126interrupt_level_11_handler:
     127        INTERRUPT_LEVEL_N_HANDLER 11
     128
     129/* TT = 0x4c, TL = 0, interrupt_level_12 handler */
     130.org trap_table + TT_INTERRUPT_LEVEL_12*ENTRY_SIZE
     131.global interrupt_level_12_handler
     132interrupt_level_12_handler:
     133        INTERRUPT_LEVEL_N_HANDLER 12
     134
     135/* TT = 0x4d, TL = 0, interrupt_level_13 handler */
     136.org trap_table + TT_INTERRUPT_LEVEL_13*ENTRY_SIZE
     137.global interrupt_level_13_handler
     138interrupt_level_13_handler:
     139        INTERRUPT_LEVEL_N_HANDLER 13
     140
     141/* TT = 0x4e, TL = 0, interrupt_level_14 handler */
     142.org trap_table + TT_INTERRUPT_LEVEL_14*ENTRY_SIZE
     143.global interrupt_level_14_handler
     144interrupt_level_14_handler:
     145        INTERRUPT_LEVEL_N_HANDLER 14
     146
     147/* TT = 0x4f, TL = 0, interrupt_level_15 handler */
     148.org trap_table + TT_INTERRUPT_LEVEL_15*ENTRY_SIZE
     149.global interrupt_level_15_handler
     150interrupt_level_15_handler:
     151        INTERRUPT_LEVEL_N_HANDLER 15
     152
    63153/* TT = 0x60, TL = 0, interrupt_vector_trap handler */
    64154.org trap_table + TT_INTERRUPT_VECTOR_TRAP*ENTRY_SIZE
  • generic/include/interrupt.h

    r5b1ced0 r39494010  
    3131
    3232#include <arch/interrupt.h>
     33#include <typedefs.h>
    3334
    3435#ifndef IVT_ITEMS
    35 #  define IVT_ITEMS 0
     36#       define IVT_ITEMS 0
    3637#endif
    3738
    38 typedef void (* iroutine)(int n, void *stack);
     39#ifndef IVT_FIRST
     40#       define IVT_FIRST 0
     41#endif
    3942
    4043extern iroutine exc_register(int n, const char *name, iroutine f);
  • generic/include/typedefs.h

    r5b1ced0 r39494010  
    8787typedef struct cmd_info cmd_info_t;
    8888
     89typedef void (* iroutine)(int n, void *stack);
     90
    8991#endif
  • generic/src/interrupt/interrupt.c

    r5b1ced0 r39494010  
    7575        ASSERT(n < IVT_ITEMS);
    7676       
    77         exc_table[n].f(n, stack);
     77        exc_table[n].f(n + IVT_FIRST, stack);
    7878}
    7979
     
    8484}
    8585
    86 /** KConsole cmd - print all exceptions */
     86/** kconsole cmd - print all exceptions */
    8787static int exc_print_cmd(cmd_arg_t *argv)
    8888{
     
    9696                if (!symbol)
    9797                        symbol = "not found";
    98                 printf("%d %s 0x%p(%s)\n",i,exc_table[i].name,
     98                printf("%d %s 0x%p(%s)\n", i + IVT_FIRST, exc_table[i].name,
    9999                       exc_table[i].f,symbol);         
    100100                if (!((i+1) % 20)) {
Note: See TracChangeset for help on using the changeset viewer.