Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 32e8cd1 in mainline


Ignore:
Timestamp:
2013-12-28T17:16:44Z (8 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master
Children:
c1023bcb
Parents:
f6f22cdb
Message:

code revision
coding style fixes
removal of debugging printouts and other temporary stuff

Location:
kernel/arch/sparc32
Files:
1 deleted
50 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc32/Makefile.inc

    rf6f22cdb r32e8cd1  
    2929BFD = binary
    3030
    31 ifeq ($(COMPILER),gcc_cross)
    32         ifeq ($(CROSS_TARGET),arm32)
    33                 ATSIGN = %
    34         endif
    35        
    36         ifeq ($(CROSS_TARGET),mips32)
    37                 GCC_CFLAGS += -mno-abicalls
    38         endif
    39 endif
    40 
    4131BITS = 32
    4232ENDIANESS = BE
     
    4535        arch/$(KARCH)/src/start.S \
    4636        arch/$(KARCH)/src/trap_table.S \
    47         arch/$(KARCH)/src/regwin_test.S \
    4837        arch/$(KARCH)/src/context.S \
    4938        arch/$(KARCH)/src/debug/stacktrace.c \
    50         arch/$(KARCH)/src/debug/stacktrace_asm.S \
     39        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    5140        arch/$(KARCH)/src/proc/scheduler.c \
    5241        arch/$(KARCH)/src/proc/task.c \
     
    6453        arch/$(KARCH)/src/mm/frame.c \
    6554        arch/$(KARCH)/src/mm/page.c \
    66         arch/$(KARCH)/src/mm/tlb.c \
     55        arch/$(KARCH)/src/mm/tlb.c
    6756
    6857ifeq ($(MACHINE),leon3)
    69         ARCH_SOURCES += arch/$(KARCH)/src/machine/leon3/leon3.c
     58        ARCH_SOURCES += \
     59                arch/$(KARCH)/src/machine/leon3/leon3.c
    7060endif
    7161
  • kernel/arch/sparc32/_link.ld.in

    rf6f22cdb r32e8cd1  
    1 #define KERNEL_LOAD_ADDRESS 0x80a00000
     1#define KERNEL_LOAD_ADDRESS 0x80a00000
    22
    33ENTRY(kernel_image_start)
     
    55SECTIONS {
    66        . = KERNEL_LOAD_ADDRESS;
     7       
    78        .text : {
    89                ktext_start = .;
     
    1011                ktext_end = .;
    1112        }
     13       
    1214        .data : {
    1315                kdata_start = .;
     
    3032                *(symtab.*);
    3133        }
     34       
    3235        .sbss : {
    3336                *(.sbss);
  • kernel/arch/sparc32/include/arch/ambapp.h

    rf6f22cdb r32e8cd1  
    3636#define KERN_sparc32_AMBAPP_H_
    3737
    38 typedef struct
    39 {
     38typedef struct {
    4039        /* Primary serial port location */
    4140        uintptr_t uart_base;
  • kernel/arch/sparc32/include/arch/arch.h

    rf6f22cdb r32e8cd1  
    4242#include <arch/istate.h>
    4343
    44 #define NWINDOWS        8
     44#define NWINDOWS  8
    4545
    4646/* ASI assignments: */
    47 #define ASI_CACHEMISS   0x01
    48 #define ASI_CACHECTRL   0x02
    49 #define ASI_MMUCACHE    0x10
    50 #define ASI_MMUREGS     0x19
    51 #define ASI_MMUBYPASS   0x1c
    52 #define ASI_MMUFLUSH    0x18
     47#define ASI_CACHEMISS  0x01
     48#define ASI_CACHECTRL  0x02
     49#define ASI_MMUCACHE   0x10
     50#define ASI_MMUREGS    0x19
     51#define ASI_MMUBYPASS  0x1c
     52#define ASI_MMUFLUSH   0x18
    5353
    5454#define TASKMAP_MAX_RECORDS  32
    5555#define CPUMAP_MAX_RECORDS   32
    5656
    57 #define BOOTINFO_TASK_NAME_BUFLEN 32
     57#define BOOTINFO_TASK_NAME_BUFLEN  32
    5858
    5959typedef struct {
     
    7575} bootinfo_t;
    7676
    77 extern void arch_pre_main(void *unused, bootinfo_t *bootinfo);
    78 extern void write_to_invalid(uint32_t l0, uint32_t l1, uint32_t l2);
    79 extern void read_from_invalid(uint32_t *l0, uint32_t *l1, uint32_t *l2);
    80 extern void preemptible_save_uspace(uintptr_t sp, istate_t *istate);
    81 extern void preemptible_restore_uspace(uintptr_t sp, istate_t *istate);
     77extern void arch_pre_main(void *, bootinfo_t *);
     78extern void write_to_invalid(uint32_t, uint32_t, uint32_t);
     79extern void read_from_invalid(uint32_t *, uint32_t *, uint32_t *);
     80extern void preemptible_save_uspace(uintptr_t, istate_t *);
     81extern void preemptible_restore_uspace(uintptr_t, istate_t *);
    8282extern void flush_windows(void);
    8383
  • kernel/arch/sparc32/include/arch/asm.h

    rf6f22cdb r32e8cd1  
    4343NO_TRACE static inline void asm_delay_loop(uint32_t usec)
    4444{
     45        // FIXME TODO
    4546}
    4647
    4748NO_TRACE static inline __attribute__((noreturn)) void cpu_halt(void)
    4849{
    49         /* On real hardware this should stop processing further
    50            instructions on the CPU (and possibly putting it into
    51            low-power mode) without any possibility of exitting
    52            this function. */
    53        
     50        // FIXME TODO
    5451        while (true);
    5552}
     
    5754NO_TRACE static inline void cpu_sleep(void)
    5855{
    59         /* On real hardware this should put the CPU into low-power
    60            mode. However, the CPU is free to continue processing
    61            futher instructions any time. The CPU also wakes up
    62            upon an interrupt. */
     56        // FIXME TODO
    6357}
    6458
     
    6862}
    6963
    70 /** Word to port
    71  *
    72  * Output word to port
    73  *
    74  * @param port Port to write to
    75  * @param val Value to write
    76  *
    77  */
    7864NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t val)
    7965{
     
    8167}
    8268
    83 /** Double word to port
    84  *
    85  * Output double word to port
    86  *
    87  * @param port Port to write to
    88  * @param val Value to write
    89  *
    90  */
    9169NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t val)
    9270{
     
    9472}
    9573
    96 /** Byte from port
    97  *
    98  * Get byte from port
    99  *
    100  * @param port Port to read from
    101  * @return Value read
    102  *
    103  */
    10474NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port)
    10575{
     
    10777}
    10878
    109 /** Word from port
    110  *
    111  * Get word from port
    112  *
    113  * @param port Port to read from
    114  * @return Value read
    115  *
    116  */
    11779NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port)
    11880{
     
    12082}
    12183
    122 /** Double word from port
    123  *
    124  * Get double word from port
    125  *
    126  * @param port Port to read from
    127  * @return Value read
    128  *
    129  */
    13084NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port)
    13185{
     
    13387}
    13488
    135 NO_TRACE static inline uint32_t psr_read()
     89NO_TRACE static inline uint32_t psr_read(void)
    13690{
    13791        uint32_t v;
    138 
     92       
    13993        asm volatile (
    14094                "mov %%psr, %[v]\n"
    14195                : [v] "=r" (v)
    14296        );
    143 
    144         return v;
    145 }
    146 
    147 NO_TRACE static inline uint32_t wim_read()
     97       
     98        return v;
     99}
     100
     101NO_TRACE static inline uint32_t wim_read(void)
    148102{
    149103        uint32_t v;
    150 
     104       
    151105        asm volatile (
    152106                "mov %%wim, %[v]\n"
    153107                : [v] "=r" (v)
    154108        );
    155 
    156         return v;
    157 }
    158 
    159 NO_TRACE static inline uint32_t asi_u32_read(int asi, uintptr_t va)
     109       
     110        return v;
     111}
     112
     113NO_TRACE static inline uint32_t asi_u32_read(unsigned int asi, uintptr_t va)
    160114{
    161115        uint32_t v;
    162 
     116       
    163117        asm volatile (
    164118                "lda [%[va]] %[asi], %[v]\n"
    165119                : [v] "=r" (v)
    166120                : [va] "r" (va),
    167                   [asi] "i" ((unsigned int) asi)
    168         );
    169        
    170         return v;
    171 }
    172 
    173 NO_TRACE static inline void asi_u32_write(int asi, uintptr_t va, uint32_t v)
     121                  [asi] "i" (asi)
     122        );
     123       
     124        return v;
     125}
     126
     127NO_TRACE static inline void asi_u32_write(unsigned int asi, uintptr_t va,
     128    uint32_t v)
    174129{
    175130        asm volatile (
     
    177132                :: [v] "r" (v),
    178133                   [va] "r" (va),
    179                    [asi] "i" ((unsigned int) asi)
     134                   [asi] "i" (asi)
    180135                : "memory"
    181136        );
     
    200155NO_TRACE static inline ipl_t interrupts_enable(void)
    201156{
     157        psr_reg_t psr;
     158        psr.value = psr_read();
     159       
    202160        ipl_t pil;
    203 
    204         psr_reg_t psr;
    205         psr.value = psr_read();
    206161        pil = psr.pil;
    207         psr.pil = 0xf;
     162       
     163        psr.pil = 0x0f;
    208164        psr_write(psr.value);
    209 
     165       
    210166        return pil;
    211167}
     
    213169NO_TRACE static inline ipl_t interrupts_disable(void)
    214170{
     171        psr_reg_t psr;
     172        psr.value = psr_read();
     173       
    215174        ipl_t pil;
    216 
    217         psr_reg_t psr;
    218         psr.value = psr_read();
    219175        pil = psr.pil;
     176       
    220177        psr.pil = 0;
    221178        psr_write(psr.value);
    222 
     179       
    223180        return pil;
    224181}
  • kernel/arch/sparc32/include/arch/atomic.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_ATOMIC_H_
    36 #define KERN_abs32le_ATOMIC_H_
     35#ifndef KERN_sparc32_ATOMIC_H_
     36#define KERN_sparc32_ATOMIC_H_
    3737
    3838#include <typedefs.h>
     
    4747    REQUIRES(val->count < ATOMIC_COUNT_MAX)
    4848{
    49         /* On real hardware the increment has to be done
    50            as an atomic action. */
    51        
     49        // FIXME TODO
    5250        val->count++;
    5351}
     
    5856    REQUIRES(val->count > ATOMIC_COUNT_MIN)
    5957{
    60         /* On real hardware the decrement has to be done
    61            as an atomic action. */
    62        
     58        // FIXME TODO
    6359        val->count--;
    6460}
     
    6965    REQUIRES(val->count < ATOMIC_COUNT_MAX)
    7066{
    71         /* On real hardware both the storing of the previous
    72            value and the increment have to be done as a single
    73            atomic action. */
     67        // FIXME TODO
    7468       
    7569        atomic_count_t prev = val->count;
     
    8478    REQUIRES(val->count > ATOMIC_COUNT_MIN)
    8579{
    86         /* On real hardware both the storing of the previous
    87            value and the decrement have to be done as a single
    88            atomic action. */
     80        // FIXME TODO
    8981       
    9082        atomic_count_t prev = val->count;
     
    10193    REQUIRES_EXTENT_MUTABLE(val)
    10294{
    103         /* On real hardware the retrieving of the original
    104            value and storing 1 have to be done as a single
    105            atomic action. */
     95        // FIXME TODO
    10696       
    10797        atomic_count_t prev = val->count;
     
    114104    REQUIRES_EXTENT_MUTABLE(val)
    115105{
     106        // FIXME TODO
     107       
    116108        do {
    117109                while (val->count);
  • kernel/arch/sparc32/include/arch/barrier.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_BARRIER_H_
    36 #define KERN_abs32le_BARRIER_H_
     35#ifndef KERN_sparc32_BARRIER_H_
     36#define KERN_sparc32_BARRIER_H_
    3737
    38 /*
    39  * Provisions are made to prevent compiler from reordering instructions itself.
    40  */
     38// FIXME TODO
    4139
    4240#define CS_ENTER_BARRIER()
  • kernel/arch/sparc32/include/arch/context.h

    rf6f22cdb r32e8cd1  
    5656 */
    5757typedef struct {
    58         uintptr_t sp;           /* %o6 */
    59         uintptr_t pc;           /* %o7 */
     58        uintptr_t sp;  /* %o6 */
     59        uintptr_t pc;  /* %o7 */
    6060        uint32_t i0;
    6161        uint32_t i1;
     
    6464        uint32_t i4;
    6565        uint32_t i5;
    66         uintptr_t fp;           /* %i6 */
     66        uintptr_t fp;  /* %i6 */
    6767        uintptr_t i7;
    6868        uint32_t l0;
  • kernel/arch/sparc32/include/arch/context_offset.h

    rf6f22cdb r32e8cd1  
    3131#define KERN_sparc32_CONTEXT_OFFSET_H_
    3232
    33 #define OFFSET_SP       0
    34 #define OFFSET_PC       4
    35 #define OFFSET_I0       8
    36 #define OFFSET_I1       12
    37 #define OFFSET_I2       16
    38 #define OFFSET_I3       20
    39 #define OFFSET_I4       24
    40 #define OFFSET_I5       28
    41 #define OFFSET_FP       32
    42 #define OFFSET_I7       36
    43 #define OFFSET_L0       40
    44 #define OFFSET_L1       44
    45 #define OFFSET_L2       48
    46 #define OFFSET_L3       52
    47 #define OFFSET_L4       56
    48 #define OFFSET_L5       60
    49 #define OFFSET_L6       64
    50 #define OFFSET_L7       68
     33#define OFFSET_SP  0
     34#define OFFSET_PC  4
     35#define OFFSET_I0  8
     36#define OFFSET_I1  12
     37#define OFFSET_I2  16
     38#define OFFSET_I3  20
     39#define OFFSET_I4  24
     40#define OFFSET_I5  28
     41#define OFFSET_FP  32
     42#define OFFSET_I7  36
     43#define OFFSET_L0  40
     44#define OFFSET_L1  44
     45#define OFFSET_L2  48
     46#define OFFSET_L3  52
     47#define OFFSET_L4  56
     48#define OFFSET_L5  60
     49#define OFFSET_L6  64
     50#define OFFSET_L7  68
    5151
    5252#ifndef KERNEL
    53 # define OFFSET_TP      72
     53
     54#define OFFSET_TP  72
     55
    5456#endif
     57
    5558#ifdef __ASM__
    5659
  • kernel/arch/sparc32/include/arch/cpu.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_CPU_H_
    36 #define KERN_abs32le_CPU_H_
     35#ifndef KERN_sparc32_CPU_H_
     36#define KERN_sparc32_CPU_H_
    3737
    38 /*
    39  * On real hardware this structure stores
    40  * information specific to the current
    41  * CPU model.
    42  */
    4338typedef struct {
    4439} cpu_arch_t;
  • kernel/arch/sparc32/include/arch/cycle.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_CYCLE_H_
    36 #define KERN_abs32le_CYCLE_H_
     35#ifndef KERN_sparc32_CYCLE_H_
     36#define KERN_sparc32_CYCLE_H_
    3737
    3838#include <trace.h>
     
    4040NO_TRACE static inline uint64_t get_cycle(void)
    4141{
     42        // FIXME TODO
    4243        return 0;
    4344}
  • kernel/arch/sparc32/include/arch/exception.h

    rf6f22cdb r32e8cd1  
    3838#define KERN_sparc32_EXCEPTION_H_
    3939
    40 #define TT_INSTRUCTION_ACCESS_EXCEPTION         0x01
    41 #define TT_INSTRUCTION_ACCESS_MMU_MISS          0x3c
    42 #define TT_INSTRUCTION_ACCESS_ERROR             0x21
    43 #define TT_ILLEGAL_INSTRUCTION                  0x02
    44 #define TT_PRIVILEGED_INSTRUCTION               0x03
    45 #define TT_FP_DISABLED                          0x08
    46 #define TT_DIVISION_BY_ZERO                     0x2a
    47 #define TT_DATA_ACCESS_EXCEPTION                0x09
    48 #define TT_DATA_ACCESS_MMU_MISS                 0x2c
    49 #define TT_DATA_ACCESS_ERROR                    0x29
    50 #define TT_MEM_ADDRESS_NOT_ALIGNED              0x07
     40#define TT_INSTRUCTION_ACCESS_EXCEPTION  0x01
     41#define TT_ILLEGAL_INSTRUCTION           0x02
     42#define TT_PRIVILEGED_INSTRUCTION        0x03
     43#define TT_MEM_ADDRESS_NOT_ALIGNED       0x07
     44#define TT_FP_DISABLED                   0x08
     45#define TT_DATA_ACCESS_EXCEPTION         0x09
     46#define TT_INSTRUCTION_ACCESS_ERROR      0x21
     47#define TT_DATA_ACCESS_ERROR             0x29
     48#define TT_DIVISION_BY_ZERO              0x2a
     49#define TT_DATA_ACCESS_MMU_MISS          0x2c
     50#define TT_INSTRUCTION_ACCESS_MMU_MISS   0x3c
    5151
    5252#ifndef __ASM__
    5353
    54 /*#include <arch/interrupt.h>*/
     54extern void instruction_access_exception(int, istate_t *);
     55extern void instruction_access_error(int, istate_t *);
     56extern void illegal_instruction(int, istate_t *);
     57extern void privileged_instruction(int, istate_t *);
     58extern void fp_disabled(int, istate_t *);
     59extern void fp_exception(int, istate_t *);
     60extern void tag_overflow(int, istate_t *);
     61extern void division_by_zero(int, istate_t *);
     62extern void data_access_exception(int, istate_t *);
     63extern void data_access_error(int, istate_t *);
     64extern void data_access_mmu_miss(int, istate_t *);
     65extern void data_store_error(int, istate_t *);
     66extern void mem_address_not_aligned(int, istate_t *);
    5567
    56 extern void instruction_access_exception(int n, istate_t *istate);
    57 extern void instruction_access_error(int n, istate_t *istate);
    58 extern void illegal_instruction(int n, istate_t *istate);
    59 extern void privileged_instruction(int n, istate_t *istate);
    60 extern void fp_disabled(int n, istate_t *istate);
    61 extern void fp_exception(int n, istate_t *istate);
    62 extern void tag_overflow(int n, istate_t *istate);
    63 extern void division_by_zero(int n, istate_t *istate);
    64 extern void data_access_exception(int n, istate_t *istate);
    65 extern void data_access_error(int n, istate_t *istate);
    66 extern void data_access_mmu_miss(int n, istate_t *istate);
    67 extern void data_store_error(int n, istate_t *istate);
    68 extern void mem_address_not_aligned(int n, istate_t *istate);
    69 extern sysarg_t syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id);
    70 extern void irq_exception(unsigned int nr, istate_t *istate);
     68extern sysarg_t syscall(sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
     69    sysarg_t, sysarg_t);
     70extern void irq_exception(unsigned int, istate_t *);
    7171
    7272#endif /* !__ASM__ */
  • kernel/arch/sparc32/include/arch/faddr.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
  • kernel/arch/sparc32/include/arch/fpu_context.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_FPU_CONTEXT_H_
    36 #define KERN_abs32le_FPU_CONTEXT_H_
     35#ifndef KERN_sparc32_FPU_CONTEXT_H_
     36#define KERN_sparc32_FPU_CONTEXT_H_
    3737
    3838#include <typedefs.h>
     
    4040#define FPU_CONTEXT_ALIGN  16
    4141
    42 /*
    43  * On real hardware this stores the FPU registers
    44  * which are part of the CPU context.
    45  */
    4642typedef struct {
    4743} fpu_context_t;
  • kernel/arch/sparc32/include/arch/interrupt.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32leinterrupt
     29/** @addtogroup sparc32interrupt
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_INTERRUPT_H_
    36 #define KERN_abs32le_INTERRUPT_H_
     35#ifndef KERN_sparc32_INTERRUPT_H_
     36#define KERN_sparc32_INTERRUPT_H_
    3737
    3838#include <typedefs.h>
  • kernel/arch/sparc32/include/arch/istate.h

    rf6f22cdb r32e8cd1  
    4949#endif /* KERNEL */
    5050
    51 /*
    52  * On real hardware this stores the registers which
    53  * need to be preserved during interupts.
    54  */
    5551typedef struct istate {
    5652        uintptr_t pstate;
     
    6359    REQUIRES_EXTENT_MUTABLE(istate)
    6460{
    65         /* On real hardware this checks whether the interrupted
    66            context originated from user space. */
    67 
    6861        return !(istate->pc & UINT32_C(0x80000000));
    6962}
     
    7366    WRITES(&istate->ip)
    7467{
    75         /* On real hardware this sets the instruction pointer. */
    76        
    7768        istate->pc = retaddr;
    7869}
     
    8172    REQUIRES_EXTENT_MUTABLE(istate)
    8273{
    83         /* On real hardware this returns the instruction pointer. */
    84        
    8574        return istate->pc;
    8675}
     
    8978    REQUIRES_EXTENT_MUTABLE(istate)
    9079{
    91         /* On real hardware this returns the frame pointer. */
    92        
    93         return 0;//istate->fp;
     80        return 0;
    9481}
    9582
  • kernel/arch/sparc32/include/arch/machine/leon3/leon3.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup sparc32leon3 LEON3
    30  *  @brief LEON3 System-on-chip.
    31  *  @ingroup arm32
     29/** @addtogroup sparc32leon3
     30 * @brief LEON3 System-on-chip.
     31 * @ingroup sparc32
    3232 * @{
    3333 */
    3434
    35 #ifndef KERN_sparc32_leon3_H_
    36 #define KERN_sparc32_leon3_H_
     35#ifndef KERN_sparc32_LEON3_H_
     36#define KERN_sparc32_LEON3_H_
    3737
    3838#include <arch/machine_func.h>
    3939
     40#define LEON3_SDRAM_START  0x40000000
     41#define LEON3_IRQ_COUNT    15
     42
    4043extern struct sparc_machine_ops leon3_machine_ops;
    41 
    42 #define LEON3_SDRAM_START 0x40000000
    43 #define LEON3_IRQ_COUNT 15
    4444
    4545#endif
  • kernel/arch/sparc32/include/arch/machine_func.h

    rf6f22cdb r32e8cd1  
    3232 */
    3333/** @file
    34  *  @brief Declarations of machine specific functions.
     34 * @brief Declarations of machine specific functions.
    3535 *
    36  *  These functions enable to differentiate more kinds of ARM emulators
    37  *  or CPUs. It's the same concept as "arch" functions on the architecture
    38  *  level.
     36 * These functions enable to differentiate more kinds of SPARC emulators
     37 * or CPUs. It is the same concept as "arch" functions on the architecture
     38 * level.
    3939 */
    4040
     
    6666extern void machine_ops_init(void);
    6767
    68 /** Maps HW devices to the kernel address space using #hw_map. */
     68/** Map HW devices to the kernel address space using #hw_map. */
    6969extern void machine_init(bootinfo_t *);
    7070
    71 
    72 /** Starts timer. */
     71/** Start timer. */
    7372extern void machine_timer_irq_start(void);
    7473
    75 
    76 /** Halts CPU. */
     74/** Halt CPU. */
    7775extern void machine_cpu_halt(void);
    7876
    7977/** Get extents of available memory.
    8078 *
    81  * @param start         Place to store memory start address.
    82  * @param size          Place to store memory size.
     79 * @param start Place to store memory start address.
     80 * @param size  Place to store memory size.
    8381 */
    8482extern void machine_get_memory_extents(uintptr_t *start, size_t *size);
     
    9189extern void machine_irq_exception(unsigned int exc_no, istate_t *istate);
    9290
    93 
    94 /*
    95  * Machine specific frame initialization
    96  */
     91/** Machine specific frame initialization */
    9792extern void machine_frame_init(void);
    9893
    99 /*
    100  * configure the serial line output device.
    101  */
     94/* Configure the serial line output device. */
    10295extern void machine_output_init(void);
    10396
    104 /*
    105  * configure the serial line input device.
    106  */
     97/** Configure the serial line input device. */
    10798extern void machine_input_init(void);
    10899
    109100extern size_t machine_get_irq_count(void);
    110101
    111 extern const char * machine_get_platform_name(void);
     102extern const char *machine_get_platform_name(void);
    112103
    113104#endif
  • kernel/arch/sparc32/include/arch/mm/as.h

    rf6f22cdb r32e8cd1  
    5555#define as_invalidate_translation_cache(as, page, cnt)
    5656
    57 uintptr_t as_context_table;
     57extern uintptr_t as_context_table;
    5858
    5959extern void as_arch_init(void);
  • kernel/arch/sparc32/include/arch/mm/frame.h

    rf6f22cdb r32e8cd1  
    3333 */
    3434
    35 #ifndef KERN_abs32le_FRAME_H_
    36 #define KERN_abs32le_FRAME_H_
     35#ifndef KERN_sparc32_FRAME_H_
     36#define KERN_sparc32_FRAME_H_
    3737
    3838#define FRAME_WIDTH  12  /* 4K */
     
    4141#include <typedefs.h>
    4242
    43 #define PHYSMEM_START_ADDR      0x40000000
     43#define PHYSMEM_START_ADDR  0x40000000
    4444
    45 #define BOOT_PT_ADDRESS         0x40008000
    46 #define BOOT_PT_START_FRAME     (BOOT_PT_ADDRESS >> FRAME_WIDTH)
    47 #define BOOT_PT_SIZE_FRAMES     1
     45#define BOOT_PT_ADDRESS      0x40008000
     46#define BOOT_PT_START_FRAME  (BOOT_PT_ADDRESS >> FRAME_WIDTH)
     47#define BOOT_PT_SIZE_FRAMES  1
    4848
    4949extern void frame_low_arch_init(void);
  • kernel/arch/sparc32/include/arch/mm/km.h

    rf6f22cdb r32e8cd1  
    3838#include <typedefs.h>
    3939
    40 #define KM_SPARC32_IDENTITY_START       UINT32_C(0x80000000)
    41 #define KM_SPARC32_IDENTITY_SIZE        UINT32_C(0x70000000)
     40#define KM_SPARC32_IDENTITY_START  UINT32_C(0x80000000)
     41#define KM_SPARC32_IDENTITY_SIZE   UINT32_C(0x70000000)
    4242
    43 #define KM_SPARC32_NON_IDENTITY_START   UINT32_C(0xf0000000)
    44 #define KM_SPARC32_NON_IDENTITY_SIZE    UINT32_C(0xff00000)
     43#define KM_SPARC32_NON_IDENTITY_START  UINT32_C(0xf0000000)
     44#define KM_SPARC32_NON_IDENTITY_SIZE   UINT32_C(0xff00000)
    4545
    4646extern void km_identity_arch_init(void);
  • kernel/arch/sparc32/include/arch/mm/page.h

    rf6f22cdb r32e8cd1  
    4848#define PA2KA(x)  (((uintptr_t) (x)) + UINT32_C(0x40000000))
    4949
    50 #define PTE_ET_INVALID          0
    51 #define PTE_ET_DESCRIPTOR       1
    52 #define PTE_ET_ENTRY            2
    53 
    54 #define PTE_ACC_USER_RO_KERNEL_RO       0
    55 #define PTE_ACC_USER_RW_KERNEL_RW       1
    56 #define PTE_ACC_USER_RX_KERNEL_RX       2
    57 #define PTE_ACC_USER_RWX_KERNEL_RWX     3
    58 #define PTE_ACC_USER_XO_KERNEL_XO       4
    59 #define PTE_ACC_USER_RO_KERNEL_RW       5
    60 #define PTE_ACC_USER_NO_KERNEL_RX       6
    61 #define PTE_ACC_USER_NO_KERNEL_RWX      7
     50#define PTE_ET_INVALID     0
     51#define PTE_ET_DESCRIPTOR  1
     52#define PTE_ET_ENTRY       2
     53
     54#define PTE_ACC_USER_RO_KERNEL_RO    0
     55#define PTE_ACC_USER_RW_KERNEL_RW    1
     56#define PTE_ACC_USER_RX_KERNEL_RX    2
     57#define PTE_ACC_USER_RWX_KERNEL_RWX  3
     58#define PTE_ACC_USER_XO_KERNEL_XO    4
     59#define PTE_ACC_USER_RO_KERNEL_RW    5
     60#define PTE_ACC_USER_NO_KERNEL_RX    6
     61#define PTE_ACC_USER_NO_KERNEL_RWX   7
    6262
    6363/* Number of entries in each level. */
     
    143143/** Page Table Descriptor. */
    144144typedef struct {
    145         unsigned int table_pointer: 30;
    146         unsigned int et: 2;
     145        unsigned int table_pointer : 30;
     146        unsigned int et : 2;
    147147} __attribute__((packed)) ptd_t;
    148148
    149149/** Page Table Entry. */
    150150typedef struct {
    151         unsigned int frame_address: 24;
    152         unsigned int cacheable: 1;
    153         unsigned int modified: 1;
    154         unsigned int referenced: 1;
    155         unsigned int acc: 3;
    156         unsigned int et: 2;
     151        unsigned int frame_address : 24;
     152        unsigned int cacheable : 1;
     153        unsigned int modified : 1;
     154        unsigned int referenced : 1;
     155        unsigned int acc : 3;
     156        unsigned int et : 2;
    157157} __attribute__((packed)) pte_t;
    158158
     
    163163NO_TRACE static inline bool pte_is_writeable(pte_t *pt)
    164164{
    165         return (
    166                 pt->acc == PTE_ACC_USER_RW_KERNEL_RW ||
    167                 pt->acc == PTE_ACC_USER_RWX_KERNEL_RWX ||
    168                 pt->acc == PTE_ACC_USER_RO_KERNEL_RW ||
    169                 pt->acc == PTE_ACC_USER_NO_KERNEL_RWX
    170         );
     165        return ((pt->acc == PTE_ACC_USER_RW_KERNEL_RW) ||
     166            (pt->acc == PTE_ACC_USER_RWX_KERNEL_RWX) ||
     167            (pt->acc == PTE_ACC_USER_RO_KERNEL_RW) ||
     168            (pt->acc == PTE_ACC_USER_NO_KERNEL_RWX));
    171169}
    172170
    173171NO_TRACE static inline bool pte_is_executable(pte_t *pt)
    174172{
    175         return (
    176                 pt->acc != PTE_ACC_USER_RO_KERNEL_RO &&
    177                 pt->acc != PTE_ACC_USER_RW_KERNEL_RW &&
    178                 pt->acc != PTE_ACC_USER_RO_KERNEL_RW
    179         );
     173        return ((pt->acc != PTE_ACC_USER_RO_KERNEL_RO) &&
     174            (pt->acc != PTE_ACC_USER_RW_KERNEL_RW) &&
     175            (pt->acc != PTE_ACC_USER_RO_KERNEL_RW));
    180176}
    181177
     
    184180{
    185181        pte_t *p = &pt[i];
    186 
    187         bool notpresent = p->et == 0;
    188 
    189         return (
    190                 (p->cacheable << PAGE_CACHEABLE_SHIFT) |
    191                 (notpresent << PAGE_PRESENT_SHIFT) |
    192                 ((p->acc != PTE_ACC_USER_NO_KERNEL_RX && p->acc != PTE_ACC_USER_NO_KERNEL_RWX) << PAGE_USER_SHIFT) |
    193                 (1 << PAGE_READ_SHIFT) |
    194                 ((
    195                         p->acc == PTE_ACC_USER_RW_KERNEL_RW ||
    196                         p->acc == PTE_ACC_USER_RWX_KERNEL_RWX ||
    197                         p->acc == PTE_ACC_USER_RO_KERNEL_RW ||
    198                         p->acc == PTE_ACC_USER_NO_KERNEL_RWX
    199                 ) << PAGE_WRITE_SHIFT) |
    200                 ((
    201                         p->acc != PTE_ACC_USER_RO_KERNEL_RO &&
    202                         p->acc != PTE_ACC_USER_RW_KERNEL_RW &&
    203                         p->acc != PTE_ACC_USER_RO_KERNEL_RW
    204                 ) << PAGE_EXEC_SHIFT) |
    205                 (1 << PAGE_GLOBAL_SHIFT)
    206         );
     182       
     183        bool notpresent = (p->et == 0);
     184       
     185        return ((p->cacheable << PAGE_CACHEABLE_SHIFT) |
     186            (notpresent << PAGE_PRESENT_SHIFT) |
     187            (((p->acc != PTE_ACC_USER_NO_KERNEL_RX) &&
     188            (p->acc != PTE_ACC_USER_NO_KERNEL_RWX)) << PAGE_USER_SHIFT) |
     189            (1 << PAGE_READ_SHIFT) |
     190            (((p->acc == PTE_ACC_USER_RW_KERNEL_RW) ||
     191            (p->acc == PTE_ACC_USER_RWX_KERNEL_RWX) ||
     192            (p->acc == PTE_ACC_USER_RO_KERNEL_RW) ||
     193            (p->acc == PTE_ACC_USER_NO_KERNEL_RWX)) << PAGE_WRITE_SHIFT) |
     194            (((p->acc != PTE_ACC_USER_RO_KERNEL_RO) &&
     195            (p->acc != PTE_ACC_USER_RW_KERNEL_RW) &&
     196            (p->acc != PTE_ACC_USER_RO_KERNEL_RW)) << PAGE_EXEC_SHIFT) |
     197            (1 << PAGE_GLOBAL_SHIFT));
    207198}
    208199
     
    213204        pte_t *p = &pt[i];
    214205       
    215         p->et = (flags & PAGE_NOT_PRESENT)
    216                 ? PTE_ET_INVALID
    217                 : PTE_ET_DESCRIPTOR;
     206        p->et = (flags & PAGE_NOT_PRESENT) ?
     207            PTE_ET_INVALID : PTE_ET_DESCRIPTOR;
    218208}
    219209
     
    223213{
    224214        pte_t *p = &pt[i];
    225 
     215       
    226216        p->et = PTE_ET_ENTRY;
    227217        p->acc = PTE_ACC_USER_NO_KERNEL_RWX;
     
    240230                }
    241231        }
    242 
     232       
    243233        if (flags & PAGE_NOT_PRESENT)
    244234                p->et = PTE_ET_INVALID;
    245 
     235       
    246236        p->cacheable = (flags & PAGE_CACHEABLE) != 0;
    247237}
     
    252242{
    253243        pte_t *p = &pt[i];
    254 
     244       
    255245        p->et = PTE_ET_DESCRIPTOR;
    256246}
     
    261251{
    262252        pte_t *p = &pt[i];
    263 
     253       
    264254        p->et = PTE_ET_ENTRY;
    265255}
  • kernel/arch/sparc32/include/arch/mm/page_fault.h

    rf6f22cdb r32e8cd1  
    5050typedef struct {
    5151        unsigned int : 14;
    52         unsigned int ebe: 8;
    53         unsigned int l: 2;
    54         unsigned int at: 3;
    55         unsigned int ft: 3;
    56         unsigned int fav: 1;
    57         unsigned int ow: 1;
     52        unsigned int ebe : 8;
     53        unsigned int l : 2;
     54        unsigned int at : 3;
     55        unsigned int ft : 3;
     56        unsigned int fav : 1;
     57        unsigned int ow : 1;
    5858} __attribute__((packed)) mmu_fault_status_t;
    5959
  • kernel/arch/sparc32/include/arch/mm/tlb.h

    rf6f22cdb r32e8cd1  
    3636#define KERN_sparc32_TLB_H_
    3737
    38 #define MMU_CONTROL             0x000
    39 #define MMU_CONTEXT_TABLE       0x100
    40 #define MMU_CONTEXT             0x200
    41 #define MMU_FAULT_STATUS        0x300
    42 #define MMU_FAULT_ADDRESS       0x400
     38#define MMU_CONTROL        0x000
     39#define MMU_CONTEXT_TABLE  0x100
     40#define MMU_CONTEXT        0x200
     41#define MMU_FAULT_STATUS   0x300
     42#define MMU_FAULT_ADDRESS  0x400
    4343
    4444#endif
  • kernel/arch/sparc32/include/arch/proc/task.h

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32leproc
     29/** @addtogroup sparc32proc
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #ifndef KERN_abs32le_TASK_H_
    36 #define KERN_abs32le_TASK_H_
     35#ifndef KERN_sparc32_TASK_H_
     36#define KERN_sparc32_TASK_H_
    3737
    3838#include <typedefs.h>
    3939#include <adt/bitmap.h>
    4040
    41 /*
    42  * On real hardware this structure stores task information
    43  * specific to the architecture.
    44  */
    4541typedef struct {
    4642} task_arch_t;
  • kernel/arch/sparc32/include/arch/register.h

    rf6f22cdb r32e8cd1  
    4242        uint32_t value;
    4343        struct {
    44                 unsigned int impl: 4;
    45                 unsigned int ver: 4;
    46                 unsigned int icc: 4;
     44                unsigned int impl : 4;
     45                unsigned int ver : 4;
     46                unsigned int icc : 4;
    4747                unsigned int : 6;
    48                 unsigned int ec: 1;
    49                 unsigned int ef: 1;
    50                 unsigned int pil: 4;
    51                 unsigned int s: 1;
    52                 unsigned int ps: 1;
    53                 unsigned int et: 1;
    54                 unsigned int cwp: 5;
    55         } __attribute__ ((packed));
     48                unsigned int ec : 1;
     49                unsigned int ef : 1;
     50                unsigned int pil : 4;
     51                unsigned int s : 1;
     52                unsigned int ps : 1;
     53                unsigned int et : 1;
     54                unsigned int cwp : 5;
     55        } __attribute__((packed));
    5656} psr_reg_t;
    5757
  • kernel/arch/sparc32/include/arch/regwin.h

    rf6f22cdb r32e8cd1  
    4242#include <align.h>
    4343
    44 #define UWB_ALIGNMENT   1024
     44/* Window Save Area offsets. */
     45#define L0_OFFSET  0
     46#define L1_OFFSET  4
     47#define L2_OFFSET  8
     48#define L3_OFFSET  12
     49#define L4_OFFSET  16
     50#define L5_OFFSET  20
     51#define L6_OFFSET  24
     52#define L7_OFFSET  28
     53#define I0_OFFSET  32
     54#define I1_OFFSET  36
     55#define I2_OFFSET  40
     56#define I3_OFFSET  44
     57#define I4_OFFSET  48
     58#define I5_OFFSET  52
     59#define I6_OFFSET  56
     60#define I7_OFFSET  60
    4561
    46 /* Window Save Area offsets. */
    47 #define L0_OFFSET       0
    48 #define L1_OFFSET       4
    49 #define L2_OFFSET       8
    50 #define L3_OFFSET       12
    51 #define L4_OFFSET       16
    52 #define L5_OFFSET       20
    53 #define L6_OFFSET       24
    54 #define L7_OFFSET       28
    55 #define I0_OFFSET       32
    56 #define I1_OFFSET       36
    57 #define I2_OFFSET       40
    58 #define I3_OFFSET       44
    59 #define I4_OFFSET       48
    60 #define I5_OFFSET       52
    61 #define I6_OFFSET       56
    62 #define I7_OFFSET       60
    63 
    64 /* Uspace Window Buffer constants. */
    65 #define UWB_SIZE        ((NWINDOWS - 1) * STACK_WINDOW_SAVE_AREA_SIZE)
    66 #define UWB_ALIGNMENT   1024
    67 #define UWB_ASIZE       ALIGN_UP(UWB_SIZE, UWB_ALIGNMENT)
     62/* User space Window Buffer constants. */
     63#define UWB_SIZE       ((NWINDOWS - 1) * STACK_WINDOW_SAVE_AREA_SIZE)
     64#define UWB_ALIGNMENT  1024
     65#define UWB_ASIZE      ALIGN_UP(UWB_SIZE, UWB_ALIGNMENT)
    6866
    6967#endif
  • kernel/arch/sparc32/include/arch/stack.h

    rf6f22cdb r32e8cd1  
    3939#include <config.h>
    4040
    41 #define MEM_STACK_SIZE  STACK_SIZE
     41#define MEM_STACK_SIZE  STACK_SIZE
    4242
    43 #define STACK_ITEM_SIZE                 4
    44 
    45 /** According to SPARC Compliance Definition, every stack frame is 16-byte aligned. */
    46 #define STACK_ALIGNMENT                 8
     43#define STACK_ITEM_SIZE  4
     44#define STACK_ALIGNMENT  8
    4745
    4846/**
    4947 * 16-extended-word save area for %i[0-7] and %l[0-7] registers.
    5048 */
    51 #define STACK_WINDOW_SAVE_AREA_SIZE     (16 * STACK_ITEM_SIZE)
     49#define STACK_WINDOW_SAVE_AREA_SIZE  (16 * STACK_ITEM_SIZE)
    5250
    5351/**
    5452 * Six extended words for first six arguments.
    5553 */
    56 #define STACK_ARG_SAVE_AREA_SIZE        (6 * STACK_ITEM_SIZE)
     54#define STACK_ARG_SAVE_AREA_SIZE  (6 * STACK_ITEM_SIZE)
    5755
    58 /*
     56/**
    5957 * Offsets of arguments on stack.
    6058 */
    61 #define STACK_ARG0                      0
    62 #define STACK_ARG1                      4
    63 #define STACK_ARG2                      8
    64 #define STACK_ARG3                      12
    65 #define STACK_ARG4                      16
    66 #define STACK_ARG5                      20
    67 #define STACK_ARG6                      24
     59#define STACK_ARG0  0
     60#define STACK_ARG1  4
     61#define STACK_ARG2  8
     62#define STACK_ARG3  12
     63#define STACK_ARG4  16
     64#define STACK_ARG5  20
     65#define STACK_ARG6  24
    6866
    6967#endif
  • kernel/arch/sparc32/include/arch/trap.h

    rf6f22cdb r32e8cd1  
    3636#define KERN_sparc32_TRAP_H_
    3737
    38 #define TRAP_ENTRY_SIZE         16
    39 #define TRAP_TABLE_COUNT        256
    40 #define TRAP_TABLE_SIZE         (TRAP_ENTRY_SIZE * TRAP_TABLE_COUNT)
     38#define TRAP_ENTRY_SIZE   16
     39#define TRAP_TABLE_COUNT  256
     40#define TRAP_TABLE_SIZE   (TRAP_ENTRY_SIZE * TRAP_TABLE_COUNT)
    4141
    4242#ifndef __ASM__
     43
    4344extern void *trap_table;
     45
    4446#endif
    4547
  • kernel/arch/sparc32/include/arch/types.h

    rf6f22cdb r32e8cd1  
    3333 */
    3434
    35 #ifndef KERN_sparc32le_TYPES_H_
    36 #define KERN_sparc32le_TYPES_H_
     35#ifndef KERN_sparc32_TYPES_H_
     36#define KERN_sparc32_TYPES_H_
    3737
    3838#define ATOMIC_COUNT_MIN  UINT32_MIN
  • kernel/arch/sparc32/src/context.S

    rf6f22cdb r32e8cd1  
    4545        # them there even if e.g. the thread is migrated to another processor.
    4646        #
    47         #flushw
    48                 mov 7, %g1
    49 1:      subcc %g1, 1, %g1
    50         bg 1b
    51          save %sp, -64, %sp
    52 
     47       
     48        ## flushw
    5349        mov 7, %g1
    54 1:      subcc %g1, 1, %g1
    55         bg 1b
    56          restore
    57 
     50        1:
     51                subcc %g1, 1, %g1
     52                bg 1b
     53       
     54        save %sp, -64, %sp
     55       
     56        mov 7, %g1
     57        1:
     58                subcc %g1, 1, %g1
     59                bg 1b
     60       
     61        restore
     62       
    5863        CONTEXT_SAVE_ARCH_CORE %o0
    5964        retl
     
    7075        # spills.
    7176        #
    72         #rdpr %pstate, %l0
    73         #andn %l0, PSTATE_IE_BIT, %l1
    74         #wrpr %l1, %pstate
    75         #wrpr %g0, 0, %canrestore
    76         #wrpr %g0, 0, %otherwin
    77         #wrpr %g0, NWINDOWS - 2, %cansave
    78         #wrpr %l0, %pstate
     77       
     78        ## rdpr %pstate, %l0
     79        ## andn %l0, PSTATE_IE_BIT, %l1
     80        ## wrpr %l1, %pstate
     81        ## wrpr %g0, 0, %canrestore
     82        ## wrpr %g0, 0, %otherwin
     83        ## wrpr %g0, NWINDOWS - 2, %cansave
     84        ## wrpr %l0, %pstate
     85       
    7986        mov 7, %g1
    80 1:      subcc %g1, 1, %g1
    81         bg 1b
    82          save %sp, -64, %sp
    83 
     87        1:
     88                subcc %g1, 1, %g1
     89                bg 1b
     90       
     91        save %sp, -64, %sp
     92       
    8493        mov 7, %g1
    85 1:      subcc %g1, 1, %g1
    86         bg 1b
    87          restore
    88 
     94        1:
     95                subcc %g1, 1, %g1
     96                bg 1b
     97       
     98        restore
     99       
    89100        CONTEXT_RESTORE_ARCH_CORE %o0
    90101        retl
  • kernel/arch/sparc32/src/cpu/cpu.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    3838#include <print.h>
    3939#include <fpu_context.h>
    40 
    4140
    4241void fpu_disable(void)
     
    5655}
    5756
    58 void cpu_print_report(cpu_t* cpu)
     57void cpu_print_report(cpu_t *cpu)
    5958{
    6059}
  • kernel/arch/sparc32/src/ddi/ddi.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32leddi
     29/** @addtogroup sparc32ddi
    3030 * @{
    3131 */
  • kernel/arch/sparc32/src/debug/stacktrace.c

    rf6f22cdb r32e8cd1  
    3737#include <syscall/copy.h>
    3838#include <typedefs.h>
    39 
    4039#include <arch.h>
    4140#include <arch/stack.h>
    4241
    43 #define FRAME_OFFSET_FP_PREV    14
    44 #define FRAME_OFFSET_RA         15
     42#define FRAME_OFFSET_FP_PREV  14
     43#define FRAME_OFFSET_RA       15
    4544
    46 extern void alloc_window_and_flush(void);
     45static void alloc_window_and_flush(void)
     46{
     47        // FIXME TODO
     48}
    4749
    4850bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
    4951{
    5052        uintptr_t kstack;
    51         uint32_t l1, l2;
     53        uint32_t l1
     54        uint32_t l2;
    5255       
    53         read_from_invalid(&kstack, &l1, &l2);
     56        read_from_invalid(&kstack, &l1, &l2);
    5457        kstack -= 128;
    55 
    56         if (THREAD && (ctx->fp == kstack))
     58       
     59        if ((THREAD) && (ctx->fp == kstack))
    5760                return false;
    58         return ctx->fp != 0;
     61       
     62        return (ctx->fp != 0);
    5963}
    6064
  • kernel/arch/sparc32/src/exception.c

    rf6f22cdb r32e8cd1  
    5656{
    5757        page_fault(n, istate);
    58 //      fault_if_from_uspace(istate, "%s.", __func__);
    59 //      panic_badtrap(istate, n, "%s.", __func__);
    6058}
    6159
     
    113111{
    114112        page_fault(n, istate);
    115 //      fault_if_from_uspace(istate, "%s.", __func__);
    116 //      panic_badtrap(istate, n, "%s.", __func__);
    117113}
    118114
     
    121117{
    122118        page_fault(n, istate);
    123 //      fault_if_from_uspace(istate, "%s.", __func__);
    124 //      panic_badtrap(istate, n, "%s.", __func__);
    125119}
    126120
     
    129123{
    130124        page_fault(n, istate);
    131 //      fault_if_from_uspace(istate, "%s.", __func__);
    132 //      panic_badtrap(istate, n, "%s.", __func__);
    133125}
     126
    134127/** Handle data_access_error. (0x2c) */
    135128void data_access_mmu_miss(int n, istate_t *istate)
     
    146139}
    147140
    148 sysarg_t syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id)
     141sysarg_t syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4,
     142    sysarg_t a5, sysarg_t a6, sysarg_t id)
    149143{
    150 //      printf("syscall %d\n", id);
    151 //      printf("args: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", a1, a2, a3, a4, a5, a6);
    152 //        if (id == 0x4f) {
    153   //          flush_windows();
    154     //        return 0;
    155       //  }
    156    
    157144        return syscall_handler(a1, a2, a3, a4, a5, a6, id);
    158145}
  • kernel/arch/sparc32/src/machine/leon3/leon3.c

    rf6f22cdb r32e8cd1  
    3838#include <arch/asm.h>
    3939#include <arch/machine_func.h>
    40 
    4140#include <arch/machine/leon3/leon3.h>
    42 
    4341#include <genarch/drivers/grlib/uart.h>
    4442#include <genarch/drivers/grlib/irqmp.h>
    4543#include <genarch/srln/srln.h>
    46 
    4744#include <func.h>
    4845#include <config.h>
     
    7067static const char *leon3_get_platform_name(void);
    7168
    72 struct leon3_machine_t
    73 {
     69struct leon3_machine_t {
    7470        bootinfo_t *bootinfo;
    7571        outdev_t *scons_dev;
    7672        grlib_irqmp_t irqmp;
    77         //grlib_timer_t timer;
    7873};
    7974
    8075struct sparc_machine_ops leon3_machine_ops = {
    81         leon3_init,
    82         leon3_cpu_halt,
    83         leon3_get_memory_extents,
    84         leon3_timer_start,
    85         leon3_irq_exception,
    86         leon3_output_init,
    87         leon3_input_init,
    88         leon3_get_irq_count,
    89         leon3_get_platform_name
     76        .machine_init = leon3_init,
     77        .machine_cpu_halt = leon3_cpu_halt,
     78        .machine_get_memory_extents = leon3_get_memory_extents,
     79        .machine_timer_irq_start = leon3_timer_start,
     80        .machine_irq_exception = leon3_irq_exception,
     81        .machine_output_init = leon3_output_init,
     82        .machine_input_init = leon3_input_init,
     83        .machine_get_irq_count = leon3_get_irq_count,
     84        .machine_get_platform_name = leon3_get_platform_name
    9085};
    9186
     
    9590{
    9691        machine.bootinfo = bootinfo;
    97 
    9892        grlib_irqmp_init(&machine.irqmp, bootinfo);
    9993}
     
    10195static void leon3_cpu_halt(void)
    10296{
    103         for (;;);
     97        // FIXME TODO
     98        while (1);
    10499}
    105100
     
    107102{
    108103        *start = LEON3_SDRAM_START;
    109         *size = 64 * 1024 * 1024;//machine.bootinfo->memsize;
     104        *size = 64 * 1024 * 1024;
     105        // FIXME: *size = machine.bootinfo->memsize;
    110106}
    111107
    112108static void leon3_timer_start(void)
    113109{
    114         //machine.timer = grlib_timer_init(machine.bootinfo->timer_base, machine.bootinfo->timer_irq);
     110        // FIXME:
     111        // machine.timer =
     112        //     grlib_timer_init(machine.bootinfo->timer_base,
     113        //     machine.bootinfo->timer_irq);
    115114}
    116115
    117 static void leon3_irq_exception(unsigned int exc_no, istate_t *istate)
     116static void leon3_irq_exception(unsigned int exc, istate_t *istate)
    118117{
    119118        int irqnum = grlib_irqmp_inum_get(&machine.irqmp);
    120 
     119       
    121120        grlib_irqmp_clear(&machine.irqmp, irqnum);
    122 
     121       
    123122        irq_t *irq = irq_dispatch_and_lock(irqnum);
    124123        if (irq) {
     
    131130static void leon3_output_init(void)
    132131{
    133         printf("leon3_output_init\n");
    134         printf("machine.bootinfo=%p, machine.bootinfo->uart_base=0x%08x\n", machine.bootinfo, machine.bootinfo->uart_base);
    135 
    136         machine.scons_dev = grlib_uart_init(machine.bootinfo->uart_base, machine.bootinfo->uart_irq);
    137 
     132        machine.scons_dev =
     133            grlib_uart_init(machine.bootinfo->uart_base,
     134            machine.bootinfo->uart_irq);
     135       
    138136        if (machine.scons_dev)
    139137                stdout_wire(machine.scons_dev);
     
    148146                /* Create input device. */
    149147                scons_inst = (void *)machine.scons_dev->data;
    150 
     148               
    151149                srln_instance_t *srln_instance = srln_init();
    152150                if (srln_instance) {
     
    154152                        indev_t *srln = srln_wire(srln_instance, sink);
    155153                        grlib_uart_input_wire(scons_inst, srln);
    156 
     154                       
    157155                        /* Enable interrupts from UART */
    158                         grlib_irqmp_unmask(&machine.irqmp, machine.bootinfo->uart_irq);
     156                        grlib_irqmp_unmask(&machine.irqmp,
     157                            machine.bootinfo->uart_irq);
    159158                }
    160159        }
     
    171170        return "LEON3";
    172171}
    173 
    174 
  • kernel/arch/sparc32/src/machine_func.c

    rf6f22cdb r32e8cd1  
    3131 */
    3232/** @file
    33  *  @brief Definitions of machine specific functions.
     33 * @brief Definitions of machine specific functions.
    3434 *
    35  *  These functions enable to differentiate more kinds of sparc emulators
    36  *  or CPUs. It's the same concept as "arch" functions on the architecture
    37  *  level.
     35 * These functions enable to differentiate more kinds of SPARC emulators
     36 * or CPUs. It's the same concept as "arch" functions on the architecture
     37 * level.
    3838 */
    3939
     
    5454}
    5555
    56 /** Maps HW devices to the kernel address space using #hw_map. */
     56/** Map HW devices to the kernel address space using #hw_map. */
    5757void machine_init(bootinfo_t *bootinfo)
    5858{
    59         (machine_ops->machine_init)(bootinfo);
     59        machine_ops->machine_init(bootinfo);
    6060}
    6161
    62 
    63 /** Starts timer. */
     62/** Start timer. */
    6463void machine_timer_irq_start(void)
    6564{
    66         (machine_ops->machine_timer_irq_start)();
     65        machine_ops->machine_timer_irq_start();
    6766}
    6867
    69 
    70 /** Halts CPU. */
     68/** Halt CPU. */
    7169void machine_cpu_halt(void)
    7270{
    73         (machine_ops->machine_cpu_halt)();
     71        machine_ops->machine_cpu_halt();
    7472}
    7573
    7674/** Get extents of available memory.
    7775 *
    78  * @param start         Place to store memory start address.
    79  * @param size          Place to store memory size.
     76 * @param start Place to store memory start address.
     77 * @param size  Place to store memory size.
     78 *
    8079 */
    8180void machine_get_memory_extents(uintptr_t *start, size_t *size)
    8281{
    83         (machine_ops->machine_get_memory_extents)(start, size);
     82        machine_ops->machine_get_memory_extents(start, size);
    8483}
    8584
    8685/** Interrupt exception handler.
    8786 *
    88  * @param exc_no Interrupt exception number.
     87 * @param exc    Interrupt exception number.
    8988 * @param istate Saved processor state.
     89 *
    9090 */
    91 void machine_irq_exception(unsigned int exc_no, istate_t *istate)
     91void machine_irq_exception(unsigned int exc, istate_t *istate)
    9292{
    93         (machine_ops->machine_irq_exception)(exc_no, istate);
     93        machine_ops->machine_irq_exception(exc, istate);
    9494}
    9595
    96 /*
    97  * configure the output device.
    98  */
     96/** Configure the output device. */
    9997void machine_output_init(void)
    10098{
    101         (machine_ops->machine_output_init)();
     99        machine_ops->machine_output_init();
    102100}
    103101
    104 /*
    105  * configure the input device.
    106  */
     102/** Configure the input device. */
    107103void machine_input_init(void)
    108104{
    109         (machine_ops->machine_input_init)();
     105        machine_ops->machine_input_init();
    110106}
    111107
     
    113109size_t machine_get_irq_count(void)
    114110{
    115         return (machine_ops->machine_get_irq_count)();
     111        return machine_ops->machine_get_irq_count();
    116112}
    117113
    118 const char * machine_get_platform_name(void)
     114const char *machine_get_platform_name(void)
    119115{
    120116        if (machine_ops->machine_get_platform_name)
    121117                return machine_ops->machine_get_platform_name();
     118       
    122119        return NULL;
    123120}
     121
    124122/** @}
    125123 */
  • kernel/arch/sparc32/src/mm/as.c

    rf6f22cdb r32e8cd1  
    3838#include <genarch/mm/page_pt.h>
    3939
    40 static ptd_t context_table[ASID_MAX_ARCH] __attribute__((aligned (1024)));
     40static ptd_t context_table[ASID_MAX_ARCH] __attribute__((aligned(1024)));
    4141
    4242void as_arch_init(void)
    4343{
    4444        as_operations = &as_pt_operations;
    45         as_context_table = (uintptr_t)&context_table;
     45        as_context_table = (uintptr_t) &context_table;
    4646}
    4747
    4848void as_install_arch(as_t *as)
    4949{
    50         printf("as_install_arch(asid=%d)\n", as->asid);
    51         printf("genarch.page_table=%p\n", as->genarch.page_table);
    52 
    53         context_table[as->asid].table_pointer = (uintptr_t)as->genarch.page_table >> 6;
     50        context_table[as->asid].table_pointer =
     51            (uintptr_t) as->genarch.page_table >> 6;
    5452        context_table[as->asid].et = PTE_ET_DESCRIPTOR;
    5553        asi_u32_write(ASI_MMUREGS, 0x200, as->asid);
  • kernel/arch/sparc32/src/mm/frame.c

    rf6f22cdb r32e8cd1  
    4646        uintptr_t base;
    4747        size_t size;
    48 
    4948        machine_get_memory_extents(&base, &size);
    50 
     49       
    5150        base = ALIGN_UP(base, FRAME_SIZE);
    5251        size = ALIGN_DOWN(size, FRAME_SIZE);
     
    5453        if (!frame_adjust_zone_bounds(low, &base, &size))
    5554                return;
    56 
     55       
    5756        if (low) {
    5857                zone_create(ADDR2PFN(base), SIZE2FRAMES(size),
    5958                    BOOT_PT_START_FRAME + BOOT_PT_SIZE_FRAMES,
    6059                    ZONE_AVAILABLE | ZONE_LOWMEM);
    61 
    62                 printf("low_zone: %d frames\n", SIZE2FRAMES(size));
    6360        } else {
    6461                pfn_t conf = zone_external_conf_alloc(SIZE2FRAMES(size));
     
    6663                        zone_create(ADDR2PFN(base), SIZE2FRAMES(size), conf,
    6764                            ZONE_AVAILABLE | ZONE_HIGHMEM);
    68 
    69                 printf("high zone: %d frames\n", SIZE2FRAMES(size));
    7065        }
    71 
    72         printf("free: %d\n", frame_total_free_get());
    7366}
    7467
    7568void physmem_print(void)
    7669{
    77 
     70        // FIXME TODO
    7871}
    7972
     
    8275{
    8376        frame_common_arch_init(true);
    84 
    85         /* blacklist boot page table */
     77       
     78        /* Blacklist boot page table */
    8679        frame_mark_unavailable(BOOT_PT_START_FRAME, BOOT_PT_SIZE_FRAMES);
    87         printf("free: %d\n", frame_total_free_get());
    88         //machine_frame_init();
    8980}
    9081
     
    9586}
    9687
    97 /** Frees the boot page table. */
    98 /*void boot_page_table_free(void)
    99 {
    100         unsigned int i;
    101         for (i = 0; i < BOOT_PT_SIZE_FRAMES; i++)
    102                 frame_free(i * FRAME_SIZE + BOOT_PT_ADDRESS);
    103 }*/
    104 
    10588/** @}
    10689 */
  • kernel/arch/sparc32/src/mm/page.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32lemm
     29/** @addtogroup sparc32mm
    3030 * @{
    3131 */
     
    5757        int flags = PAGE_CACHEABLE | PAGE_EXEC;
    5858        page_mapping_operations = &pt_mapping_operations;
    59 
     59       
    6060        page_table_lock(AS_KERNEL, true);
    6161       
    6262        /* Kernel identity mapping */
    63         //FIXME: We need to consider the possibility that
    64         //identity_base > identity_size and physmem_end.
    65         //This might lead to overflow if identity_size is too big.
     63        // FIXME:
     64        // We need to consider the possibility that
     65        // identity_base > identity_size and physmem_end.
     66        // This might lead to overflow if identity_size is too big.
    6667        for (uintptr_t cur = PHYSMEM_START_ADDR;
    6768            cur < min(KA2PA(config.identity_base) +
    68                 config.identity_size, config.physmem_end);
     69            config.identity_size, config.physmem_end);
    6970            cur += FRAME_SIZE)
    7071                page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
    7172       
    72 
    7373        page_table_unlock(AS_KERNEL, true);
    7474        as_switch(NULL, AS_KERNEL);
    75 
    76 //      printf("as_context_table=0x%08x\n", as_context_table);
    77 
     75       
    7876        /* Switch MMU to new context table */
    7977        asi_u32_write(ASI_MMUREGS, MMU_CONTEXT_TABLE, KA2PA(as_context_table) >> 4);
    80 
    81         //boot_page_table_free();
    8278}
    8379
     
    8682        uint32_t fault_status = asi_u32_read(ASI_MMUREGS, MMU_FAULT_STATUS);
    8783        uintptr_t fault_address = asi_u32_read(ASI_MMUREGS, MMU_FAULT_ADDRESS);
    88         mmu_fault_status_t *fault = (mmu_fault_status_t *)&fault_status;
    89         mmu_fault_type_t type = (mmu_fault_type_t)fault->at;
    90 
    91 //      printf("page fault on address 0x%08x, status 0x%08x, type %d\n", fault_address, fault_status, type);
    92 
    93         if (type == FAULT_TYPE_LOAD_USER_DATA ||
    94             type == FAULT_TYPE_LOAD_SUPERVISOR_DATA)   
     84        mmu_fault_status_t *fault = (mmu_fault_status_t *) &fault_status;
     85        mmu_fault_type_t type = (mmu_fault_type_t) fault->at;
     86       
     87        if ((type == FAULT_TYPE_LOAD_USER_DATA) ||
     88            (type == FAULT_TYPE_LOAD_SUPERVISOR_DATA))
    9589                as_page_fault(fault_address, PF_ACCESS_READ, istate);
    9690
    97         if (type == FAULT_TYPE_EXECUTE_USER ||
    98             type == FAULT_TYPE_EXECUTE_SUPERVISOR)
     91        if ((type == FAULT_TYPE_EXECUTE_USER) ||
     92            (type == FAULT_TYPE_EXECUTE_SUPERVISOR))
    9993                as_page_fault(fault_address, PF_ACCESS_EXEC, istate);
    10094
    101         if (type == FAULT_TYPE_STORE_USER_DATA ||
    102             type == FAULT_TYPE_STORE_USER_INSTRUCTION ||
    103             type == FAULT_TYPE_STORE_SUPERVISOR_INSTRUCTION ||
    104             type == FAULT_TYPE_STORE_SUPERVISOR_DATA)
     95        if ((type == FAULT_TYPE_STORE_USER_DATA) ||
     96            (type == FAULT_TYPE_STORE_USER_INSTRUCTION) ||
     97            (type == FAULT_TYPE_STORE_SUPERVISOR_INSTRUCTION) ||
     98            (type == FAULT_TYPE_STORE_SUPERVISOR_DATA))
    10599                as_page_fault(fault_address, PF_ACCESS_WRITE, istate);
    106100}
  • kernel/arch/sparc32/src/mm/tlb.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32lemm
     29/** @addtogroup sparc32mm
    3030 * @{
    3131 */
     
    4545}
    4646
    47 void tlb_invalidate_pages(asid_t asid __attribute__((unused)), uintptr_t page, size_t cnt)
     47void tlb_invalidate_pages(asid_t asid __attribute__((unused)), uintptr_t page,
     48    size_t cnt)
    4849{
    4950        tlb_invalidate_all();
  • kernel/arch/sparc32/src/proc/scheduler.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32leproc
     29/** @addtogroup sparc32proc
    3030 * @{
    3131 */
     
    5858                uint32_t l7;
    5959                read_from_invalid(&kernel_sp, &uspace_wbuf, &l7);
    60                 THREAD->arch.uspace_window_buffer = (uint8_t *)uspace_wbuf;
     60                THREAD->arch.uspace_window_buffer = (uint8_t *) uspace_wbuf;
    6161        }
    6262}
  • kernel/arch/sparc32/src/proc/task.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32leproc
     29/** @addtogroup sparc32proc
    3030 * @{
    3131 */
  • kernel/arch/sparc32/src/proc/thread.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32leproc
     29/** @addtogroup sparc32proc
    3030 * @{
    3131 */
     
    6464        } else {
    6565                uintptr_t uw_buf = (uintptr_t) t->arch.uspace_window_buffer;
    66 
     66               
    6767                /*
    6868                 * Mind the possible alignment of the userspace window buffer
  • kernel/arch/sparc32/src/smp/ipi.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
  • kernel/arch/sparc32/src/smp/smp.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
  • kernel/arch/sparc32/src/sparc32.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    3838#include <arch/asm.h>
    3939#include <arch/machine_func.h>
    40 
    4140#include <func.h>
    4241#include <config.h>
     
    5453#include <str.h>
    5554
    56 char memcpy_from_uspace_failover_address;
    57 char memcpy_to_uspace_failover_address;
    58 bootinfo_t machine_bootinfo;
     55static char memcpy_from_uspace_failover_address;
     56static char memcpy_to_uspace_failover_address;
     57static bootinfo_t machine_bootinfo;
    5958
    6059void arch_pre_main(void *unused, bootinfo_t *bootinfo)
     
    6261        init.cnt = min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS);
    6362        memcpy(&machine_bootinfo, bootinfo, sizeof(machine_bootinfo));
    64 
    65         size_t i;
    66         for (i = 0; i < init.cnt; i++) {
     63       
     64        for (size_t i = 0; i < init.cnt; i++) {
    6765                init.tasks[i].paddr = KA2PA(bootinfo->tasks[i].addr);
    6866                init.tasks[i].size = bootinfo->tasks[i].size;
     
    7068                    bootinfo->tasks[i].name);
    7169        }
    72 
     70       
    7371        machine_ops_init();
    7472}
     
    8280void arch_post_mm_init(void)
    8381{
    84         /* Test register windows */
    85         write_to_invalid(0xdeadbeef, 0xcafebabe, 0);
    86         func1();
    87 
    8882        machine_init(&machine_bootinfo);
    89 
     83       
    9084        if (config.cpu_active == 1) {
    9185                /* Initialize IRQ routing */
     
    9589                zone_merge_all();
    9690        }
    97 
     91       
    9892        machine_output_init();
    9993}
     
    110104void arch_post_smp_init(void)
    111105{
    112 //      machine_input_init();
    113106}
    114107
  • kernel/arch/sparc32/src/start.S

    rf6f22cdb r32e8cd1  
    3838        set trap_table, %g1
    3939        mov %g1, %tbr
    40 
    41         mov     %psr, %g1               ! Initialize WIM
    42         add     %g1, 1, %g2
    43         and     %g2, 0x7, %g2
    44         set     1, %g3
    45         sll     %g3, %g2, %g3
    46         mov    %g3, %wim
    47 
    48         or      %g1, 0x20, %g1
    49         or      %g1, 0xf00, %g1         ! PIL
    50         wr      %g1, %psr
    51 
    52         set     boot_stack, %sp
    53         mov     %sp, %fp
    54         sub     %sp, 96, %sp
    55 
    56         mov     %o1, %l1
    57         set     0xdeadbeef, %o0
    58         set     0xdeadbeef, %o1
    59         set     0, %o2
     40       
     41        mov %psr, %g1           ! Initialize WIM
     42        add %g1, 1, %g2
     43        and %g2, 0x7, %g2
     44        set 1, %g3
     45        sll %g3, %g2, %g3
     46        mov %g3, %wim
     47       
     48        or %g1, 0x20, %g1
     49        or %g1, 0xf00, %g1      ! PIL
     50        wr %g1, %psr
     51       
     52        set boot_stack, %sp
     53        mov %sp, %fp
     54        sub %sp, 96, %sp
     55       
     56        mov %o1, %l1
     57        set 0xdeadbeef, %o0
     58        set 0xdeadbeef, %o1
     59        set 0, %o2
    6060        call write_to_invalid
    6161        nop
    62 
    63         mov     %l1, %o1
     62       
     63        mov %l1, %o1
    6464        call arch_pre_main
    6565        nop
    66 
     66       
    6767        call main_bsp
    6868        nop
     
    7272        cmp %o0, '\n'
    7373        bne skip
     74       
    7475        set '\r', %l1
    7576        sta %l1, [%l0] 0x1c
    76 skip:   sta %o0, [%l0] 0x1c
    77         retl
    78         nop
     77       
     78        skip:
     79                sta %o0, [%l0] 0x1c
     80                retl
     81                nop
    7982
    8083kernel_sp:
  • kernel/arch/sparc32/src/trap_table.S

    rf6f22cdb r32e8cd1  
    4646        clr \reg
    4747        mov %wim, %g5
    48 1:      andcc %g5, 1, %g0
    49         bne 2f
    50         nop
    51         srl %g5, 1, %g5
    52         inc \reg
    53         b 1b
    54 2:      nop
    55 
     48       
     49        1:
     50                andcc %g5, 1, %g0
     51                bne 2f
     52                nop
     53                srl %g5, 1, %g5
     54                inc \reg
     55                b 1b
     56       
     57        2:
     58                nop
    5659.endm
    5760
     
    6366.macro switch_to_invalid saved_wim, saved_psr
    6467        get_wim_number %l3
    65         mov %wim, \saved_wim    ! save WIM
    66         mov %g0, %wim           ! clear WIM
    67         mov %psr, \saved_psr    ! read PSR
     68        mov %wim, \saved_wim    ! save WIM
     69        mov %g0, %wim           ! clear WIM
     70        mov %psr, \saved_psr    ! read PSR
    6871        and \saved_psr, 0xfffffff0, %l4
    69         or %l4, %l3, %l3        ! set CWP
    70         mov %l3, %psr           ! write PSR
    71         nop
    72         nop
    73         nop
    74         nop                     ! wait for PSR to be effective
    75 .endm   
     72        or %l4, %l3, %l3        ! set CWP
     73        mov %l3, %psr           ! write PSR
     74        nop
     75        nop
     76        nop
     77        nop                     ! wait for PSR to be effective
     78.endm
    7679
    7780.macro switch_back wim, psr
    78         mov \wim, %wim          ! saved WIM
    79         mov \psr, %psr          ! saved PSR
     81        mov \wim, %wim          ! saved WIM
     82        mov \psr, %psr          ! saved PSR
    8083        nop
    8184        nop
     
    8992        sll %l3, 7, %l4
    9093        srl %l3, 1, %l3
    91         or  %l3, %l4, %l3
     94        or %l3, %l4, %l3
    9295        and %l3, 0xff, %l3
    9396        mov %g0, %wim
    94 
     97       
    9598        mov %l5, %g5
    9699        mov %l6, %g6
    97100        mov %l7, %g7
    98 
     101       
    99102        save
    100         std %l0, [%sp +  0]
    101         std %l2, [%sp +  8]
     103        std %l0, [%sp + 0]
     104        std %l2, [%sp + 8]
    102105        std %l4, [%sp + 16]
    103106        std %l6, [%sp + 24]
     
    117120        sll %l3, 7, %l4
    118121        srl %l3, 1, %l3
    119         or  %l3, %l4, %l3
     122        or %l3, %l4, %l3
    120123        and %l3, 0xff, %l3
    121124        mov %g0, %wim
    122125        mov \uwb, %g3
    123 
     126       
    124127        mov %l5, %g5
    125128        mov %l6, %g6
    126129        mov %l7, %g7
    127 
     130       
    128131        save
    129         std %l0, [%g3 +  0]
    130         std %l2, [%g3 +  8]
     132        std %l0, [%g3 + 0]
     133        std %l2, [%g3 + 8]
    131134        std %l4, [%g3 + 16]
    132135        std %l6, [%g3 + 24]
     
    148151        srl %l3, 7, %l4
    149152        sll %l3, 1, %l3
    150         or  %l3, %l4, %l3
     153        or %l3, %l4, %l3
    151154        and %l3, 0xff, %l3
    152155       
     
    160163        mov %g6, %l6
    161164        mov %g7, %l7
    162         save   
    163 
    164         ldd [%sp +  0], %l0
    165         ldd [%sp +  8], %l2
    166         ldd [%sp + 16], %l4
    167         ldd [%sp + 24], %l6
    168         ldd [%sp + 32], %i0
    169         ldd [%sp + 40], %i2
    170         ldd [%sp + 48], %i4
    171         ldd [%sp + 56], %i6
     165        save
     166       
     167        ldd [%sp +  0], %l0
     168        ldd [%sp +  8], %l2
     169        ldd [%sp + 16], %l4
     170        ldd [%sp + 24], %l6
     171        ldd [%sp + 32], %i0
     172        ldd [%sp + 40], %i2
     173        ldd [%sp + 48], %i4
     174        ldd [%sp + 56], %i6
    172175        save
    173176       
     
    179182        srl %l3, 7, %l4
    180183        sll %l3, 1, %l3
    181         or  %l3, %l4, %l3
     184        or %l3, %l4, %l3
    182185        and %l3, 0xff, %l3
    183 
     186       
    184187        mov %g0, %wim
    185188        restore
     
    191194        mov %g6, %l6
    192195        mov %g7, %l7
    193         save   
    194 
     196        save
     197       
    195198        sub \uwb, 64, \uwb
    196         ldd [\uwb +  0], %l0
    197         ldd [\uwb +  8], %l2
     199        ldd [\uwb + 0], %l0
     200        ldd [\uwb + 8], %l2
    198201        ldd [\uwb + 16], %l4
    199202        ldd [\uwb + 24], %l6
     
    203206        ldd [\uwb + 56], %i6
    204207        save
    205 
     208       
    206209        mov %l3, %wim
    207210.endm
     
    261264window_overflow_trap:
    262265        mov %g7, %l0
    263 
     266       
    264267        /* Check whether previous mode was usermode */
    265268        mov %psr, %l4
     
    268271        bne 1f
    269272        nop
    270 
    271         /* userspace: */
    272         /* time to check whether desired stack page is mapped
    273          * on the MMU. if so, process with saving window directly.
    274          * if not, go to preemptible trap handler */
     273       
     274        /* User space: */
     275       
     276        /*
     277         * Time to check whether desired stack page is mapped
     278         * on the MMU. If so, process with saving window directly.
     279         * If not, go to preemptible trap handler.
     280         */
    275281        mov %wim, %g5
    276282        mov %g0, %wim
     
    279285        restore
    280286        mov %g5, %wim
    281 
     287       
    282288        /* Check beginning of %sp */
    283289        and %g4, 0xfffff000, %l4
     
    286292        bne 1f
    287293        nop
    288 
    289         /* prepare args for preemptible handler */
     294       
     295        /* Prepare args for preemptible handler */
    290296        mov %g4, %o0
    291297        set preemptible_save_uspace, %o2
    292298        b preemptible_trap
    293299        nop
    294 
     300       
    295301        /* Check end of %sp */
    296302        add %g4, 56, %g4
     
    300306        bne 1f
    301307        nop
    302 
    303         /* prepare args for preemptible handler */
     308       
     309        /* Prepare args for preemptible handler */
    304310        mov %g4, %o0
    305311        set preemptible_save_uspace, %o2
    306312        b preemptible_trap
    307313        nop
    308 
    309         /* kernel: */
    310 1:      /* rotate WIM on bit right, we have 8 windows */
    311         mov %wim, %l3
    312         sll %l3, 7, %l4
    313         srl %l3, 1, %l3
    314         or  %l3, %l4, %l3
    315         and %l3, 0xff, %l3
    316 
    317         /* disable WIM traps */
    318         mov %g0,%wim
    319         nop; nop; nop
    320 
    321         /* Save invalid window data */
    322         mov %l5, %g5            ! kernel stack pointer
    323         mov %l6, %g6            ! kernel wbuf
    324         mov %l7, %g7
    325 
    326 
    327         /* we should check whether window needs to be saved
    328          * to kernel stack or uwb
    329          */
    330         cmp %g7, 0
    331         bne 2f
    332         nop
    333 
    334         /* dump registers to stack */
     314       
     315        /* Kernel: */
     316       
     317        1:
     318                /* Rotate WIM on bit right, we have 8 windows */
     319                mov %wim, %l3
     320                sll %l3, 7, %l4
     321                srl %l3, 1, %l3
     322                or %l3, %l4, %l3
     323                and %l3, 0xff, %l3
     324               
     325                /* Disable WIM traps */
     326                mov %g0,%wim
     327                nop; nop; nop
     328               
     329                /* Save invalid window data */
     330                mov %l5, %g5        ! kernel stack pointer
     331                mov %l6, %g6        ! kernel wbuf
     332                mov %l7, %g7
     333               
     334                /*
     335                 * We should check whether window needs to be saved
     336                 * to kernel stack or uwb.
     337                 */
     338                cmp %g7, 0
     339                bne 2f
     340                nop
     341       
     342        /* Dump registers to stack */
    335343        save
    336         std %l0, [%sp +  0]
    337         std %l2, [%sp +  8]
     344        std %l0, [%sp + 0]
     345        std %l2, [%sp + 8]
    338346        std %l4, [%sp + 16]
    339347        std %l6, [%sp + 24]
     
    344352        b 3f
    345353        nop
    346 
    347         /* dump registers to uwb */
    348 2:      save
    349         std %l0, [%g6 +  0]
    350         std %l2, [%g6 +  8]
    351         std %l4, [%g6 + 16]
    352         std %l6, [%g6 + 24]
    353         std %i0, [%g6 + 32]
    354         std %i2, [%g6 + 40]
    355         std %i4, [%g6 + 48]
    356         std %i6, [%g6 + 56]
    357         add %g6, 64, %g6
    358 
    359         /* check whether it's the last user window to be saved */
    360         and %g7, 0x7, %l5
    361         mov %psr, %l4
    362         and %l4, 0x7, %l4
    363         cmp %l5, %l4
    364         bne 3f
    365         nop
    366 
    367         /* clear uspace window mark */
     354       
     355        /* Dump registers to uwb */
     356        2:
     357                save
     358                std %l0, [%g6 + 0]
     359                std %l2, [%g6 + 8]
     360                std %l4, [%g6 + 16]
     361                std %l6, [%g6 + 24]
     362                std %i0, [%g6 + 32]
     363                std %i2, [%g6 + 40]
     364                std %i4, [%g6 + 48]
     365                std %i6, [%g6 + 56]
     366                add %g6, 64, %g6
     367               
     368                /* Check whether it's the last user window to be saved */
     369                and %g7, 0x7, %l5
     370                mov %psr, %l4
     371                and %l4, 0x7, %l4
     372                cmp %l5, %l4
     373                bne 3f
     374                nop
     375       
     376        /* Clear uspace window mark */
    368377        clr %g7
    369 
    370 3:      /* back to where we should be */
    371         mov %g5, %l5
    372         mov %g6, %l6
    373         mov %g7, %l7
    374         restore
    375 
    376         /* set new value of window */
    377         mov %l3,%wim
    378         nop; nop; nop
    379 
    380         /* go home */
    381         mov %l0, %g7
    382         jmp %l1
    383         rett %l2
     378       
     379        3:
     380                /* Back to where we should be */
     381                mov %g5, %l5
     382                mov %g6, %l6
     383                mov %g7, %l7
     384                restore
     385               
     386                /* Set new value of window */
     387                mov %l3,%wim
     388                nop; nop; nop
     389               
     390                /* Go home */
     391                mov %l0, %g7
     392                jmp %l1
     393                rett %l2
    384394
    385395window_underflow_trap:
    386396        mov %g7, %l0
    387 
     397       
    388398        /* Check whether previous mode was usermode */
    389399        mov %psr, %l4
     
    392402        bne 1f
    393403        nop
    394 
    395         /* userspace: */
    396         /* time to check whether desired stack page is mapped
    397          * on the MMU. if so, process with saving window directly.
    398          * if not, go to preemptible trap handler */
     404       
     405        /* User space: */
     406       
     407        /*
     408         * Time to check whether desired stack page is mapped
     409         * on the MMU. If so, process with saving window directly.
     410         * If not, go to preemptible trap handler.
     411         */
    399412        mov %wim, %g5
    400413        mov %g0, %wim
     
    410423        bne 1f
    411424        nop
    412 
    413         /* prepare args for preemptible handler */
     425       
     426        /* Prepare args for preemptible handler */
    414427        mov %g4, %o0
    415428        set preemptible_restore_uspace, %o2
    416429        b preemptible_trap
    417430        nop
    418 
    419         /* rotate WIM on bit LEFT, we have 8 windows */
    420 1:      mov %wim,%l3
    421         srl %l3,7,%l4
    422         sll %l3,1,%l3
    423         or  %l3,%l4,%l3
    424         and %l3, 0xff,%l3
    425 
    426         /* disable WIM traps */
    427         mov %g0,%wim
    428         nop; nop; nop
    429 
    430         /* kernel: */
     431       
     432       
     433        1:
     434                /* Rotate WIM on bit LEFT, we have 8 windows */
     435                mov %wim, %l3
     436                srl %l3, 7, %l4
     437                sll %l3, 1, %l3
     438                or %l3, %l4, %l3
     439                and %l3, 0xff, %l3
     440               
     441                /* Disable WIM traps */
     442                mov %g0, %wim
     443                nop; nop; nop
     444               
     445        /* Kernel: */
    431446        restore
    432447        restore
    433         mov %l5, %g5            ! kernel stack pointer
    434         mov %l6, %g6            ! kernel wbuf
     448        mov %l5, %g5            ! kernel stack pointer
     449        mov %l6, %g6            ! kernel wbuf
    435450        mov %l7, %g7
    436 
    437         ldd [%sp + 0], %l0
    438         ldd [%sp + 8], %l2
    439         ldd [%sp + 16], %l4
    440         ldd [%sp + 24], %l6
    441         ldd [%sp + 32], %i0
    442         ldd [%sp + 40], %i2
    443         ldd [%sp + 48], %i4
    444         ldd [%sp + 56], %i6
     451       
     452        ldd [%sp + 0], %l0
     453        ldd [%sp + 8], %l2
     454        ldd [%sp + 16], %l4
     455        ldd [%sp + 24], %l6
     456        ldd [%sp + 32], %i0
     457        ldd [%sp + 40], %i2
     458        ldd [%sp + 48], %i4
     459        ldd [%sp + 56], %i6
    445460        b 2f
    446461        nop
    447 
    448 2:      /* Restore invalid window data */
    449         restore
    450         mov %g5, %l5
    451         mov %g6, %l6
    452         mov %g7, %l7
    453         save
    454         save
    455         save
    456 
    457         /* Set new value of window */
    458         mov %l3,%wim
    459         nop; nop; nop
    460 
    461         /* go home */
    462         mov %l0, %g7
    463         jmp %l1
    464         rett %l2
     462       
     463        2:
     464                /* Restore invalid window data */
     465                restore
     466                mov %g5, %l5
     467                mov %g6, %l6
     468                mov %g7, %l7
     469                save
     470                save
     471                save
     472               
     473                /* Set new value of window */
     474                mov %l3, %wim
     475                nop; nop; nop
     476               
     477                /* Go home */
     478                mov %l0, %g7
     479                jmp %l1
     480                rett %l2
    465481
    466482flush_windows:
    467         mov 7, %g1
    468 1:      subcc %g1, 1, %g1
    469         bg 1b
    470         save %sp, -64, %sp
    471 
    472483        mov 7, %g1
    473 1:      subcc %g1, 1, %g1
    474         bg 1b
    475         restore
    476 
    477         retl
    478         nop
     484        1:
     485                subcc %g1, 1, %g1
     486                bg 1b
     487                save %sp, -64, %sp
     488       
     489        mov 7, %g1
     490        1:
     491                subcc %g1, 1, %g1
     492                bg 1b
     493                restore
     494       
     495        retl
     496        nop
    479497
    480498preemptible_trap:
    481499        /* Save %g7 */
    482500        mov %g7, %l0
    483 
     501       
    484502        /* Check whether we landed in invalid window */
    485503        get_wim_number %g6
     
    488506        bne 4f
    489507        nop
    490 
    491         /* We are in invalid window. Check whether previous mode was usermode */
     508       
     509        /* We are in invalid window. Check whether previous mode was usermode. */
    492510        if_from_kernel 3f
    493 
    494         /* Trap originated from uspace */
     511       
     512        /* Trap originated from user space */
    495513        /* Kernel stack pointer is at %l5, uwb is at %l6 */
    496514        inline_save_uspace %l6
    497 
    498         /* set uspace window mark */
     515       
     516        /* Set uspace window mark */
    499517        mov %psr, %l7
    500518        inc %l7
     
    503521        b 4f
    504522        nop
    505 
    506 3:      /* Trap originated from kernel */
    507         inline_save_kernel
    508 
    509 4:      /* Check whether previous mode was usermode */
    510         if_from_kernel 5f
    511 
     523       
     524        3:
     525                /* Trap originated from kernel */
     526                inline_save_kernel
     527       
     528        4:
     529                /* Check whether previous mode was user mode */
     530                if_from_kernel 5f
     531       
    512532        /* Load kernel stack pointer from invalid window */
    513533        switch_to_invalid %g5, %g6
    514 
     534       
    515535        /* set uspace window mark */
    516536        mov %g6, %l7
     
    518538        and %l7, 0x7, %l7
    519539        or %l7, 0x10, %l7
    520 
     540       
    521541        /* Save stack pointer */
    522542        mov %l5, %g7
    523543        switch_back %g5, %g6
    524544        mov %g7, %sp
    525 //      mov %sp, %fp
    526 
    527 5:      /* Set up stack frame */
    528         sub %sp, 128, %sp
    529 
    530         /* Save trap data on stack */
    531         mov %psr, %l5
    532         st %l1, [%sp + 92]
    533         st %l2, [%sp + 96]
    534         st %l5, [%sp + 100]
    535         st %g1, [%sp + 104]
    536         st %g2, [%sp + 108]
    537         st %g3, [%sp + 112]
    538         st %g4, [%sp + 116]
    539         st %l0, [%sp + 120]
    540 
    541         /* Enable traps */
    542         mov %psr, %l0
    543         or %l0, (1 << 5), %l0
    544         mov %l0, %psr
    545         nop
    546         nop
    547         nop
    548         nop
    549 
    550         /* Get UWB address */
    551 //      switch_to_invalid %g5, %g6
    552 //      mov %l6, %g1
    553 //      switch_back %g5, %g6
    554 
    555 #       /* Flush windows to stack */
    556         call flush_windows
    557         nop
    558 /*
    559         get_wim_number %g2
    560         get_cwp %g5
    561         mov %psr, %g6
    562 
    563         sub %g2, 1, %g4
    564         and %g4, 0x7, %g4
    565 0:      mov %g0, %wim
    566         cmp %g5, %g4
    567         be 0f
    568         nop
    569 
    570         restore
    571         add %g1, 64, %g1
    572         std %l0, [%g1  + 0]
    573         std %l2, [%g1 +  8]
    574         std %l4, [%g1 + 16]
    575         std %l6, [%g1 + 24]
    576         std %i0, [%g1 + 32]
    577         std %l2, [%g1 + 40]
    578         std %l4, [%g1 + 48]
    579         std %l6, [%g1 + 56]
    580         inc %g5
    581         and %g5, 0x7, %g5
    582         ba 0b
    583         nop
    584 
    585 0:      inc %g4
    586         and %g4, 0x7, %g4
    587         clr %g5
    588         inc %g5
    589         sll %g5, %g4, %g5
    590 
    591         * Write values to invalid window and switch back *
    592         mov %g7, %l5
    593         mov %g1, %l6
    594         clr %l7
    595         switch_back %g5, %g6
    596 */
    597 
    598         /* Jump to actual subroutine */
    599         call %o2
    600         add %sp, 128, %o1
    601 
    602         /* Return from handler */
    603         ld [%sp + 92], %l1
    604         ld [%sp + 96], %l2
    605         ld [%sp + 100], %l0
    606         mov %l0, %psr
    607         nop
    608         nop
    609         nop
    610         nop
    611         nop
    612 
    613         /* If trap originated from uspace, clear uspace window mark and save uwb address for future use */
    614         if_from_kernel 9f
    615         switch_to_invalid %g5, %g6
    616         clr %l7
    617         mov %l5, %g2
    618         mov %l6, %g7
    619         switch_back %g5, %g6
    620         mov %g7, %g1
    621 
    622         /* If trap originated from uspace, restore all windows from UWB */
    623         /* UWB pointer is at %g1 */
    624 0:      mov %g0, %wim
    625         clr %g5
    626         andcc %g1, UWB_ALIGNMENT - 1, %g0
    627         bz 0f
    628         nop
    629 
     545        ##      mov %sp, %fp
     546       
     547        5:
     548                /* Set up stack frame */
     549                sub %sp, 128, %sp
     550               
     551                /* Save trap data on stack */
     552                mov %psr, %l5
     553                st %l1, [%sp + 92]
     554                st %l2, [%sp + 96]
     555                st %l5, [%sp + 100]
     556                st %g1, [%sp + 104]
     557                st %g2, [%sp + 108]
     558                st %g3, [%sp + 112]
     559                st %g4, [%sp + 116]
     560                st %l0, [%sp + 120]
     561               
     562                /* Enable traps */
     563                mov %psr, %l0
     564                or %l0, (1 << 5), %l0
     565                mov %l0, %psr
     566                nop
     567                nop
     568                nop
     569                nop
     570               
     571                /* Get UWB address */
     572                ##      switch_to_invalid %g5, %g6
     573                ##      mov %l6, %g1
     574                ##      switch_back %g5, %g6
     575               
     576                /* Flush windows to stack */
     577                call flush_windows
     578                nop
     579               
     580                /* Jump to actual subroutine */
     581                call %o2
     582                add %sp, 128, %o1
     583               
     584                /* Return from handler */
     585                ld [%sp + 92], %l1
     586                ld [%sp + 96], %l2
     587                ld [%sp + 100], %l0
     588                mov %l0, %psr
     589                nop
     590                nop
     591                nop
     592                nop
     593                nop
     594               
     595                /*
     596                 * If trap originated from user space, clear user space window mark
     597                 * and save uwb address for future use.
     598                 */
     599                if_from_kernel 9f
     600                switch_to_invalid %g5, %g6
     601                clr %l7
     602                mov %l5, %g2
     603                mov %l6, %g7
     604                switch_back %g5, %g6
     605                mov %g7, %g1
     606               
     607                /* If trap originated from user space, restore all windows from UWB */
     608                /* UWB pointer is at %g1 */
     609        0:
     610                mov %g0, %wim
     611                clr %g5
     612                andcc %g1, UWB_ALIGNMENT - 1, %g0
     613                bz 0f
     614                nop
     615       
    630616        restore
    631617        sub %g1, 64, %g1
    632         ldd [%g1 +  0], %l0
    633         ldd [%g1 +  8], %l2
     618        ldd [%g1 + 0], %l0
     619        ldd [%g1 + 8], %l2
    634620        ldd [%g1 + 16], %l4
    635621        ldd [%g1 + 24], %l6
     
    642628        ba 0b
    643629        nop
    644 
    645         /* We've restored all uspace windows. Now time to
    646          * fix CWP and WIM
     630       
     631        /*
     632         * We've restored all uspace windows. Now time to
     633         * fix CWP and WIM.
    647634         */
    648 0:      restore
    649         get_cwp %g7
    650         clr %g5
    651         inc %g5
    652         sll %g5, %g7, %g5
    653 
    654         /* Write values to invalid window and switch back */
    655         mov %g2, %l5
    656         mov %g1, %l6
    657         clr %l7
    658         switch_back %g5, %g6
    659 
    660         mov %sp, %l3
    661         sub %g2, 128, %sp
    662         ld [%sp + 104], %g1
    663         ld [%sp + 108], %g2
    664         ld [%sp + 112], %g3
    665         ld [%sp + 116], %g4
    666         ld [%sp + 120], %g7
    667         mov %l3, %sp
    668         b 10f
    669         nop
    670 
    671 9:      inline_restore_kernel
    672 
    673         ld [%sp + 104], %g1
    674         ld [%sp + 108], %g2
    675         ld [%sp + 112], %g3
    676         ld [%sp + 116], %g4
    677         ld [%sp + 120], %g7
    678 
    679 10:     jmp %l1
    680         rett %l2
     635        0:
     636                restore
     637                get_cwp %g7
     638                clr %g5
     639                inc %g5
     640                sll %g5, %g7, %g5
     641               
     642                /* Write values to invalid window and switch back */
     643                mov %g2, %l5
     644                mov %g1, %l6
     645                clr %l7
     646                switch_back %g5, %g6
     647               
     648                mov %sp, %l3
     649                sub %g2, 128, %sp
     650                ld [%sp + 104], %g1
     651                ld [%sp + 108], %g2
     652                ld [%sp + 112], %g3
     653                ld [%sp + 116], %g4
     654                ld [%sp + 120], %g7
     655                mov %l3, %sp
     656                b 10f
     657                nop
     658       
     659        9:
     660                inline_restore_kernel
     661                ld [%sp + 104], %g1
     662                ld [%sp + 108], %g2
     663                ld [%sp + 112], %g3
     664                ld [%sp + 116], %g4
     665                ld [%sp + 120], %g7
     666       
     667        10:
     668                jmp %l1
     669                rett %l2
    681670
    682671interrupt_trap:
    683672        /* Save %g7 */
    684673        mov %g7, %l0
    685 
     674       
    686675        /* Check whether we landed in invalid window */
    687676        get_wim_number %g6
     
    690679        bne 4f
    691680        nop
    692 
    693         /* We are in invalid window. Check whether previous mode was usermode */
     681       
     682        /* We are in invalid window. Check whether previous mode was user mode */
    694683        if_from_kernel 3f
    695 
    696         /* Trap originated from uspace */
     684       
     685        /* Trap originated from user space */
    697686        /* Kernel stack pointer is at %l5, uwb is at %l6 */
    698687        inline_save_uspace %l6
    699 
    700         /* set uspace window mark */
     688       
     689        /* Set uspace window mark */
    701690        mov %psr, %l7
    702691        inc %l7
     
    705694        b 4f
    706695        nop
    707 
    708 3:      /* Trap originated from kernel */
    709         inline_save_kernel
    710 
    711 4:      /* Check whether previous mode was usermode */
    712         if_from_kernel 5f
    713 
    714         /* Load kernel stack pointer from invalid window */
    715         switch_to_invalid %g5, %g6
    716 
    717         /* set uspace window mark */
    718         mov %g6, %l7
    719         inc %l7
    720         and %l7, 0x7, %l7
    721         or %l7, 0x10, %l7
    722 
    723         /* Save stack pointer */
    724         mov %l5, %g7
    725         switch_back %g5, %g6
    726         mov %g7, %sp
    727 //      mov %sp, %fp
    728 
    729 5:      /* Set up stack frame */
    730         sub %sp, 128, %sp
    731 
    732         /* Save trap data on stack */
    733         mov %psr, %l5
    734         st %l1, [%sp + 92]
    735         st %l2, [%sp + 96]
    736         st %l5, [%sp + 100]
    737         st %g1, [%sp + 104]
    738         st %g2, [%sp + 108]
    739         st %g3, [%sp + 112]
    740         st %g4, [%sp + 116]
    741         st %l0, [%sp + 120]
    742 
    743         /* Enable traps */
    744         mov %psr, %l0
    745         or %l0, (1 << 5), %l0
    746         mov %l0, %psr
    747         nop
    748         nop
    749         nop
    750         nop
    751 
    752         /* Flush windows to stack */
    753         call flush_windows
    754         nop
    755 
    756         /* Jump to actual subroutine */
    757         mov %g2, %o0
    758         call irq_exception
    759         add %sp, 128, %o1
    760 
    761         /* Return from handler */
    762         ld [%sp + 92], %l1
    763         ld [%sp + 96], %l2
    764         ld [%sp + 100], %l0
    765         mov %l0, %psr
    766         nop
    767         nop
    768         nop
    769         nop
    770         nop
    771 
    772         /* If trap originated from uspace, clear uspace window mark and save uwb address for future use */
    773         if_from_kernel 6f
    774         switch_to_invalid %g5, %g6
    775         clr %l7
    776         mov %l5, %g2
    777         mov %l6, %g7
    778         switch_back %g5, %g6
    779         mov %g7, %g1
    780 
    781         /* If trap originated from uspace, restore all windows from UWB */
    782         /* UWB pointer is at %g1 */
    783 0:      mov %g0, %wim
    784         clr %g5
    785         andcc %g1, UWB_ALIGNMENT - 1, %g0
    786         bz 0f
    787         nop
    788 
    789         restore
    790         sub %g1, 64, %g1
    791         ldd [%g1 +  0], %l0
    792         ldd [%g1 +  8], %l2
    793         ldd [%g1 + 16], %l4
    794         ldd [%g1 + 24], %l6
    795         ldd [%g1 + 32], %i0
    796         ldd [%g1 + 40], %i2
    797         ldd [%g1 + 48], %i4
    798         ldd [%g1 + 56], %i6
    799         inc %g5
    800         and %g5, 0x7, %g5
    801         ba 0b
    802         nop
    803 
    804         /* We've restored all uspace windows. Now time to
    805          * fix CWP and WIM
     696       
     697        3:
     698                /* Trap originated from kernel */
     699                inline_save_kernel
     700       
     701        4:
     702                /* Check whether previous mode was user mode */
     703                if_from_kernel 5f
     704               
     705                /* Load kernel stack pointer from invalid window */
     706                switch_to_invalid %g5, %g6
     707               
     708                /* Set user space window mark */
     709                mov %g6, %l7
     710                inc %l7
     711                and %l7, 0x7, %l7
     712                or %l7, 0x10, %l7
     713               
     714                /* Save stack pointer */
     715                mov %l5, %g7
     716                switch_back %g5, %g6
     717                mov %g7, %sp
     718                ##      mov %sp, %fp
     719       
     720        5:
     721                /* Set up stack frame */
     722                sub %sp, 128, %sp
     723               
     724                /* Save trap data on stack */
     725                mov %psr, %l5
     726                st %l1, [%sp + 92]
     727                st %l2, [%sp + 96]
     728                st %l5, [%sp + 100]
     729                st %g1, [%sp + 104]
     730                st %g2, [%sp + 108]
     731                st %g3, [%sp + 112]
     732                st %g4, [%sp + 116]
     733                st %l0, [%sp + 120]
     734               
     735                /* Enable traps */
     736                mov %psr, %l0
     737                or %l0, (1 << 5), %l0
     738                mov %l0, %psr
     739                nop
     740                nop
     741                nop
     742                nop
     743               
     744                /* Flush windows to stack */
     745                call flush_windows
     746                nop
     747               
     748                /* Jump to actual subroutine */
     749                mov %g2, %o0
     750                call irq_exception
     751                add %sp, 128, %o1
     752               
     753                /* Return from handler */
     754                ld [%sp + 92], %l1
     755                ld [%sp + 96], %l2
     756                ld [%sp + 100], %l0
     757                mov %l0, %psr
     758                nop
     759                nop
     760                nop
     761                nop
     762                nop
     763               
     764                /*
     765                 * If trap originated from user space, clear user space window mark
     766                 * and save uwb address for future use.
     767                 */
     768                if_from_kernel 6f
     769                switch_to_invalid %g5, %g6
     770                clr %l7
     771                mov %l5, %g2
     772                mov %l6, %g7
     773                switch_back %g5, %g6
     774                mov %g7, %g1
     775               
     776                /* If trap originated from user space, restore all windows from UWB */
     777                /* UWB pointer is at %g1 */
     778        0:
     779                mov %g0, %wim
     780                clr %g5
     781                andcc %g1, UWB_ALIGNMENT - 1, %g0
     782                bz 0f
     783                nop
     784               
     785                restore
     786                sub %g1, 64, %g1
     787                ldd [%g1 + 0], %l0
     788                ldd [%g1 + 8], %l2
     789                ldd [%g1 + 16], %l4
     790                ldd [%g1 + 24], %l6
     791                ldd [%g1 + 32], %i0
     792                ldd [%g1 + 40], %i2
     793                ldd [%g1 + 48], %i4
     794                ldd [%g1 + 56], %i6
     795                inc %g5
     796                and %g5, 0x7, %g5
     797                ba 0b
     798                nop
     799               
     800        /*
     801         * We've restored all user space windows. Now time to
     802         * fix CWP and WIM.
    806803         */
    807 0:      restore
    808         get_cwp %g7
    809         clr %g5
    810         inc %g5
    811         sll %g5, %g7, %g5
    812 
    813         /* Write values to invalid window and switch back */
    814         mov %g2, %l5
    815         mov %g1, %l6
    816         clr %l7
    817         switch_back %g5, %g6
    818 
    819         /* If next window is invalid, do inline restore */
    820 6:      get_wim_number %g6
    821         get_cwp %g7
    822         inc %g7
    823         and %g7, 0x7, %g7
    824         cmp %g6, %g7
    825         bne 8f
    826 
    827         if_from_kernel 7f
    828 
    829         inline_restore_uspace %g1
    830         switch_to_invalid %g5, %g6
    831         mov %g1, %l6
    832         switch_back %g5, %g6
    833         b 8f
    834         nop
    835 
    836 7:      inline_restore_kernel
    837 
    838 8:      ld [%sp + 104], %g1
    839         ld [%sp + 108], %g2
    840         ld [%sp + 112], %g3
    841         ld [%sp + 116], %g4
    842         ld [%sp + 120], %g7
    843         jmp %l1
    844         rett %l2
    845 
     804        0:
     805                restore
     806                get_cwp %g7
     807                clr %g5
     808                inc %g5
     809                sll %g5, %g7, %g5
     810               
     811                /* Write values to invalid window and switch back */
     812                mov %g2, %l5
     813                mov %g1, %l6
     814                clr %l7
     815                switch_back %g5, %g6
     816               
     817                /* If next window is invalid, do inline restore */
     818        6:
     819                get_wim_number %g6
     820                get_cwp %g7
     821                inc %g7
     822                and %g7, 0x7, %g7
     823                cmp %g6, %g7
     824                bne 8f
     825               
     826                if_from_kernel 7f
     827               
     828                inline_restore_uspace %g1
     829                switch_to_invalid %g5, %g6
     830                mov %g1, %l6
     831                switch_back %g5, %g6
     832                b 8f
     833                nop
     834       
     835        7:
     836                inline_restore_kernel
     837       
     838        8:
     839                ld [%sp + 104], %g1
     840                ld [%sp + 108], %g2
     841                ld [%sp + 112], %g3
     842                ld [%sp + 116], %g4
     843                ld [%sp + 120], %g7
     844                jmp %l1
     845                rett %l2
    846846
    847847syscall_trap:
    848848        /* Save %g7 */
    849849        mov %g7, %l0
    850 
     850       
    851851        /* Check whether we landed in invalid window */
    852852        get_wim_number %g6
     
    855855        bne 4f
    856856        nop
    857 
    858         /* We are in invalid window. Check whether previous mode was usermode */
     857       
     858        /* We are in invalid window. Check whether previous mode was user mode */
    859859        if_from_kernel 3f
    860 
    861         /* Trap originated from uspace */
     860       
     861        /* Trap originated from user space */
    862862        /* Kernel stack pointer is at %l5, uwb is at %l6 */
    863863        inline_save_uspace %l6
    864 
    865         /* set uspace window mark */
     864       
     865        /* Set user space window mark */
    866866        mov %psr, %l7
    867867        inc %l7
     
    870870        b 4f
    871871        nop
    872 
    873 3:      /* Trap originated from kernel */
    874         inline_save_kernel
    875 
    876 4:      /* Check whether previous mode was usermode */
    877         if_from_kernel 5f
    878 
    879         /* Load kernel stack pointer from invalid window */
    880         switch_to_invalid %g5, %g6
    881 
    882         /* set uspace window mark */
    883         mov %g6, %l7
    884         inc %l7
    885         and %l7, 0x7, %l7
    886         or %l7, 0x10, %l7
    887 
    888         /* Save stack pointer */
    889         mov %l5, %g7
    890         switch_back %g5, %g6
    891         mov %g7, %sp
    892 //      mov %sp, %fp
    893 
    894 5:      /* Set up stack frame */
    895         sub %sp, 128, %sp
    896 
    897         /* Save trap data on stack */
    898         mov %psr, %l5
    899         st %l1, [%sp + 92]
    900         st %l2, [%sp + 96]
    901         st %l5, [%sp + 100]
    902         st %g1, [%sp + 104]
    903         st %g2, [%sp + 108]
    904         st %g3, [%sp + 112]
    905         st %g4, [%sp + 116]
    906         st %l0, [%sp + 120]
    907 
    908         /* Enable traps */
    909         mov %psr, %l0
    910         or %l0, (1 << 5), %l0
    911         mov %l0, %psr
    912         nop
    913         nop
    914         nop
    915         nop
    916 
    917         /* Flush windows */
    918         call flush_windows
    919         nop
    920 
    921         /* Jump to actual subroutine */
    922         sub %o0, 0x80, %o0
    923         st %o0, [ %sp + 92 ]
    924         mov %i0, %o0
    925         mov %i1, %o1
    926         mov %i2, %o2
    927         mov %i3, %o3
    928         mov %i4, %o4
    929         call syscall
    930         mov %i5, %o5
    931 
    932         /* Return from handler */
    933         ld [%sp + 92], %l1
    934         ld [%sp + 96], %l2
    935         ld [%sp + 100], %l0
    936         mov %o0, %i0
    937         mov %psr, %l1
    938         and %l1, 0xf, %l1
    939         and %l0, 0xfffffff0, %l0
    940         or %l0, %l1, %l0
    941         mov %l0, %psr
    942         nop
    943         nop
    944         nop
    945         nop
    946         nop
    947 
    948         /* If trap originated from uspace, clear uspace window mark and save uwb address for future use */
    949         if_from_kernel 8f
    950         switch_to_invalid %g5, %g6
    951         mov %l5, %g2
    952         mov %l6, %g1
    953         mov %l7, %g7
    954         switch_back %g5, %g6
    955        
    956         /* If trap originated from uspace, restore all windows from UWB */
    957         /* UWB pointer is at %g1 */
    958 0:      mov %g0, %wim
    959         clr %g5
    960         andcc %g1, UWB_ALIGNMENT - 1, %g0
    961         bz 0f
    962         nop
    963 
    964         restore
    965         sub %g1, 64, %g1
    966         ldd [%g1 +  0], %l0
    967         ldd [%g1 +  8], %l2
    968         ldd [%g1 + 16], %l4
    969         ldd [%g1 + 24], %l6
    970         ldd [%g1 + 32], %i0
    971         ldd [%g1 + 40], %i2
    972         ldd [%g1 + 48], %i4
    973         ldd [%g1 + 56], %i6
    974         inc %g5
    975         and %g5, 0x7, %g5
    976         ba 0b
    977         nop
    978 
    979         /* We've restored all uspace windows. Now time to
    980          * fix CWP and WIM
    981          */
    982 0:      restore
    983         get_cwp %g7
    984         clr %g5
    985         inc %g5
    986         sll %g5, %g7, %g5
    987 
    988         /* Write values to invalid window and switch back */
    989         mov %g2, %l5
    990         mov %g1, %l6
    991         clr %l7
    992         switch_back %g5, %g6
    993 
    994 8:      mov %sp, %l1
    995         sub %g2, 128, %sp
    996         ld [%sp + 104], %g1
    997         ld [%sp + 108], %g2
    998         ld [%sp + 112], %g3
    999         ld [%sp + 116], %g4
    1000         ld [%sp + 120], %g7
    1001         mov %l1, %sp
    1002         jmp %l2
    1003         rett %l2 + 4
    1004 
    1005 #define STRAP(_vector, _handler) \
     872       
     873        3:
     874                /* Trap originated from kernel */
     875                inline_save_kernel
     876       
     877        4:
     878                /* Check whether previous mode was user mode */
     879                if_from_kernel 5f
     880               
     881                /* Load kernel stack pointer from invalid window */
     882                switch_to_invalid %g5, %g6
     883               
     884                /* Set user space window mark */
     885                mov %g6, %l7
     886                inc %l7
     887                and %l7, 0x7, %l7
     888                or %l7, 0x10, %l7
     889               
     890                /* Save stack pointer */
     891                mov %l5, %g7
     892                switch_back %g5, %g6
     893                mov %g7, %sp
     894                ##      mov %sp, %fp
     895               
     896        5:
     897                /* Set up stack frame */
     898                sub %sp, 128, %sp
     899               
     900                /* Save trap data on stack */
     901                mov %psr, %l5
     902                st %l1, [%sp + 92]
     903                st %l2, [%sp + 96]
     904                st %l5, [%sp + 100]
     905                st %g1, [%sp + 104]
     906                st %g2, [%sp + 108]
     907                st %g3, [%sp + 112]
     908                st %g4, [%sp + 116]
     909                st %l0, [%sp + 120]
     910               
     911                /* Enable traps */
     912                mov %psr, %l0
     913                or %l0, (1 << 5), %l0
     914                mov %l0, %psr
     915                nop
     916                nop
     917                nop
     918                nop
     919               
     920                /* Flush windows */
     921                call flush_windows
     922                nop
     923               
     924                /* Jump to actual subroutine */
     925                sub %o0, 0x80, %o0
     926                st %o0, [%sp + 92]
     927                mov %i0, %o0
     928                mov %i1, %o1
     929                mov %i2, %o2
     930                mov %i3, %o3
     931                mov %i4, %o4
     932                call syscall
     933                mov %i5, %o5
     934               
     935                /* Return from handler */
     936                ld [%sp + 92], %l1
     937                ld [%sp + 96], %l2
     938                ld [%sp + 100], %l0
     939                mov %o0, %i0
     940                mov %psr, %l1
     941                and %l1, 0xf, %l1
     942                and %l0, 0xfffffff0, %l0
     943                or %l0, %l1, %l0
     944                mov %l0, %psr
     945                nop
     946                nop
     947                nop
     948                nop
     949                nop
     950               
     951                /*
     952                 * If trap originated from user space, clear user space window mark
     953                 * and save uwb address for future use.
     954                 */
     955                if_from_kernel 8f
     956                switch_to_invalid %g5, %g6
     957                mov %l5, %g2
     958                mov %l6, %g1
     959                mov %l7, %g7
     960                switch_back %g5, %g6
     961               
     962                /* If trap originated from user space, restore all windows from UWB */
     963                /* UWB pointer is at %g1 */
     964        0:
     965                mov %g0, %wim
     966                clr %g5
     967                andcc %g1, UWB_ALIGNMENT - 1, %g0
     968                bz 0f
     969                nop
     970               
     971                restore
     972                sub %g1, 64, %g1
     973                ldd [%g1 + 0], %l0
     974                ldd [%g1 + 8], %l2
     975                ldd [%g1 + 16], %l4
     976                ldd [%g1 + 24], %l6
     977                ldd [%g1 + 32], %i0
     978                ldd [%g1 + 40], %i2
     979                ldd [%g1 + 48], %i4
     980                ldd [%g1 + 56], %i6
     981                inc %g5
     982                and %g5, 0x7, %g5
     983                ba 0b
     984                nop
     985               
     986                /*
     987                 * We've restored all user space windows. Now time to
     988                 * fix CWP and WIM.
     989                 */
     990        0:
     991                restore
     992                get_cwp %g7
     993                clr %g5
     994                inc %g5
     995                sll %g5, %g7, %g5
     996               
     997                /* Write values to invalid window and switch back */
     998                mov %g2, %l5
     999                mov %g1, %l6
     1000                clr %l7
     1001                switch_back %g5, %g6
     1002       
     1003        8:
     1004                mov %sp, %l1
     1005                sub %g2, 128, %sp
     1006                ld [%sp + 104], %g1
     1007                ld [%sp + 108], %g2
     1008                ld [%sp + 112], %g3
     1009                ld [%sp + 116], %g4
     1010                ld [%sp + 120], %g7
     1011                mov %l1, %sp
     1012                jmp %l2
     1013                rett %l2 + 4
     1014
     1015#define STRAP(_vector, _handler) \
    10061016        .org trap_table + _vector * TRAP_ENTRY_SIZE; \
    10071017        mov %psr, %l0 ; \
     
    10101020        nop
    10111021
    1012 #define TRAP(_vector, _handler) \
     1022#define TRAP(_vector, _handler) \
    10131023        .org trap_table + _vector * TRAP_ENTRY_SIZE; \
    10141024        set _vector, %o0 ; \
     
    10171027        or %o2, %lo(_handler), %o2 ;
    10181028
    1019 #define SYSCALL(_vector) \
     1029#define SYSCALL(_vector) \
    10201030        .org trap_table + _vector * TRAP_ENTRY_SIZE; \
    10211031        set _vector, %o0 ; \
     
    10231033        nop ;
    10241034
    1025 #define INTERRUPT(_vector, _priority) \
     1035#define INTERRUPT(_vector, _priority) \
    10261036        .org trap_table + _vector * TRAP_ENTRY_SIZE; \
    10271037        mov %psr, %l0 ; \
     
    10301040        nop ;
    10311041
    1032 #define BADTRAP(_vector) \
     1042#define BADTRAP(_vector) \
    10331043        .org trap_table + _vector * TRAP_ENTRY_SIZE ; \
    10341044        ta 0 ;
     
    10541064        BADTRAP(0x10)
    10551065        INTERRUPT(0x11, 1)
    1056         INTERRUPT(0x12, 2)
    1057         INTERRUPT(0x13, 3)
    1058         INTERRUPT(0x14, 4)
    1059         INTERRUPT(0x15, 5)
    1060         INTERRUPT(0x16, 6)
    1061         INTERRUPT(0x17, 7)
    1062         INTERRUPT(0x18, 8)
    1063         INTERRUPT(0x19, 9)
     1066        INTERRUPT(0x12, 2)
     1067        INTERRUPT(0x13, 3)
     1068        INTERRUPT(0x14, 4)
     1069        INTERRUPT(0x15, 5)
     1070        INTERRUPT(0x16, 6)
     1071        INTERRUPT(0x17, 7)
     1072        INTERRUPT(0x18, 8)
     1073        INTERRUPT(0x19, 9)
    10641074        INTERRUPT(0x1a, 10)
    10651075        INTERRUPT(0x1b, 11)
     
    10681078        INTERRUPT(0x1e, 14)
    10691079        INTERRUPT(0x1f, 15)
    1070         TRAP(0x21, instruction_access_error)
    1071         BADTRAP(0x22)
    1072         BADTRAP(0x23)
    1073         BADTRAP(0x24)
    1074         BADTRAP(0x25)
    1075         BADTRAP(0x26)
    1076         BADTRAP(0x27)
    1077         BADTRAP(0x28)
    1078         TRAP(0x29, data_access_error)
     1080        TRAP(0x21, instruction_access_error)
     1081        BADTRAP(0x22)
     1082        BADTRAP(0x23)
     1083        BADTRAP(0x24)
     1084        BADTRAP(0x25)
     1085        BADTRAP(0x26)
     1086        BADTRAP(0x27)
     1087        BADTRAP(0x28)
     1088        TRAP(0x29, data_access_error)
    10791089        TRAP(0x2a, division_by_zero)
    10801090        TRAP(0x2b, data_store_error)
     
    12111221        SYSCALL(0xae)
    12121222        SYSCALL(0xaf)
    1213         SYSCALL(0xb0)
    1214         SYSCALL(0xb1)
    1215         SYSCALL(0xb2)
    1216         SYSCALL(0xb3)
    1217         SYSCALL(0xb4)
    1218         SYSCALL(0xb5)
    1219         SYSCALL(0xb6)
    1220         SYSCALL(0xb7)
    1221         SYSCALL(0xb8)
    1222         SYSCALL(0xb9)
    1223         SYSCALL(0xba)
    1224         SYSCALL(0xbb)
    1225         SYSCALL(0xbc)
    1226         SYSCALL(0xbd)
    1227         SYSCALL(0xbe)
    1228         SYSCALL(0xbf)
    1229         SYSCALL(0xc0)
    1230         SYSCALL(0xc1)
    1231         SYSCALL(0xc2)
    1232         SYSCALL(0xc3)
    1233         SYSCALL(0xc4)
    1234         SYSCALL(0xc5)
    1235         SYSCALL(0xc6)
    1236         SYSCALL(0xc7)
    1237         SYSCALL(0xc8)
    1238         SYSCALL(0xc9)
    1239         SYSCALL(0xca)
    1240         SYSCALL(0xcb)
    1241         SYSCALL(0xcc)
    1242         SYSCALL(0xcd)
    1243         SYSCALL(0xce)
    1244         SYSCALL(0xcf)
     1223        SYSCALL(0xb0)
     1224        SYSCALL(0xb1)
     1225        SYSCALL(0xb2)
     1226        SYSCALL(0xb3)
     1227        SYSCALL(0xb4)
     1228        SYSCALL(0xb5)
     1229        SYSCALL(0xb6)
     1230        SYSCALL(0xb7)
     1231        SYSCALL(0xb8)
     1232        SYSCALL(0xb9)
     1233        SYSCALL(0xba)
     1234        SYSCALL(0xbb)
     1235        SYSCALL(0xbc)
     1236        SYSCALL(0xbd)
     1237        SYSCALL(0xbe)
     1238        SYSCALL(0xbf)
     1239        SYSCALL(0xc0)
     1240        SYSCALL(0xc1)
     1241        SYSCALL(0xc2)
     1242        SYSCALL(0xc3)
     1243        SYSCALL(0xc4)
     1244        SYSCALL(0xc5)
     1245        SYSCALL(0xc6)
     1246        SYSCALL(0xc7)
     1247        SYSCALL(0xc8)
     1248        SYSCALL(0xc9)
     1249        SYSCALL(0xca)
     1250        SYSCALL(0xcb)
     1251        SYSCALL(0xcc)
     1252        SYSCALL(0xcd)
     1253        SYSCALL(0xce)
     1254        SYSCALL(0xcf)
  • kernel/arch/sparc32/src/userspace.c

    rf6f22cdb r32e8cd1  
    2727 */
    2828
    29 /** @addtogroup abs32le
     29/** @addtogroup sparc32
    3030 * @{
    3131 */
     
    4242void userspace(uspace_arg_t *kernel_uarg)
    4343{
    44 //      printf("userspace(): entry=%p, stack=%p, stacksize=%d\n", kernel_uarg->uspace_entry, kernel_uarg->uspace_stack, kernel_uarg->uspace_stack_size);
    45         /* On real hardware this switches the CPU to user
    46            space mode and jumps to kernel_uarg->uspace_entry. */
    47 
    48         uint32_t l0, l1, l2;
    4944        uint32_t psr = psr_read();
    50         uint8_t wim;
    51 
    5245        psr &= ~(1 << 7);
    5346        psr &= ~(1 << 6);
    54 
     47       
    5548        /* Read invalid window variables */
     49        uint32_t l0;
     50        uint32_t l1;
     51        uint32_t l2;
    5652        read_from_invalid(&l0, &l1, &l2);
    57 
     53       
    5854        /* Make current window invalid */
    59         wim = (psr & 0x7) + 1;
     55        uint8_t wim = (psr & 0x7) + 1;
    6056        wim = (1 << wim) | (1 >> (8 - wim));
    61 
     57       
    6258        asm volatile (
    6359                "flush\n"
     
    7167                "ld %[arg], %%o1\n"
    7268                "jmp %[entry]\n"
    73                 "mov %[psr], %%psr\n" :: [entry] "r" (kernel_uarg->uspace_entry),
    74                            [arg] "m" (kernel_uarg->uspace_uarg),
    75                            [psr] "r" (psr),
    76                            [wim] "r" ((uint32_t)wim),   
    77                            [v0] "m" (l0),
    78                            [v1] "m" (l1),
    79                            [v2] "m" (l2),
    80                            [stack] "r" (kernel_uarg->uspace_stack + kernel_uarg->uspace_stack_size - 64) : "%g3", "%g4");
    81 
    82         while (true);
     69                "mov %[psr], %%psr\n"
     70                :: [entry] "r" (kernel_uarg->uspace_entry),
     71                   [arg] "m" (kernel_uarg->uspace_uarg),
     72                   [psr] "r" (psr),
     73                   [wim] "r" ((uint32_t)wim),
     74                   [v0] "m" (l0),
     75                   [v1] "m" (l1),
     76                   [v2] "m" (l2),
     77                   [stack] "r" (kernel_uarg->uspace_stack +
     78                   kernel_uarg->uspace_stack_size - 64)
     79                : "%g3", "%g4"
     80        );
     81       
     82        while (1);
    8383}
    8484
Note: See TracChangeset for help on using the changeset viewer.