Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 528 → Rev 529

/kernel/trunk/arch/sparc64/include/trap_table.h
0,0 → 1,51
/*
* Copyright (C) 2005 Jakub Jermar
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
 
#ifndef __sparc64_TRAP_TABLE_H__
#define __sparc64_TRAP_TABLE_H__
 
#ifndef __ASM__
#include <arch/types.h>
#endif /* __ASM__ */
 
#define TRAP_TABLE_ENTRY_COUNT 1024
#define TRAP_TABLE_ENTRY_SIZE 32
#define TRAP_TABLE_SIZE (TRAP_TABLE_ENTRY_COUNT*TRAP_TABLE_ENTRY_SIZE)
 
#ifndef __ASM__
struct trap_table_entry {
__u8 octets[TRAP_TABLE_ENTRY_SIZE];
} __attribute__ ((packed));
 
typedef struct trap_table_entry trap_table_entry_t;
 
extern trap_table_entry_t trap_table[TRAP_TABLE_ENTRY_COUNT];
extern trap_table_entry_t trap_table_kernel[TRAP_TABLE_ENTRY_COUNT];
#endif /* __ASM__ */
 
#endif
/kernel/trunk/arch/sparc64/include/asm.h
85,6 → 85,29
return v;
}
 
/** Read Trap Base Address register.
*
* @return Current value in TBA.
*/
static inline __u64 tba_read(void)
{
__u64 v;
__asm__ volatile ("rdpr %%tba, %0\n" : "=r" (v));
return v;
}
 
/** Write Trap Base Address register.
*
* @param New value of TBA.
*/
static inline void tba_write(__u64 v)
{
__asm__ volatile ("wrpr %0, %1, %%tba\n" : : "r" (v), "i" (0));
}
 
 
void cpu_halt(void);
void cpu_sleep(void);
void asm_delay_loop(__u32 t);
/kernel/trunk/arch/sparc64/Makefile.inc
54,4 → 54,5
arch/$(ARCH)/src/mm/frame.c \
arch/$(ARCH)/src/mm/page.c \
arch/$(ARCH)/src/sparc64.c \
arch/$(ARCH)/src/start.S
arch/$(ARCH)/src/start.S \
arch/$(ARCH)/src/trap_table.S
/kernel/trunk/arch/sparc64/src/sparc64.c
27,6 → 27,10
*/
 
#include <arch.h>
#include <print.h>
#include <arch/asm.h>
#include <memstr.h>
#include <arch/trap_table.h>
 
void arch_pre_mm_init(void)
{
38,6 → 42,14
 
void arch_pre_smp_init(void)
{
/*
* Copy OFW's trap table into kernel and point TBA there.
*/
memcpy((void *) trap_table, (void *) tba_read(), TRAP_TABLE_SIZE);
/*
* TBA cannot be changed until there are means of getting it into TLB.
* tba_write((__u64) trap_table);
*/
}
 
void arch_post_smp_init(void)
/kernel/trunk/arch/sparc64/src/context.S
31,12 → 31,10
 
/**
* Both context_save_arch() and context_restore_arch() are
* leaf-optimized procedures. Both of them touch %sp and
* %fp and thus break SCD 2.4 compliance. However, these
* functions are special enough to be allowed this
* kind of behavior. Moreover, this kind of optimization
* is very important and prevents any window spill/
* fill/clean traps in these very core kernel functions.
* leaf-optimized procedures. This kind of optimization
* is very important and prevents any implicit window
* spill/fill/clean traps in these very core kernel
* functions.
*/
.text
/kernel/trunk/arch/sparc64/src/start.S
51,10 → 51,9
 
1:
set ofw, %l0
stx %o4, [%l0]
 
call ofw_init
nop
stx %o4, [%l0]
 
call main_bsp
nop
/kernel/trunk/arch/sparc64/src/trap_table.S
0,0 → 1,100
#
# Copyright (C) 2005 Jakub Jermar
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# - Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# - Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# - The name of the author may not be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
 
/**
* This file contains two trap tables. First, trap_table, is the one
* to wich kernel copies OFW's own trap table and patches it with
* kernel-provided handlers from the second trap table, trap_table_kernel.
*/
.text
 
#include <arch/trap_table.h>
 
#define TABLE_SIZE TRAP_TABLE_SIZE
#define ENTRY_SIZE TRAP_TABLE_ENTRY_SIZE
 
 
/*
* Trap table for copy of OFW's own trap table.
*/
.align TABLE_SIZE
.global trap_table
trap_table:
.space TABLE_SIZE, 0
 
 
/*
* Kernel-provided trap handlers.
*/
.global trap_table_kernel
trap_table_kernel:
 
/*
* Hardware interrupts for TL=0.
*/
.org trap_table_kernel + 0*ENTRY_SIZE
tl_0_hardware_traps:
 
/*
* Register window spill/fill/clean traps for TL=0.
*/
.org trap_table_kernel + 128*ENTRY_SIZE
tl_0_regwin_traps:
 
/*
* Software traps for TL=0.
*/
.org trap_table_kernel + 256*ENTRY_SIZE
tl_0_software_traps:
 
/* Reserved area. */
.org trap_table_kernel + 384*ENTRY_SIZE
.space 128*ENTRY_SIZE, 0
 
/*
* Hardware interrupts for TL>0.
*/
.org trap_table_kernel + 512*ENTRY_SIZE
tl_non_0_hardware_traps:
 
/*
* Register window spill/fill/clean traps for TL>0.
*/
.org trap_table_kernel + 640*ENTRY_SIZE
tl_non_0_regwin_traps:
 
/*
* Software traps for TL>0.
*/
.org trap_table_kernel + 768*ENTRY_SIZE
tl_non_0_software_traps:
 
/* Reserved area. */
.org trap_table_kernel + 896*ENTRY_SIZE
.space 128*ENTRY_SIZE, 0