OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /or1k/trunk/ecos-2.0/packages/hal/openrisc
    from Rev 1254 to Rev 1765
    Reverse comparison

Rev 1254 → Rev 1765

/orp/current/cdl/hal_openrisc_orp.cdl
0,0 → 1,335
# ====================================================================
#
# hal_openrisc_orp.cdl
#
# OpenRISC Reference Platform (ORP) HAL package configuration data
#
# ====================================================================
#####ECOSGPLCOPYRIGHTBEGIN####
## -------------------------------------------
## This file is part of eCos, the Embedded Configurable Operating System.
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
##
## eCos is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free
## Software Foundation; either version 2 or (at your option) any later version.
##
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
## WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
## for more details.
##
## You should have received a copy of the GNU General Public License along
## with eCos; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
##
## As a special exception, if other files instantiate templates or use macros
## or inline functions from this file, or you compile this file and link it
## with other works to produce a work based on this file, this file does not
## by itself cause the resulting work to be covered by the GNU General Public
## License. However the source code for this file must still be made available
## in accordance with section (3) of the GNU General Public License.
##
## This exception does not invalidate any other reasons why a work based on
## this file might be covered by the GNU General Public License.
##
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
## at http://sources.redhat.com/ecos/ecos-license/
## -------------------------------------------
#####ECOSGPLCOPYRIGHTEND####
# ====================================================================
######DESCRIPTIONBEGIN####
#
# Author(s): sfurman
# Contributors:
# Date: 2003-01-20
#
#####DESCRIPTIONEND####
#
# ====================================================================
 
cdl_package CYGPKG_HAL_OPENRISC_ORP {
display "OpenRISC Reference Platform"
parent CYGPKG_HAL_OPENRISC
include_dir cyg/hal
hardware
description "
The ORP HAL package should be used when targetting the
OpenRISC Reference Platform."
 
compile hal_diag.c hal_aux.c
 
implements CYGINT_HAL_DEBUG_GDB_STUBS
implements CYGINT_HAL_DEBUG_GDB_STUBS_BREAK
implements CYGINT_HAL_VIRTUAL_VECTOR_SUPPORT
implements CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT
 
define_proc {
puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H <pkgconf/hal_openrisc.h>"
puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H <pkgconf/hal_openrisc_orp.h>"
}
 
cdl_component CYG_HAL_STARTUP {
display "Startup type"
flavor data
legal_values {"RAM" "ROM"}
default_value {"ROM"}
no_define
define -file system.h CYG_HAL_STARTUP
description "
Selects whether code initially runs from ROM or RAM. In the case of ROM startup,
it's possible for the code to be copied into RAM and executed there."
}
 
cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD {
display "Diagnostic serial port baud rate"
flavor data
legal_values 9600 19200 38400 57600 115200 230400 460800 921600
default_value 115200
description "
This option selects the baud rate used for the diagnostic console.
Note: this should match the value chosen for the GDB port if the
diagnostic and GDB port are the same.
Note: very high baud rates are useful during simulation."
}
 
cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_BAUD {
display "GDB serial port baud rate"
flavor data
legal_values 9600 19200 38400 57600 115200 230400 460800 921600
default_value 115200
description "
This option controls the baud rate used for the GDB connection.
Note: very high baud rates are useful during simulation."
}
 
# Real-time clock/counter specifics
cdl_component CYGNUM_HAL_RTC_CONSTANTS {
display "Real-time clock constants."
flavor none
cdl_option CYGNUM_HAL_RTC_NUMERATOR {
display "Real-time clock numerator"
flavor data
calculated 1000000000
}
cdl_option CYGNUM_HAL_RTC_DENOMINATOR {
display "Real-time clock denominator"
flavor data
calculated 100
}
cdl_option CYGNUM_HAL_RTC_PERIOD {
display "Real-time clock period"
flavor data
# sfurman: Probably ought be "calculated" - not "default_value"
# However, it is handy to override this value during simulator-based testing
default_value {CYGHWR_HAL_OPENRISC_CPU_FREQ * 1000000 / CYGNUM_HAL_RTC_DENOMINATOR}
description "
The tick timer facility is used
to drive the eCos kernel RTC. The count register
increments at the CPU clock speed. By default, 100 Hz"
}
}
 
cdl_option CYGBLD_BUILD_GDB_STUBS {
display "Build GDB stub ROM image"
default_value 0
parent CYGBLD_GLOBAL_OPTIONS
requires { CYG_HAL_STARTUP == "ROM" }
requires CYGSEM_HAL_ROM_MONITOR
requires CYGBLD_BUILD_COMMON_GDB_STUBS
requires CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
requires ! CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
requires ! CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT
requires ! CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
requires ! CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM
no_define
description "
This option enables the building of the GDB stubs for the
board. The common HAL controls takes care of most of the
build process, but the final conversion from ELF image to
binary data is handled by the platform CDL, allowing
relocation of the data if necessary."
 
make -priority 320 {
<PREFIX>/bin/gdb_module.bin : <PREFIX>/bin/gdb_module.img
$(OBJCOPY) -O binary $< $@
}
}
 
 
cdl_option CYGNUM_HAL_BREAKPOINT_LIST_SIZE {
display "Number of breakpoints supported by the HAL."
flavor data
default_value 25
description "
This option determines the number of breakpoints supported by the HAL."
}
 
cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS {
display "Number of communication channels on the board"
flavor data
default_value 1
}
 
cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL {
display "Debug serial port"
active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE
flavor data
legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1
default_value 0
description "
The ORP platform has at least one serial port, but it can potentially have several.
This option chooses which port will be used to connect to a host
running GDB."
}
cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL {
display "Diagnostic serial port"
active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE
flavor data
legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1
default_value 0
description "
The ORP platform has at least one serial port, but it can potentially have several.
This option chooses which port will be used for diagnostic output."
}
 
cdl_component CYGBLD_GLOBAL_OPTIONS {
display "Global build options"
flavor none
description "
Global build options including control over
compiler flags, linker flags and choice of toolchain."
 
 
parent CYGPKG_NONE
 
cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX {
display "Global command prefix"
flavor data
no_define
default_value { "or32-elf" }
description "
This option specifies the command prefix used when
invoking the build tools."
}
 
cdl_option CYGBLD_GLOBAL_CFLAGS {
display "Global compiler flags"
flavor data
no_define
default_value { "-msoft-float -Wall -Wpointer-arith -Wstrict-prototypes -Winline -Wundef -Woverloaded-virtual -g -O2 -fno-omit-frame-pointer -fno-rtti -fno-exceptions -fvtable-gc -finit-priority" }
description "
This option controls the global compiler flags which
are used to compile all packages by
default. Individual packages may define
options which override these global flags."
}
 
cdl_option CYGBLD_GLOBAL_LDFLAGS {
display "Global linker flags"
flavor data
no_define
default_value { "-msoft-float -g -nostdlib -Wl,--gc-sections -Wl,-static" }
description "
This option controls the global linker flags. Individual
packages may define options which override these global flags."
}
}
 
cdl_component CYGHWR_MEMORY_LAYOUT {
display "Memory layout"
flavor data
no_define
calculated { CYG_HAL_STARTUP == "RAM" ? "openrisc_orp_ram" : \
"openrisc_orp_rom" }
 
cdl_option CYGHWR_MEMORY_LAYOUT_LDI {
display "Memory layout linker script fragment"
flavor data
no_define
define -file system.h CYGHWR_MEMORY_LAYOUT_LDI
calculated { CYG_HAL_STARTUP == "RAM" ? "<pkgconf/mlt_openrisc_orp_ram.ldi>" : \
"<pkgconf/mlt_openrisc_orp_rom.ldi>" }
}
 
cdl_option CYGHWR_MEMORY_LAYOUT_H {
display "Memory layout header file"
flavor data
no_define
define -file system.h CYGHWR_MEMORY_LAYOUT_H
calculated { CYG_HAL_STARTUP == "RAM" ? "<pkgconf/mlt_openrisc_orp_ram.h>" : \
"<pkgconf/mlt_openrisc_orp_rom.h>" }
}
}
 
cdl_option CYGSEM_HAL_USE_ROM_MONITOR {
display "Work with a ROM monitor"
flavor booldata
legal_values { "Generic" "CygMon" "GDB_stubs" }
default_value { CYG_HAL_STARTUP == "RAM" ? "CygMon" : 0 }
parent CYGPKG_HAL_ROM_MONITOR
requires { CYG_HAL_STARTUP == "RAM" }
description "
Support can be enabled for three different varieties of ROM monitor.
This support changes various eCos semantics such as the encoding
of diagnostic output, or the overriding of hardware interrupt
vectors.
Firstly there is \"Generic\" support which prevents the HAL
from overriding the hardware vectors that it does not use, to
instead allow an installed ROM monitor to handle them. This is
the most basic support which is likely to be common to most
implementations of ROM monitor.
\"CygMon\" provides support for the Cygnus ROM Monitor.
And finally, \"GDB_stubs\" provides support when GDB stubs are
included in the ROM monitor or boot ROM."
}
 
cdl_option CYGSEM_HAL_ROM_MONITOR {
display "Behave as a ROM monitor"
flavor bool
default_value 1
parent CYGPKG_HAL_ROM_MONITOR
requires { CYG_HAL_STARTUP == "ROM" }
description "
Enable this option if this program is to be used as a ROM monitor,
i.e. applications will be loaded into RAM on the board, and this
ROM monitor may process exceptions or interrupts generated from the
application. This enables features such as utilizing a separate
interrupt stack when exceptions are generated."
}
 
cdl_component CYGPKG_REDBOOT_HAL_OPTIONS {
display "Redboot HAL options"
flavor none
no_define
parent CYGPKG_REDBOOT
active_if CYGPKG_REDBOOT
description "
This option lists the target's requirements for a valid Redboot
configuration."
 
cdl_option CYGBLD_BUILD_REDBOOT_BIN {
display "Build Redboot ROM binary image"
active_if CYGBLD_BUILD_REDBOOT
default_value 1
no_define
description "This option enables the conversion of the Redboot ELF
image to a binary image suitable for ROM programming."
compile -library=libextras.a
make -priority 325 {
<PREFIX>/bin/redboot.srec : <PREFIX>/bin/redboot.elf
$(OBJCOPY) --strip-all $< $(@:.srec=.img)
$(OBJCOPY) -O srec $< $@
}
}
}
 
define_proc {
puts $cdl_header "#define CYGHWR_HAL_VSR_TABLE 0"
puts $cdl_header "#define CYGHWR_HAL_VIRTUAL_VECTOR_TABLE 0xF00"
}
}
/orp/current/include/plf_intr.h
0,0 → 1,80
#ifndef CYGONCE_HAL_PLF_INTR_H
#define CYGONCE_HAL_PLF_INTR_H
 
//==========================================================================
//
// plf_intr.h
//
// OpenRISC ORP platform-specific interrupt definitions
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
// Copyright (C) 2002 Gary Thomas
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors:
// Date: 2002-02-28
// Purpose: Define platform specific interrupt support
//
// Usage:
// #include <cyg/hal/plf_intr.h>
// ...
//
//
//####DESCRIPTIONEND####
//
//==========================================================================
 
 
//----------------------------------------------------------------------------
// Reset.
 
// This function should perform a hardware reset
// For now, it does nothing.
#define HAL_PLATFORM_RESET() CYG_EMPTY_STATEMENT
 
// If no HW reset exists, jump to this location instead.
// The current value is the ROM reset entry point.
#define HAL_PLATFORM_RESET_ENTRY 0xF0001000
 
// Define PIC interrupt numbers for peripherals
#define CYGNUM_HAL_INTERRUPT_SERIAL_CONSOLE CYGNUM_HAL_INTERRUPT_2
#define CYGNUM_HAL_INTERRUPT_SERIAL_DEBUGGER CYGNUM_HAL_INTERRUPT_3
 
 
//--------------------------------------------------------------------------
#endif // ifndef CYGONCE_HAL_PLF_INTR_H
// End of plf_intr.h
/orp/current/include/plf_stub.h
0,0 → 1,69
//=============================================================================
//
// plf_stub.h
//
// Platform header for GDB stub support.
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors:jskov
// Date: 2003-02-28
// Purpose: Platform HAL stub support for PowerPC/VIPER board.
// Usage: #include <cyg/hal/plf_stub.h>
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
#ifndef CYGONCE_HAL_PLF_STUB_H
#define CYGONCE_HAL_PLF_STUB_H
 
#include <pkgconf/hal.h>
 
#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
 
#include <cyg/infra/cyg_type.h> // CYG_UNUSED_PARAM
#include <cyg/hal/openrisc_stub.h>
 
//----------------------------------------------------------------------------
// Stub initializer.
 
#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
//-----------------------------------------------------------------------------
#endif // CYGONCE_HAL_PLF_STUB_H
// End of plf_stub.h
/orp/current/include/mc.h
0,0 → 1,143
//==========================================================================
//
// mc.h
//
// OpenCores.org memory controller definitions
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors: Marko Mlinar
// Date: 2003-01-17
// Purpose: Define OpenRISC architecture special-purpose registers
// Usage: #include <cyg/hal/hal_arch.h>
//
//####DESCRIPTIONEND####
//
//==========================================================================
 
/* Prototypes */
#ifndef __MC_H
#define __MC_H
 
#define N_CE (8)
 
#define MC_CSR (0x00)
#define MC_POC (0x04)
#define MC_BA_MASK (0x08)
#define MC_CSC(i) (0x10 + (i) * 8)
#define MC_TMS(i) (0x14 + (i) * 8)
 
#define MC_ADDR_SPACE (MC_CSC(N_CE))
 
/* POC register field definition */
#define MC_POC_EN_BW_OFFSET 0
#define MC_POC_EN_BW_WIDTH 2
#define MC_POC_EN_MEMTYPE_OFFSET 2
#define MC_POC_EN_MEMTYPE_WIDTH 2
 
/* CSC register field definition */
#define MC_CSC_EN_OFFSET 0
#define MC_CSC_MEMTYPE_OFFSET 1
#define MC_CSC_MEMTYPE_WIDTH 2
#define MC_CSC_BW_OFFSET 4
#define MC_CSC_BW_WIDTH 2
#define MC_CSC_MS_OFFSET 6
#define MC_CSC_MS_WIDTH 2
#define MC_CSC_WP_OFFSET 8
#define MC_CSC_BAS_OFFSET 9
#define MC_CSC_KRO_OFFSET 10
#define MC_CSC_PEN_OFFSET 11
#define MC_CSC_SEL_OFFSET 16
#define MC_CSC_SEL_WIDTH 8
 
#define MC_CSC_MEMTYPE_SDRAM 0
#define MC_CSC_MEMTYPE_SSRAM 1
#define MC_CSC_MEMTYPE_ASYNC 2
#define MC_CSC_MEMTYPE_SYNC 3
 
#define MC_CSR_VALID 0xFF000703LU
#define MC_POC_VALID 0x0000000FLU
#define MC_BA_MASK_VALID 0x000000FFLU
#define MC_CSC_VALID 0x00FF0FFFLU
#define MC_TMS_SDRAM_VALID 0x0FFF83FFLU
#define MC_TMS_SSRAM_VALID 0x00000000LU
#define MC_TMS_ASYNC_VALID 0x03FFFFFFLU
#define MC_TMS_SYNC_VALID 0x01FFFFFFLU
#define MC_TMS_VALID 0xFFFFFFFFLU /* reg test compat. */
 
/* TMS register field definition SDRAM */
#define MC_TMS_SDRAM_TRFC_OFFSET 24
#define MC_TMS_SDRAM_TRFC_WIDTH 4
#define MC_TMS_SDRAM_TRP_OFFSET 20
#define MC_TMS_SDRAM_TRP_WIDTH 4
#define MC_TMS_SDRAM_TRCD_OFFSET 17
#define MC_TMS_SDRAM_TRCD_WIDTH 4
#define MC_TMS_SDRAM_TWR_OFFSET 15
#define MC_TMS_SDRAM_TWR_WIDTH 2
#define MC_TMS_SDRAM_WBL_OFFSET 9
#define MC_TMS_SDRAM_OM_OFFSET 7
#define MC_TMS_SDRAM_OM_WIDTH 2
#define MC_TMS_SDRAM_CL_OFFSET 4
#define MC_TMS_SDRAM_CL_WIDTH 3
#define MC_TMS_SDRAM_BT_OFFSET 3
#define MC_TMS_SDRAM_BL_OFFSET 0
#define MC_TMS_SDRAM_BL_WIDTH 3
 
/* TMS register field definition ASYNC */
#define MC_TMS_ASYNC_TWWD_OFFSET 20
#define MC_TMS_ASYNC_TWWD_WIDTH 6
#define MC_TMS_ASYNC_TWD_OFFSET 16
#define MC_TMS_ASYNC_TWD_WIDTH 4
#define MC_TMS_ASYNC_TWPW_OFFSET 12
#define MC_TMS_ASYNC_TWPW_WIDTH 4
#define MC_TMS_ASYNC_TRDZ_OFFSET 8
#define MC_TMS_ASYNC_TRDZ_WIDTH 4
#define MC_TMS_ASYNC_TRDV_OFFSET 0
#define MC_TMS_ASYNC_TRDV_WIDTH 8
 
/* TMS register field definition SYNC */
#define MC_TMS_SYNC_TTO_OFFSET 16
#define MC_TMS_SYNC_TTO_WIDTH 9
#define MC_TMS_SYNC_TWR_OFFSET 12
#define MC_TMS_SYNC_TWR_WIDTH 4
#define MC_TMS_SYNC_TRDZ_OFFSET 8
#define MC_TMS_SYNC_TRDZ_WIDTH 4
#define MC_TMS_SYNC_TRDV_OFFSET 0
#define MC_TMS_SYNC_TRDV_WIDTH 8
 
#endif
/orp/current/include/pkgconf/mlt_openrisc_orp_rom.h
0,0 → 1,37
// eCos memory layout
 
#ifndef __ASSEMBLER__
#include <cyg/infra/cyg_type.h>
#include <stddef.h>
 
#endif
#define CYGMEM_REGION_ram (0)
#define CYGMEM_REGION_ram_SIZE (0x00400000)
#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)
#define CYGMEM_REGION_rom (0xf0000000)
#define CYGMEM_REGION_rom_SIZE (0x10000000)
#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R)
 
#if 0
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__reserved_vectors) [];
#endif
#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors))
#define CYGMEM_SECTION_reserved_vectors_SIZE (0x3000)
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__reserved_vsr_table) [];
#endif
#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table))
#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x200)
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__reserved_virtual_table) [];
#endif
#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table))
#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100)
#endif
 
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__heap1) [];
#endif
#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1))
#define CYGMEM_SECTION_heap1_SIZE (CYGMEM_REGION_ram_SIZE - (size_t) CYG_LABEL_NAME (__heap1))
/orp/current/include/pkgconf/mlt_openrisc_orp_rom.ldi
0,0 → 1,25
// eCos memory layout
 
#include <cyg/infra/cyg_type.inc>
 
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 0x00400000
rom : ORIGIN = 0xF0000000, LENGTH = 0x10000000
}
 
SECTIONS
{
SECTIONS_BEGIN
SECTION_vectors (rom, 0xF0000100, LMA_EQ_VMA)
SECTION_text (rom, ALIGN (0x4), LMA_EQ_VMA)
SECTION_fini (rom, ALIGN (0x4), LMA_EQ_VMA)
SECTION_rodata1 (rom, ALIGN (0x8), LMA_EQ_VMA)
SECTION_rodata (rom, ALIGN (0x8), LMA_EQ_VMA)
SECTION_fixup (rom, ALIGN (0x4), LMA_EQ_VMA)
SECTION_gcc_except_table (rom, ALIGN (0x1), LMA_EQ_VMA)
SECTION_data (ram, 0x1000, FOLLOWING (.gcc_except_table))
SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA)
CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);
SECTIONS_END
}
/orp/current/include/pkgconf/mlt_openrisc_orp_ram.h
0,0 → 1,37
// eCos memory layout
 
#ifndef __ASSEMBLER__
#include <cyg/infra/cyg_type.h>
#include <stddef.h>
 
#endif
#define CYGMEM_REGION_ram (0)
#define CYGMEM_REGION_ram_SIZE (0x00400000)
#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)
#define CYGMEM_REGION_rom (0xf0000000)
#define CYGMEM_REGION_rom_SIZE (0x10000000)
#define CYGMEM_REGION_rom_ATTR (CYGMEM_REGION_ATTR_R)
 
#if 0
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__reserved_vectors) [];
#endif
#define CYGMEM_SECTION_reserved_vectors (CYG_LABEL_NAME (__reserved_vectors))
#define CYGMEM_SECTION_reserved_vectors_SIZE (0x3000)
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__reserved_vsr_table) [];
#endif
#define CYGMEM_SECTION_reserved_vsr_table (CYG_LABEL_NAME (__reserved_vsr_table))
#define CYGMEM_SECTION_reserved_vsr_table_SIZE (0x200)
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__reserved_virtual_table) [];
#endif
#define CYGMEM_SECTION_reserved_virtual_table (CYG_LABEL_NAME (__reserved_virtual_table))
#define CYGMEM_SECTION_reserved_virtual_table_SIZE (0x100)
#endif
 
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__heap1) [];
#endif
#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1))
#define CYGMEM_SECTION_heap1_SIZE (CYGMEM_REGION_ram_SIZE - (size_t) CYG_LABEL_NAME (__heap1))
/orp/current/include/pkgconf/mlt_openrisc_orp_ram.ldi
0,0 → 1,25
// eCos memory layout
 
#include <cyg/infra/cyg_type.inc>
 
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 0x00400000
rom : ORIGIN = 0xF0000000, LENGTH = 0x10000000
}
 
SECTIONS
{
SECTIONS_BEGIN
SECTION_vectors (ram, 0x00000100, LMA_EQ_VMA)
SECTION_text (ram, 0x00008000, LMA_EQ_VMA)
SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA)
SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA)
SECTION_rodata (ram, ALIGN (0x8), LMA_EQ_VMA)
SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA)
SECTION_gcc_except_table (ram, ALIGN (0x1), LMA_EQ_VMA)
SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA)
SECTION_bss (ram, ALIGN (0x10), LMA_EQ_VMA)
CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);
SECTIONS_END
}
/orp/current/include/platform.inc
0,0 → 1,116
##==========================================================================
##
## platform.inc
##
## OpenRISC Reference Platform (ORP) board-specific defines
##
##==========================================================================
#####ECOSGPLCOPYRIGHTBEGIN####
## -------------------------------------------
## This file is part of eCos, the Embedded Configurable Operating System.
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
##
## eCos is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free
## Software Foundation; either version 2 or (at your option) any later version.
##
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
## WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
## for more details.
##
## You should have received a copy of the GNU General Public License along
## with eCos; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
##
## As a special exception, if other files instantiate templates or use macros
## or inline functions from this file, or you compile this file and link it
## with other works to produce a work based on this file, this file does not
## by itself cause the resulting work to be covered by the GNU General Public
## License. However the source code for this file must still be made available
## in accordance with section (3) of the GNU General Public License.
##
## This exception does not invalidate any other reasons why a work based on
## this file might be covered by the GNU General Public License.
##
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
## at http://sources.redhat.com/ecos/ecos-license/
## -------------------------------------------
#####ECOSGPLCOPYRIGHTEND####
##==========================================================================
#######DESCRIPTIONBEGIN####
##
## Author(s): sfurman
## Contributors:
## Date: 2003-01-20
## Purpose: ORP platform-specific init
## Description: This file handles the post-reset hardware initialization
## that is specific to the ORP platform (but not specific to
## the OpenRISC processor itself). So far, it only
## initializes the memory controller so as to map Flash and
## SDRAM into the memory space.
##
######DESCRIPTIONEND####
##
##==========================================================================
 
#ifndef _PLATFORM_INC_
#define _PLATFORM_INC_
 
#include <cyg/hal/mc.h>
#include CYGHWR_MEMORY_LAYOUT_H
 
/* Memory organization */
#define SDRAM_BASE_ADD CYGMEM_REGION_ram
#define FLASH_BASE_ADD CYGMEM_REGION_rom
 
/* Memory Controller's base address */
#define MC_BASE_ADD 0x93000000
 
/* Memory controller initialize magic values */
#define MC_CSR_VAL 0x0B000300
#define MC_MASK_VAL 0x000003f0
#define FLASH_TMS_VAL 0x00000103
#define SDRAM_TMS_VAL 0x19220057
#define FLASH_CSC_VAL (((FLASH_BASE_ADD>>6) & 0x07ff0000) | 0x0025)
#define SDRAM_CSC_VAL (((SDRAM_BASE_ADD>>6) & 0x07ff0000) | 0x0411)
 
# Platform-specific, post-reset hardware initialization
.macro hal_hardware_init
init_mc:
load32i r3,MC_BASE_ADD
 
# Program Flash chip-select
load32i r5,FLASH_CSC_VAL
l.sw MC_CSC(0)(r3),r5
 
# Init flash timing
load32i r5,FLASH_TMS_VAL
l.sw MC_TMS(0)(r3),r5
 
# Start decoding memory addresses to generate chip-selects
l.addi r5,r0,MC_MASK_VAL
l.sw MC_BA_MASK(r3),r5
 
load32i r5, MC_CSR_VAL
l.sw MC_CSR(r3),r5
 
# Init DRAM timing
load32i r5, SDRAM_TMS_VAL
l.sw MC_TMS(1)(r3),r5
 
# Program DRAM chip-select
load32i r5, SDRAM_CSC_VAL
l.sw MC_CSC(1)(r3),r5
 
# Wait for SDRAM
l.addi r3,r0,0x1000
1: l.sfeqi r3,0
l.bnf 1b
l.addi r3,r3,-1
.endm
#endif /* ifndef _PLATFORM_INC_ */
 
#undef CYGIMP_FORCE_INTERRUPT_HANDLING_CODE_IN_RAM
/orp/current/include/hal_diag.h
0,0 → 1,69
#ifndef CYGONCE_HAL_HAL_DIAG_H
#define CYGONCE_HAL_HAL_DIAG_H
 
//=============================================================================
//
// hal_diag.h
//
// HAL Support for Kernel Diagnostic Routines
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
// Copyright (C) 2002 Gary Thomas
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): nickg
// Contributors:nickg
// Date: 2003-02-28
// Purpose: HAL Support for Kernel Diagnostic Routines
// Description: Diagnostic routines for use during kernel development.
// Usage: #include <cyg/hal/hal_diag.h>
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
#include <pkgconf/hal.h>
 
#include <cyg/infra/cyg_type.h>
#include <cyg/hal/hal_if.h>
 
#define HAL_DIAG_INIT() hal_if_diag_init()
#define HAL_DIAG_WRITE_CHAR(_c_) hal_if_diag_write_char(_c_)
#define HAL_DIAG_READ_CHAR(_c_) hal_if_diag_read_char(&_c_)
 
//-----------------------------------------------------------------------------
// end of hal_diag.h
#endif // CYGONCE_HAL_HAL_DIAG_H
/orp/current/doc/README.html
0,0 → 1,13
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="refresh"
content="1;URL=&quot;../../../arch/current/doc/README.html">
<title>README - eCos OpenRISC Port</title>
</head>
<body>
Redirecting to OpenRISC eCos README...
</body>
</html>
/orp/current/ChangeLog
0,0 → 1,39
2003-03-06 Scott Furman <sfurman@rosum.com>
 
Initial port of eCos to OpenRISC Reference Platform (ORP)
 
//===========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
// Copyright (C) 2002 Gary Thomas
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//===========================================================================
/orp/current/src/hal_aux.c
0,0 → 1,67
//=============================================================================
//
// hal_aux.c
//
// HAL auxiliary objects and code; per platform
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
// Copyright (C) 2002 Gary Thomas
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): hmt
// Contributors:hmt
// Date: 2003-02-28
// Purpose: HAL aux objects: startup tables.
// Description: Tables for per-platform initialization
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
#include <cyg/hal/hal_if.h>
 
//--------------------------------------------------------------------------
// Platform init code.
void
hal_platform_init(void)
{
// Basic hardware initialization has already taken place
 
hal_if_init(); // Initialize logical I/O layer (virtual vector support)
}
 
// EOF hal_aux.c
 
/orp/current/src/hal_diag.c
0,0 → 1,594
//=============================================================================
//
// hal_diag.c
//
// Simple polling driver for the 16c550c serial controller(s) in the ORP,
// to be used for diagnostic I/O and gdb remote debugging.
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors:dmoseley
// Date: 2003-02-28
// Description: Simple polling driver for the 16c550c serial controller(s) in the ORP,
// to be used for diagnostic I/O and gdb remote debugging.
//
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
#include <pkgconf/hal.h>
#include <pkgconf/system.h>
#include CYGBLD_HAL_PLATFORM_H
 
#include <cyg/hal/hal_arch.h> // SAVE/RESTORE GP macros
#include <cyg/hal/hal_io.h> // IO macros
#include <cyg/hal/hal_if.h> // interface API
#include <cyg/hal/hal_intr.h> // HAL_ENABLE/MASK/UNMASK_INTERRUPTS
#include <cyg/hal/hal_misc.h> // Helper functions
#include <cyg/hal/drv_api.h> // CYG_ISR_HANDLED
#include <cyg/infra/cyg_ass.h> // assertion macros
 
//-----------------------------------------------------------------------------
// Base addresses for each 16550 UART in the system
#define SERIAL_16550_CONSOLE_BASE_ADDR 0x90000000
#define SERIAL_16550_DEBUGGER_BASE_ADDR 0x90000008
 
//-----------------------------------------------------------------------------
// Define the 16550C serial registers.
#define SER_16550_RBR 0x00 // receiver buffer register, read, dlab = 0
#define SER_16550_THR 0x00 // transmitter holding register, write, dlab = 0
#define SER_16550_DLL 0x00 // divisor latch (LS), read/write, dlab = 1
#define SER_16550_IER 0x01 // interrupt enable register, read/write, dlab = 0
#define SER_16550_DLM 0x01 // divisor latch (MS), read/write, dlab = 1
#define SER_16550_IIR 0x02 // interrupt identification reg, read, dlab = 0
#define SER_16550_FCR 0x02 // fifo control register, write, dlab = 0
#define SER_16550_AFR 0x02 // alternate function reg, read/write, dlab = 1
#define SER_16550_LCR 0x03 // line control register, read/write
#define SER_16550_MCR 0x04 // modem control register, read/write
#define SER_16550_LSR 0x05 // line status register, read
#define SER_16550_MSR 0x06 // modem status register, read
#define SER_16550_SCR 0x07 // scratch pad register
 
// The interrupt enable register bits.
#define SIO_IER_ERDAI 0x01 // enable received data available irq
#define SIO_IER_ETHREI 0x02 // enable THR empty interrupt
#define SIO_IER_ELSI 0x04 // enable receiver line status irq
#define SIO_IER_EMSI 0x08 // enable modem status interrupt
 
// The interrupt identification register bits.
#define SIO_IIR_IP 0x01 // 0 if interrupt pending
#define SIO_IIR_ID_MASK 0x0e // mask for interrupt ID bits
 
// The line status register bits.
#define SIO_LSR_DR 0x01 // data ready
#define SIO_LSR_OE 0x02 // overrun error
#define SIO_LSR_PE 0x04 // parity error
#define SIO_LSR_FE 0x08 // framing error
#define SIO_LSR_BI 0x10 // break interrupt
#define SIO_LSR_THRE 0x20 // transmitter holding register empty
#define SIO_LSR_TEMT 0x40 // transmitter register empty
#define SIO_LSR_ERR 0x80 // any error condition
 
// The modem status register bits.
#define SIO_MSR_DCTS 0x01 // delta clear to send
#define SIO_MSR_DDSR 0x02 // delta data set ready
#define SIO_MSR_TERI 0x04 // trailing edge ring indicator
#define SIO_MSR_DDCD 0x08 // delta data carrier detect
#define SIO_MSR_CTS 0x10 // clear to send
#define SIO_MSR_DSR 0x20 // data set ready
#define SIO_MSR_RI 0x40 // ring indicator
#define SIO_MSR_DCD 0x80 // data carrier detect
 
// The line control register bits.
#define SIO_LCR_WLS0 0x01 // word length select bit 0
#define SIO_LCR_WLS1 0x02 // word length select bit 1
#define SIO_LCR_STB 0x04 // number of stop bits
#define SIO_LCR_PEN 0x08 // parity enable
#define SIO_LCR_EPS 0x10 // even parity select
#define SIO_LCR_SP 0x20 // stick parity
#define SIO_LCR_SB 0x40 // set break
#define SIO_LCR_DLAB 0x80 // divisor latch access bit
 
// The FIFO control register
#define SIO_FCR_FCR0 0x01 // enable xmit and rcvr fifos
#define SIO_FCR_FCR1 0x02 // clear RCVR FIFO
#define SIO_FCR_FCR2 0x04 // clear XMIT FIFO
 
/////////////////////////////////////////
// Interrupt Enable Register
#define IER_RCV 0x01
#define IER_XMT 0x02
#define IER_LS 0x04
#define IER_MS 0x08
 
// Line Control Register
#define LCR_WL5 0x00 // Word length
#define LCR_WL6 0x01
#define LCR_WL7 0x02
#define LCR_WL8 0x03
#define LCR_SB1 0x00 // Number of stop bits
#define LCR_SB1_5 0x04 // 1.5 -> only valid with 5 bit words
#define LCR_SB2 0x04
#define LCR_PN 0x00 // Parity mode - none
#define LCR_PE 0x0C // Parity mode - even
#define LCR_PO 0x08 // Parity mode - odd
#define LCR_PM 0x28 // Forced "mark" parity
#define LCR_PS 0x38 // Forced "space" parity
#define LCR_DL 0x80 // Enable baud rate latch
 
// Line Status Register
#define LSR_RSR 0x01
#define LSR_THE 0x20
 
// Modem Control Register
#define MCR_DTR 0x01
#define MCR_RTS 0x02
#define MCR_INT 0x08 // Enable interrupts
 
// Interrupt status register
#define ISR_None 0x01
#define ISR_Rx_Line_Status 0x06
#define ISR_Rx_Avail 0x04
#define ISR_Rx_Char_Timeout 0x0C
#define ISR_Tx_Empty 0x02
#define ISR_Modem_Status 0x00
 
// FIFO control register
#define FCR_ENABLE 0x01
#define FCR_CLEAR_RCVR 0x02
#define FCR_CLEAR_XMIT 0x04
 
// Assume the UART is driven 1/16 CPU frequency
#define UART_CLOCK ((CYGHWR_HAL_OPENRISC_CPU_FREQ)*1.0e6/16.0)
 
#define DIVISOR(baud) ((int)((UART_CLOCK)/baud))
 
#ifdef CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
#define CYG_DEV_SERIAL_BAUD_DIVISOR \
DIVISOR(CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD)
#else
#error Missing/incorrect serial baud rate defined - CDL error?
#endif
 
 
//-----------------------------------------------------------------------------
typedef struct {
cyg_uint8* base;
cyg_int32 msec_timeout;
int isr_vector;
} channel_data_t;
 
static channel_data_t channels[] = {
{ (cyg_uint8*)SERIAL_16550_CONSOLE_BASE_ADDR,
1000,
CYGNUM_HAL_INTERRUPT_SERIAL_CONSOLE
},
{ (cyg_uint8*)SERIAL_16550_DEBUGGER_BASE_ADDR,
1000,
CYGNUM_HAL_INTERRUPT_SERIAL_DEBUGGER
}
};
 
//-----------------------------------------------------------------------------
// Set the baud rate
 
static void
cyg_hal_plf_serial_set_baud(cyg_uint8* port, cyg_uint16 baud_divisor)
{
cyg_uint8 _lcr;
 
HAL_READ_UINT8(port+SER_16550_LCR, _lcr);
_lcr |= LCR_DL;
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr);
 
HAL_WRITE_UINT8(port+SER_16550_DLM, baud_divisor >> 8);
HAL_WRITE_UINT8(port+SER_16550_DLL, baud_divisor & 0xff);
 
_lcr &= ~LCR_DL;
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr);
}
 
//-----------------------------------------------------------------------------
// The minimal init, get and put functions. All by polling.
 
void
cyg_hal_plf_serial_init_channel(void* __ch_data)
{
cyg_uint8* port;
cyg_uint8 _lcr;
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
port = ((channel_data_t*)__ch_data)->base;
 
// Disable port interrupts while changing hardware
HAL_WRITE_UINT8(port+SER_16550_IER, 0);
 
// Set databits, stopbits and parity.
_lcr = LCR_WL8 | LCR_SB1 | LCR_PN;
HAL_WRITE_UINT8(port+SER_16550_LCR, _lcr);
 
// Set baud rate.
cyg_hal_plf_serial_set_baud(port, CYG_DEV_SERIAL_BAUD_DIVISOR);
 
// Enable and clear FIFO
HAL_WRITE_UINT8(port+SER_16550_FCR, (FCR_ENABLE | FCR_CLEAR_RCVR | FCR_CLEAR_XMIT));
 
// enable RTS to keep host side happy
HAL_WRITE_UINT8( port+SER_16550_MCR, MCR_RTS );
// Don't allow interrupts.
HAL_WRITE_UINT8(port+SER_16550_IER, 0);
}
 
void
cyg_hal_plf_serial_putc(void* __ch_data, cyg_uint8 __ch)
{
cyg_uint8* port;
cyg_uint8 _lsr;
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
port = ((channel_data_t*)__ch_data)->base;
 
CYGARC_HAL_SAVE_GP();
 
do {
HAL_READ_UINT8(port+SER_16550_LSR, _lsr);
} while ((_lsr & SIO_LSR_THRE) == 0);
 
// Now, the transmit buffer is empty
HAL_WRITE_UINT8(port+SER_16550_THR, __ch);
 
// Hang around until the character has been safely sent.
do {
HAL_READ_UINT8(port+SER_16550_LSR, _lsr);
} while ((_lsr & SIO_LSR_THRE) == 0);
 
CYGARC_HAL_RESTORE_GP();
}
 
static int lsr_global;
 
static cyg_bool
cyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch)
{
cyg_uint8* port;
cyg_uint8 _lsr;
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
port = ((channel_data_t*)__ch_data)->base;
 
HAL_READ_UINT8(port+SER_16550_LSR, _lsr);
if ((_lsr & SIO_LSR_DR) == 0)
return false;
lsr_global = _lsr;
CYG_ASSERT((_lsr & SIO_LSR_OE) == 0 , "UART receiver overrun error");
HAL_READ_UINT8(port+SER_16550_RBR, *ch);
 
return true;
}
 
cyg_uint8
cyg_hal_plf_serial_getc(void* __ch_data)
{
cyg_uint8 ch;
CYGARC_HAL_SAVE_GP();
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
while(!cyg_hal_plf_serial_getc_nonblock(__ch_data, &ch));
 
CYGARC_HAL_RESTORE_GP();
return ch;
}
 
static void
cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf,
cyg_uint32 __len)
{
CYGARC_HAL_SAVE_GP();
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
while(__len-- > 0)
cyg_hal_plf_serial_putc(__ch_data, *__buf++);
 
CYGARC_HAL_RESTORE_GP();
}
 
static void
cyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len)
{
CYGARC_HAL_SAVE_GP();
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
while(__len-- > 0)
*__buf++ = cyg_hal_plf_serial_getc(__ch_data);
 
CYGARC_HAL_RESTORE_GP();
}
 
 
cyg_bool
cyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch)
{
int delay_count;
channel_data_t* chan;
cyg_bool res;
CYGARC_HAL_SAVE_GP();
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
chan = (channel_data_t*)__ch_data;
 
delay_count = chan->msec_timeout; // delay in 1000 us steps
 
for(;;) {
res = cyg_hal_plf_serial_getc_nonblock(__ch_data, ch);
if (res || 0 == delay_count--)
break;
CYGACC_CALL_IF_DELAY_US(1000);
}
 
CYGARC_HAL_RESTORE_GP();
return res;
}
 
static int
cyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...)
{
static int irq_state = 0;
channel_data_t* chan;
cyg_uint8 ier;
int ret = 0;
CYGARC_HAL_SAVE_GP();
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
chan = (channel_data_t*)__ch_data;
 
switch (__func) {
case __COMMCTL_IRQ_ENABLE:
irq_state = 1;
 
HAL_READ_UINT8(chan->base + SER_16550_IER, ier);
ier |= SIO_IER_ERDAI;
HAL_WRITE_UINT8(chan->base + SER_16550_IER, ier);
 
HAL_INTERRUPT_SET_LEVEL(chan->isr_vector, 1);
HAL_INTERRUPT_UNMASK(chan->isr_vector);
break;
case __COMMCTL_IRQ_DISABLE:
ret = irq_state;
irq_state = 0;
 
HAL_READ_UINT8(chan->base + SER_16550_IER, ier);
ier &= ~SIO_IER_ERDAI;
HAL_WRITE_UINT8(chan->base + SER_16550_IER, ier);
 
HAL_INTERRUPT_MASK(chan->isr_vector);
break;
case __COMMCTL_DBG_ISR_VECTOR:
ret = chan->isr_vector;
break;
case __COMMCTL_SET_TIMEOUT:
{
va_list ap;
 
va_start(ap, __func);
 
ret = chan->msec_timeout;
chan->msec_timeout = va_arg(ap, cyg_uint32);
 
va_end(ap);
}
break;
case __COMMCTL_SETBAUD:
{
cyg_uint32 baud_rate;
cyg_uint16 baud_divisor;
cyg_uint8* port = chan->base;
va_list ap;
 
va_start(ap, __func);
baud_rate = va_arg(ap, cyg_uint32);
va_end(ap);
 
switch (baud_rate)
{
case 110: baud_divisor = DIVISOR(110); break;
case 150: baud_divisor = DIVISOR(150); break;
case 300: baud_divisor = DIVISOR(300); break;
case 600: baud_divisor = DIVISOR(600); break;
case 1200: baud_divisor = DIVISOR(1200); break;
case 2400: baud_divisor = DIVISOR(2400); break;
case 4800: baud_divisor = DIVISOR(4800); break;
case 7200: baud_divisor = DIVISOR(7200); break;
case 9600: baud_divisor = DIVISOR(9600); break;
case 14400: baud_divisor = DIVISOR(14400); break;
case 19200: baud_divisor = DIVISOR(19200); break;
case 38400: baud_divisor = DIVISOR(38400); break;
case 57600: baud_divisor = DIVISOR(57600); break;
case 115200: baud_divisor = DIVISOR(115200); break;
case 230400: baud_divisor = DIVISOR(230400); break;
default: return -1; break; // Invalid baud rate selected
}
 
// Disable port interrupts while changing hardware
HAL_READ_UINT8(port+SER_16550_IER, ier);
HAL_WRITE_UINT8(port+SER_16550_IER, 0);
 
// Set baud rate.
cyg_hal_plf_serial_set_baud(port, baud_divisor);
 
// Reenable interrupts if necessary
HAL_WRITE_UINT8(port+SER_16550_IER, ier);
}
break;
 
case __COMMCTL_GETBAUD:
break;
default:
break;
}
CYGARC_HAL_RESTORE_GP();
return ret;
}
 
static int
cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc,
CYG_ADDRWORD __vector, CYG_ADDRWORD __data)
{
int res = 0;
cyg_uint8 _iir, c;
channel_data_t* chan;
CYGARC_HAL_SAVE_GP();
 
// Some of the diagnostic print code calls through here with no idea what the ch_data is.
// Go ahead and assume it is channels[0].
if (__ch_data == 0)
__ch_data = (void*)&channels[0];
 
chan = (channel_data_t*)__ch_data;
 
HAL_INTERRUPT_ACKNOWLEDGE(chan->isr_vector);
 
HAL_READ_UINT8(chan->base + SER_16550_IIR, _iir);
_iir &= SIO_IIR_ID_MASK;
 
*__ctrlc = 0;
if ((_iir == ISR_Rx_Avail) || (_iir == ISR_Rx_Char_Timeout)) {
 
HAL_READ_UINT8(chan->base + SER_16550_RBR, c);
if( cyg_hal_is_break( &c , 1 ) )
*__ctrlc = 1;
 
res = CYG_ISR_HANDLED;
}
 
/* sfurman - Hmmm. Under or1ksim, we sometimes receive interrupts
when no characters are in the FIFO. I think this is a SW bug
and not a problem w/ or1ksim, but until the problem is solved,
we always consume the interrupt */
res = CYG_ISR_HANDLED;
 
CYGARC_HAL_RESTORE_GP();
return res;
}
 
static void
cyg_hal_plf_serial_init(void)
{
int i;
hal_virtual_comm_table_t* comm;
int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
 
//#define NUM_CHANNELS (sizeof(channels)/sizeof(channels[0]))
#define NUM_CHANNELS CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS
for (i = 0; i < NUM_CHANNELS; i++) {
 
// Disable interrupts.
HAL_INTERRUPT_MASK(channels[i].isr_vector);
 
// Init channels
cyg_hal_plf_serial_init_channel((void*)&channels[i]);
// Setup procs in the vector table
 
// Set COMM callbacks for channel
CYGACC_CALL_IF_SET_CONSOLE_COMM(i);
comm = CYGACC_CALL_IF_CONSOLE_PROCS();
CYGACC_COMM_IF_CH_DATA_SET(*comm, &channels[i]);
CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);
CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);
CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);
CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);
CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);
CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout);
}
 
// Restore original console
CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
}
 
void
cyg_hal_plf_comms_init(void)
{
static int initialized = 0;
 
if (initialized)
return;
 
initialized = 1;
 
cyg_hal_plf_serial_init();
}
 
//-----------------------------------------------------------------------------
// end of ser16c550c.c
 
/arch/current/cdl/hal_openrisc.cdl
0,0 → 1,111
# ====================================================================
#
# hal_openrisc.cdl
#
# OpenRISC architectural HAL package configuration data
#
# ====================================================================
#####ECOSGPLCOPYRIGHTBEGIN####
## -------------------------------------------
## This file is part of eCos, the Embedded Configurable Operating System.
## Copyright (C) 2003 Red Hat, Inc.
##
## eCos is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free
## Software Foundation; either version 2 or (at your option) any later version.
##
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
## WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
## for more details.
##
## You should have received a copy of the GNU General Public License along
## with eCos; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
##
## As a special exception, if other files instantiate templates or use macros
## or inline functions from this file, or you compile this file and link it
## with other works to produce a work based on this file, this file does not
## by itself cause the resulting work to be covered by the GNU General Public
## License. However the source code for this file must still be made available
## in accordance with section (3) of the GNU General Public License.
##
## This exception does not invalidate any other reasons why a work based on
## this file might be covered by the GNU General Public License.
##
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
## at http://sources.redhat.com/ecos/ecos-license/
## -------------------------------------------
#####ECOSGPLCOPYRIGHTEND####
# ====================================================================
######DESCRIPTIONBEGIN####
#
# Author(s): sfurman
# Original data: bartv, nickg
# Contributors: jskov
# Date: 2003-02-28
#
#####DESCRIPTIONEND####
#
# ====================================================================
 
cdl_package CYGPKG_HAL_OPENRISC {
display "OpenRISC architecture"
parent CYGPKG_HAL
hardware
include_dir cyg/hal
define_header hal_openrisc.h
description "
The OpenRISC architecture HAL package provides generic support
for this processor architecture. It is also necessary to
select a specific target platform HAL package."
 
# For now, there are no defined variants of the OpenRISC
# cdl_interface CYGINT_HAL_OPENRISC_VARIANT {
# display "Number of variant implementations in this configuration"
# requires 1 == CYGINT_HAL_OPENRISC_VARIANT
# }
 
compile context.S vectors.S hal_misc.c openrisc_stub.c
 
make {
<PREFIX>/lib/vectors.o : <PACKAGE>/src/vectors.S
$(CC) -Wp,-MD,vectors.tmp $(INCLUDE_PATH) $(CFLAGS) -c -o $@ $<
@echo $@ ": \\" > $(notdir $@).deps
@tail +2 vectors.tmp >> $(notdir $@).deps
@echo >> $(notdir $@).deps
@rm vectors.tmp
}
 
define_proc {
puts $::cdl_header "#define HAL_ARCH_PROGRAM_NEW_STACK hal_arch_program_new_stack"
}
 
cdl_option CYGBLD_LINKER_SCRIPT {
display "Linker script"
flavor data
no_define
calculated { "src/openrisc.ld" }
}
 
make {
<PREFIX>/lib/target.ld: <PACKAGE>/src/openrisc.ld
$(CC) -E -P -Wp,-MD,target.tmp -DEXTRAS=1 -xc $(INCLUDE_PATH) $(CFLAGS) -o $@ $<
@echo $@ ": \\" > $(notdir $@).deps
@tail +2 target.tmp >> $(notdir $@).deps
@echo >> $(notdir $@).deps
@rm target.tmp
}
 
cdl_option CYGHWR_HAL_OPENRISC_CPU_FREQ {
display "CPU frequency"
flavor data
legal_values 0 to 1000000
default_value 104
description "
This option contains the frequency of the CPU in MegaHertz.
Choose the frequency to match the processor you have. This
may affect thing like serial device, interval clock and
memory access speed settings."
}
}
/arch/current/include/hal_io.h
0,0 → 1,158
#ifndef CYGONCE_HAL_HAL_IO_H
#define CYGONCE_HAL_HAL_IO_H
 
//=============================================================================
//
// hal_io.h
//
// HAL device IO register support.
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): nickg
// Contributors: nickg
// Date: 2003-02-28
// Purpose: Define IO register support
// Description: The macros defined here provide the HAL APIs for handling
// device IO control registers.
//
// Usage:
// #include <cyg/hal/hal_io.h>
// ...
//
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
#include <pkgconf/hal.h>
 
#include <cyg/infra/cyg_type.h>
 
//#include <cyg/hal/plf_io.h>
 
//-----------------------------------------------------------------------------
// IO Register address.
// This type is for recording the address of an IO register.
 
typedef volatile CYG_ADDRWORD HAL_IO_REGISTER;
 
//-----------------------------------------------------------------------------
// HAL IO macros.
#ifndef HAL_IO_MACROS_DEFINED
 
//-----------------------------------------------------------------------------
// BYTE Register access.
// Individual and vectorized access to 8 bit registers.
 
#define HAL_READ_UINT8( _register_, _value_ ) \
((_value_) = *((volatile CYG_BYTE *)(_register_)))
 
#define HAL_WRITE_UINT8( _register_, _value_ ) \
(*((volatile CYG_BYTE *)(_register_)) = (_value_))
 
#define HAL_READ_UINT8_VECTOR( _register_, _buf_, _count_, _step_ ) \
{ \
cyg_count32 _i_,_j_; \
for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \
(_buf_)[_i_] = ((volatile CYG_BYTE *)(_register_))[_j_]; \
}
 
#define HAL_WRITE_UINT8_VECTOR( _register_, _buf_, _count_, _step_ ) \
{ \
cyg_count32 _i_,_j_; \
for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \
((volatile CYG_BYTE *)(_register_))[_j_] = (_buf_)[_i_]; \
}
 
 
//-----------------------------------------------------------------------------
// 16 bit access.
// Individual and vectorized access to 16 bit registers.
#define HAL_READ_UINT16( _register_, _value_ ) \
((_value_) = *((volatile CYG_WORD16 *)(_register_)))
 
#define HAL_WRITE_UINT16( _register_, _value_ ) \
(*((volatile CYG_WORD16 *)(_register_)) = (_value_))
 
#define HAL_READ_UINT16_VECTOR( _register_, _buf_, _count_, _step_ ) \
{ \
cyg_count32 _i_,_j_; \
for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \
(_buf_)[_i_] = ((volatile CYG_WORD16 *)(_register_))[_j_]; \
}
 
#define HAL_WRITE_UINT16_VECTOR( _register_, _buf_, _count_, _step_ ) \
{ \
cyg_count32 _i_,_j_; \
for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \
((volatile CYG_WORD16 *)(_register_))[_j_] = (_buf_)[_i_]; \
}
 
//-----------------------------------------------------------------------------
// 32 bit access.
// Individual and vectorized access to 32 bit registers.
#define HAL_READ_UINT32( _register_, _value_ ) \
((_value_) = *((volatile CYG_WORD32 *)(_register_)))
 
#define HAL_WRITE_UINT32( _register_, _value_ ) \
(*((volatile CYG_WORD32 *)(_register_)) = (_value_))
 
#define HAL_READ_UINT32_VECTOR( _register_, _buf_, _count_, _step_ ) \
{ \
cyg_count32 _i_,_j_; \
for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \
(_buf_)[_i_] = ((volatile CYG_WORD32 *)(_register_))[_j_]; \
}
 
#define HAL_WRITE_UINT32_VECTOR( _register_, _buf_, _count_, _step_ ) \
{ \
cyg_count32 _i_,_j_; \
for( _i_ = 0, _j_ = 0; _i_ < (_count_); _i_++, _j_ += (_step_)) \
((volatile CYG_WORD32 *)(_register_))[_j_] = (_buf_)[_i_]; \
}
 
#define HAL_IO_MACROS_DEFINED
 
#endif
 
 
//-----------------------------------------------------------------------------
#endif // ifndef CYGONCE_HAL_HAL_IO_H
// End of hal_io.h
/arch/current/include/openrisc_opcode.h
0,0 → 1,92
//=============================================================================
//
// openrisc_opcode.h
//
// Define the instruction formats and opcode values for the OpenRISC
// instruction set...or at least just enough of them to implement
// single-stepping.
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors:
// Date: 2003-02-28
// Purpose: Allow dissection of OpenRISC instructions
// Description: The types and macros defined here define the instruction
// formats of the OpenRISC instruction set...or at least the
// very limited subset necessary to allow single-stepping.
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
#ifndef _OPENRISC_OPCODE_H
#define _OPENRISC_OPCODE_H
 
 
// Define the instruction formats.
typedef union {
unsigned word;
 
// (Possibly conditional) relative jump w/ immediate displacement
struct {
unsigned op: 6; // OP_J, OP_JAL, OP_BNF, or OP_BF
signed target: 26;
} JType;
 
// Absolute jump w/ register contents used as PC target address
struct {
unsigned op: 6; // OP_JR or OP_JALR
unsigned unused1:10;
unsigned rB: 5; // Register containing new PC
unsigned unused2:11;
} JRType;
 
} InstFmt;
 
/*
* Values for the 'op' field.
*/
#define OP_J 0x00
#define OP_JAL 0x01
#define OP_BNF 0x03
#define OP_BF 0x04
#define OP_RFE 0x09
#define OP_JR 0x11
#define OP_JALR 0x12
 
#endif /* _OPENRISC_OPCODE_H */
/arch/current/include/basetype.h
0,0 → 1,76
#ifndef CYGONCE_HAL_BASETYPE_H
#define CYGONCE_HAL_BASETYPE_H
 
//=============================================================================
//
// basetype.h
//
// Standard types for this architecture.
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors: nickg
// Date: 2003-02-28
// Purpose: Define architecture base types.
// Usage: Included by <cyg/infra/cyg_types.h>, do not use directly
//
//####DESCRIPTIONEND####
//
 
#include <pkgconf/hal.h>
 
//-----------------------------------------------------------------------------
// Characterize the architecture
 
# define CYG_BYTEORDER CYG_MSBFIRST // Big endian
# define CYG_DOUBLE_BYTEORDER CYG_MSBFIRST // Big endian
 
//-----------------------------------------------------------------------------
// Prepend underscore to symbol name for it to be visible from C
#define CYG_LABEL_DEFN(_name_) _##_name_
 
//-----------------------------------------------------------------------------
// Define the standard variable sizes
 
// (The OpenRISC architecture uses the default definitions of the base types,
// so we do not need to define any here.)
 
//-----------------------------------------------------------------------------
#endif // CYGONCE_HAL_BASETYPE_H
 
// End of basetype.h
/arch/current/include/arch.inc
0,0 → 1,106
##=============================================================================
##
## arch.inc
##
## OpenRISC assembler header file
##
##=============================================================================
#####ECOSGPLCOPYRIGHTBEGIN####
## -------------------------------------------
## This file is part of eCos, the Embedded Configurable Operating System.
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
##
## eCos is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free
## Software Foundation; either version 2 or (at your option) any later version.
##
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
## WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
## for more details.
##
## You should have received a copy of the GNU General Public License along
## with eCos; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
##
## As a special exception, if other files instantiate templates or use macros
## or inline functions from this file, or you compile this file and link it
## with other works to produce a work based on this file, this file does not
## by itself cause the resulting work to be covered by the GNU General Public
## License. However the source code for this file must still be made available
## in accordance with section (3) of the GNU General Public License.
##
## This exception does not invalidate any other reasons why a work based on
## this file might be covered by the GNU General Public License.
##
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
## at http://sources.redhat.com/ecos/ecos-license/
## -------------------------------------------
#####ECOSGPLCOPYRIGHTEND####
##=============================================================================
#######DESCRIPTIONBEGIN####
##
## Author(s): sfurman
## Contributors:
## Date: 2003-01-15
## Purpose: Architecture definitions.
## Description: This file contains various definitions and macros that are
## useful for writing assembly code for the OpenRISC CPU family.
## Usage:
## #include <cyg/hal/arch.inc>
## ...
##
##
######DESCRIPTIONEND####
##
##=============================================================================
 
#ifndef CYGONCE_HAL_ARCH_INC
#define CYGONCE_HAL_ARCH_INC
 
# Declare given label name as the start of a function accessible from C code
#define FUNC_START(name) \
.type _##name,@function; \
.globl _##name; \
_##name:
 
#define FUNC_END(name)
 
# Make aliases for ABI distinguished registers
#define sp r1
#define fp r2
#define lr r9
 
# Size of GPR regs - 4 bytes for or32
#define OR1K_GPRSIZE 4
 
# Size of all other registers
#define OR1K_REGSIZE 4
 
# Utility macro: Load a 32-bit constant into a register
.macro load32i reg const
l.movhi \reg,hi(\const)
l.ori \reg,\reg,lo(\const)
.endm
 
##-----------------------------------------------------------------------------
 
## OpenRISC thread and interrupt saved state structure. These offsets
## must match the layout of the HAL_SavedRegisters struct in
## hal_arch.h. Do not change this without changing the layout there,
## or viceversa.
 
#define OR1KREGS_GPRS 0
#define OR1KREG_MACHI (OR1KREGS_GPRS + OR1K_GPRSIZE * 32)
#define OR1KREG_MACLO (OR1KREG_MACHI + OR1K_REGSIZE)
#define OR1KREG_VECTOR (OR1KREG_MACLO + OR1K_REGSIZE)
#define OR1KREG_SR (OR1KREG_VECTOR+ OR1K_REGSIZE)
#define OR1KREG_PC (OR1KREG_SR + OR1K_REGSIZE)
#define OR1KREG_EEAR (OR1KREG_PC + OR1K_REGSIZE)
 
#define SIZEOF_OR1KREGS (OR1KREG_EEAR + OR1K_REGSIZE)
 
#include <cyg/hal/openrisc.inc>
#include <cyg/hal/platform.inc>
 
#endif // #ifndef CYGONCE_HAL_ARCH_INC
/arch/current/include/openrisc_stub.h
0,0 → 1,166
//========================================================================
//
// openrisc_stub.h
//
// OpenRISC-specific definitions for remote debugging via gdb
//
//========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors:Red Hat, nickg, dmoseley
// Date: 2003-02-18
// Purpose: OpenRISC-specific definitions for gdb stubs support
//
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
#ifndef CYGONCE_HAL_OPENRISC_STUB_H
#define CYGONCE_HAL_OPENRISC_STUB_H
 
#include <pkgconf/system.h>
#include <pkgconf/hal.h>
 
#ifdef CYGPKG_IO_SERIAL
#include <pkgconf/io_serial.h>
#endif
 
#include <cyg/hal/hal_diag.h>
 
#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
 
#include <cyg/infra/cyg_type.h> // CYG_UNUSED_PARAM, externC
 
#define HAL_STUB_PLATFORM_INIT_SERIAL() HAL_DIAG_INIT()
 
#define HAL_STUB_PLATFORM_GET_CHAR() \
((cyg_int8)({ \
cyg_int8 _ch_; \
HAL_DIAG_READ_CHAR(_ch_); \
_ch_; \
}))
 
#define HAL_STUB_PLATFORM_PUT_CHAR(c) HAL_DIAG_WRITE_CHAR((c))
 
#define HAL_STUB_PLATFORM_SET_BAUD_RATE(baud) CYG_UNUSED_PARAM(int,(baud))
 
#define HAL_STUB_PLATFORM_RESET() HAL_DIAG_INIT()
 
#define HAL_STUB_PLATFORM_INIT() HAL_DIAG_INIT()
 
#endif // ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
 
// 32 GPRs + 32 VFRs + PC reg + SR reg
#define NUMREGS 66
 
// VFR regs are unimplemented so they are 0 bytes in length
#define REGSIZE( _x_ ) ((((_x_) <= R31) || ((_x_) > VFR31)) ? 4 : 0)
 
typedef unsigned long target_register_t;
 
enum regnames {
R0, SP, R2, R3, R4, R5, R6, R7,
R8, R9, R10, R11, R12, R13, R14, R15,
R16, R17, R18, R19, R20, R21, R22, R23,
R24, R25, R26, R27, R28, R29, R30, R31,
 
 
// Vector/Float registers, which are as yet unimplemented,
// but defined in the or32 gdb back-end.
 
VFR0, VFR1, VFR2, VFR3, VFR4, VFR5, VFR6, VFR7,
VFR8, VFR9, VFR10, VFR11, VFR12, VFR13, VFR14, VFR15,
VFR16, VFR17, VFR18, VFR19, VFR20, VFR21, VFR22, VFR23,
VFR24, VFR25, VFR26, VFR27, VFR28, VFR29, VFR30, VFR31,
 
// Special-purpose registers
PC, SR
};
 
typedef enum regnames regnames_t;
 
// Override generic stubs get_register() and use arch-specific version
#define CYGARC_STUB_REGISTER_ACCESS_DEFINED
 
#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)
#define HAL_GET_PROFILE_INFO( _thepc_, _thesp_ ) \
CYG_MACRO_START \
extern HAL_SavedRegisters *hal_saved_interrupt_state; \
if ( hal_saved_interrupt_state ) { \
(_thepc_) = (char *)(hal_saved_interrupt_state->pc); \
(_thesp_) = (char *)(hal_saved_interrupt_state->sp); \
} \
CYG_MACRO_END
#endif
 
/* Given a trap value TRAP, return the corresponding signal. */
externC int __computeSignal (unsigned int trap_number);
 
/* Return the trap number corresponding to the last-taken trap. */
externC int __get_trap_number (void);
 
/* Return the currently-saved value corresponding to register REG. */
externC target_register_t get_register (regnames_t reg);
 
/* Store VALUE in the register corresponding to WHICH. */
externC void put_register (regnames_t which, target_register_t value);
 
/* Set the currently-saved pc register value to PC. This also updates NPC
as needed. */
externC void set_pc (target_register_t pc);
 
/* Set things up so that the next user resume will execute one instruction.
This may be done by setting breakpoints or setting a single step flag
in the saved user registers, for example. */
externC void __single_step (void);
 
/* Clear the single-step state. */
externC void __clear_single_step (void);
 
/* If the breakpoint we hit is in the breakpoint() instruction, return a
non-zero value. */
externC int __is_breakpoint_function (void);
 
/* Skip the current instruction. */
externC void __skipinst (void);
 
externC void __install_breakpoints (void);
 
externC void __clear_breakpoints (void);
 
#endif // ifndef CYGONCE_HAL_OPENRISC_STUB_H
/arch/current/include/hal_intr.h
0,0 → 1,458
//==========================================================================
//
// hal_intr.h
//
// HAL Interrupt and clock support
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors:
// Date: 2003-01-24
// Purpose: Define Interrupt support
// Description: The macros defined here provide the HAL APIs for handling
// both external interrupts and clock interrupts.
//
// Usage:
// #include <cyg/hal/hal_intr.h>
// ...
//
//
//####DESCRIPTIONEND####
//
//==========================================================================
 
#ifndef CYGONCE_HAL_HAL_INTR_H
#define CYGONCE_HAL_HAL_INTR_H
 
#include <cyg/hal/hal_arch.h>
 
//--------------------------------------------------------------------------
// OpenRISC vectors.
 
// These are the exception/interrupt causes defined by the hardware.
// These values are the ones to use for HAL_VSR_GET/SET
 
// Reset
#define CYGNUM_HAL_VECTOR_RESET 0x01
 
// Bus Error - probably invalid physical address
#define CYGNUM_HAL_VECTOR_BUS_ERROR 0x02
 
// Either no matching page-table entry or protection fault
// while executing load/store operation
#define CYGNUM_HAL_VECTOR_DATA_PAGE_FAULT 0x03
 
// Either no matching page-table entry or protection fault
// while fetching instruction
#define CYGNUM_HAL_VECTOR_INSTR_PAGE_FAULT 0x04
 
// Tick Timer interrupt
#define CYGNUM_HAL_VECTOR_TICK_TIMER 0x05
 
// Unaligned access
#define CYGNUM_HAL_VECTOR_UNALIGNED_ACCESS 0x06
 
// Illegal instruction
#define CYGNUM_HAL_VECTOR_RESERVED_INSTRUCTION 0x07
 
// External Interrupt from PIC
#define CYGNUM_HAL_VECTOR_INTERRUPT 0x08
 
// D-TLB Miss
#define CYGNUM_HAL_VECTOR_DTLB_MISS 0x09
 
// I-TLB Miss
#define CYGNUM_HAL_VECTOR_ITLB_MISS 0x0A
 
// Numeric overflow, etc.
#define CYGNUM_HAL_VECTOR_RANGE 0x0B
 
// System Call
#define CYGNUM_HAL_VECTOR_SYSTEM_CALL 0x0C
 
// TRAP instruction executed
#define CYGNUM_HAL_VECTOR_TRAP 0x0E
 
#define CYGNUM_HAL_VSR_MIN CYGNUM_HAL_VECTOR_RESET
#define CYGNUM_HAL_VSR_MAX CYGNUM_HAL_VECTOR_TRAP
#define CYGNUM_HAL_VSR_COUNT (CYGNUM_HAL_VSR_MAX-CYGNUM_HAL_VSR_MIN+1)
 
// Exception vectors. These are the values used when passed out to an
// external exception handler using cyg_hal_deliver_exception()
 
#define CYGNUM_HAL_EXCEPTION_DATA_TLBMISS_ACCESS \
CYGNUM_HAL_VECTOR_DTLB_MISS
#define CYGNUM_HAL_EXCEPTION_DATA_TLBMISS_ACCESS \
CYGNUM_HAL_VECTOR_DTLB_MISS
#define CYGNUM_HAL_EXCEPTION_DATA_UNALIGNED_ACCESS \
CYGNUM_HAL_VECTOR_UNALIGNED_ACCESS
#define CYGNUM_HAL_EXCEPTION_SYSTEM_CALL CYGNUM_HAL_VECTOR_SYSTEM_CALL
#define CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION \
CYGNUM_HAL_VECTOR_RESERVED_INSTRUCTION
#define CYGNUM_HAL_EXCEPTION_OVERFLOW CYGNUM_HAL_VECTOR_RANGE
#define CYGNUM_HAL_EXCEPTION_INTERRUPT CYGNUM_HAL_VECTOR_INTERRUPT
 
// Min/Max exception numbers and how many there are
#define CYGNUM_HAL_EXCEPTION_MIN CYGNUM_HAL_VSR_MIN
#define CYGNUM_HAL_EXCEPTION_MAX CYGNUM_HAL_VSR_MAX
#define CYGNUM_HAL_EXCEPTION_COUNT \
( CYGNUM_HAL_EXCEPTION_MAX - CYGNUM_HAL_EXCEPTION_MIN + 1 )
 
 
#ifndef CYGHWR_HAL_INTERRUPT_VECTORS_DEFINED
#define CYGHWR_HAL_INTERRUPT_VECTORS_DEFINED
 
// Interrupts 0-31 are connected to the PIC
#define CYGNUM_HAL_INTERRUPT_0 0
#define CYGNUM_HAL_INTERRUPT_1 1
#define CYGNUM_HAL_INTERRUPT_2 2
#define CYGNUM_HAL_INTERRUPT_3 3
#define CYGNUM_HAL_INTERRUPT_4 4
#define CYGNUM_HAL_INTERRUPT_5 5
#define CYGNUM_HAL_INTERRUPT_6 6
#define CYGNUM_HAL_INTERRUPT_7 7
#define CYGNUM_HAL_INTERRUPT_8 8
#define CYGNUM_HAL_INTERRUPT_9 9
#define CYGNUM_HAL_INTERRUPT_10 10
#define CYGNUM_HAL_INTERRUPT_11 11
#define CYGNUM_HAL_INTERRUPT_12 12
#define CYGNUM_HAL_INTERRUPT_13 13
#define CYGNUM_HAL_INTERRUPT_14 14
#define CYGNUM_HAL_INTERRUPT_15 15
#define CYGNUM_HAL_INTERRUPT_16 16
#define CYGNUM_HAL_INTERRUPT_17 17
#define CYGNUM_HAL_INTERRUPT_18 18
#define CYGNUM_HAL_INTERRUPT_19 19
#define CYGNUM_HAL_INTERRUPT_20 20
#define CYGNUM_HAL_INTERRUPT_21 21
#define CYGNUM_HAL_INTERRUPT_22 22
#define CYGNUM_HAL_INTERRUPT_23 23
#define CYGNUM_HAL_INTERRUPT_24 24
#define CYGNUM_HAL_INTERRUPT_25 25
#define CYGNUM_HAL_INTERRUPT_26 26
#define CYGNUM_HAL_INTERRUPT_27 27
#define CYGNUM_HAL_INTERRUPT_28 28
#define CYGNUM_HAL_INTERRUPT_29 29
#define CYGNUM_HAL_INTERRUPT_30 30
#define CYGNUM_HAL_INTERRUPT_31 31
 
// By SW convention, interrupt #32 is the tick timer
#define CYGNUM_HAL_INTERRUPT_32 32
 
// The interrupt vector used by the RTC, aka tick timer
#define CYGNUM_HAL_INTERRUPT_RTC CYGNUM_HAL_INTERRUPT_32
 
// Min/Max ISR numbers and how many there are
#define CYGNUM_HAL_ISR_MIN 0
#define CYGNUM_HAL_ISR_MAX 32
#define CYGNUM_HAL_ISR_COUNT 33
 
#endif
 
#ifndef __ASSEMBLER__
#include <pkgconf/hal.h>
 
#include <cyg/infra/cyg_type.h>
#include <cyg/hal/hal_io.h>
 
#include <cyg/hal/plf_intr.h>
 
//--------------------------------------------------------------------------
// Static data used by HAL
 
// ISR tables
externC volatile CYG_ADDRESS hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT];
externC volatile CYG_ADDRWORD hal_interrupt_data[CYGNUM_HAL_ISR_COUNT];
externC volatile CYG_ADDRESS hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT];
 
// VSR table
externC volatile CYG_ADDRESS hal_vsr_table[CYGNUM_HAL_VSR_MAX+1];
 
//--------------------------------------------------------------------------
// Default ISR
// The #define is used to test whether this routine exists, and to allow
// us to call it.
 
externC cyg_uint32 hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data);
 
#define HAL_DEFAULT_ISR hal_default_isr
 
//--------------------------------------------------------------------------
// Interrupt state storage
 
typedef cyg_uint32 CYG_INTERRUPT_STATE;
 
//--------------------------------------------------------------------------
// Interrupt control macros
#ifndef CYGHWR_HAL_INTERRUPT_ENABLE_DISABLE_RESTORE_DEFINED
 
// Clear both tick timer and external interrupts in the Supervisor Register
#define HAL_DISABLE_INTERRUPTS(_old_) \
CYG_MACRO_START \
_old_ = MFSPR(SPR_SR); \
MTSPR(SPR_SR, _old_ & ~(SPR_SR_IEE|SPR_SR_TEE)); \
CYG_MACRO_END
 
// Enable both tick timer and external interrupts in the Supervisor Register
#define HAL_ENABLE_INTERRUPTS() \
MTSPR(SPR_SR, MFSPR(SPR_SR) | (SPR_SR_IEE|SPR_SR_TEE))
 
// Copy interrupt flags from argument into Supervisor Register
#define HAL_RESTORE_INTERRUPTS(_old_) \
CYG_MACRO_START \
cyg_uint32 t1,t2; \
t1 = MFSPR(SPR_SR) & ~(SPR_SR_IEE|SPR_SR_TEE); \
t2 = (_old_) & (SPR_SR_IEE|SPR_SR_TEE); \
MTSPR(SPR_SR, t1 | t2); \
CYG_MACRO_END
 
#define HAL_QUERY_INTERRUPTS( _state_ ) \
CYG_MACRO_START \
_state = MFSPR(SPR_SR); \
CYG_MACRO_END
 
#endif // CYGHWR_HAL_INTERRUPT_ENABLE_DISABLE_RESTORE_DEFINED
 
//--------------------------------------------------------------------------
// Routine to execute DSRs using separate interrupt stack
 
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
externC void hal_interrupt_stack_call_pending_DSRs(void);
#define HAL_INTERRUPT_STACK_CALL_PENDING_DSRS() \
hal_interrupt_stack_call_pending_DSRs()
 
// these are offered solely for stack usage testing
// if they are not defined, then there is no interrupt stack.
#define HAL_INTERRUPT_STACK_BASE cyg_interrupt_stack_base
#define HAL_INTERRUPT_STACK_TOP cyg_interrupt_stack
// use them to declare these extern however you want:
// extern char HAL_INTERRUPT_STACK_BASE[];
// extern char HAL_INTERRUPT_STACK_TOP[];
// is recommended
#endif
 
//--------------------------------------------------------------------------
// Vector translation.
// For chained interrupts we only have a single vector though which all
// are passed. For unchained interrupts we have a vector per interrupt.
 
#ifndef HAL_TRANSLATE_VECTOR
 
#if defined(CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN)
 
#define HAL_TRANSLATE_VECTOR(_vector_,_index_) (_index_) = 0
 
#else
 
#define HAL_TRANSLATE_VECTOR(_vector_,_index_) (_index_) = (_vector_)
 
#endif
 
#endif
 
//--------------------------------------------------------------------------
// Interrupt and VSR attachment macros
 
#define HAL_INTERRUPT_IN_USE( _vector_, _state_) \
CYG_MACRO_START \
cyg_uint32 _index_; \
HAL_TRANSLATE_VECTOR ((_vector_), _index_); \
\
if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)HAL_DEFAULT_ISR ) \
(_state_) = 0; \
else \
(_state_) = 1; \
CYG_MACRO_END
 
#define HAL_INTERRUPT_ATTACH( _vector_, _isr_, _data_, _object_ ) \
{ \
cyg_uint32 _index_; \
HAL_TRANSLATE_VECTOR( _vector_, _index_ ); \
\
if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)HAL_DEFAULT_ISR ) \
{ \
hal_interrupt_handlers[_index_] = (CYG_ADDRESS)_isr_; \
hal_interrupt_data[_index_] = (CYG_ADDRWORD)_data_; \
hal_interrupt_objects[_index_] = (CYG_ADDRESS)_object_; \
} \
}
 
#define HAL_INTERRUPT_DETACH( _vector_, _isr_ ) \
{ \
cyg_uint32 _index_; \
HAL_TRANSLATE_VECTOR( _vector_, _index_ ); \
\
if( hal_interrupt_handlers[_index_] == (CYG_ADDRESS)_isr_ ) \
{ \
hal_interrupt_handlers[_index_] = (CYG_ADDRESS)HAL_DEFAULT_ISR; \
hal_interrupt_data[_index_] = 0; \
hal_interrupt_objects[_index_] = 0; \
} \
}
 
#define HAL_VSR_GET( _vector_, _pvsr_ ) \
*(_pvsr_) = (void (*)())hal_vsr_table[_vector_];
 
#define HAL_VSR_SET( _vector_, _vsr_, _poldvsr_ ) CYG_MACRO_START \
if( (void*)_poldvsr_ != NULL) \
*(CYG_ADDRESS *)_poldvsr_ = (CYG_ADDRESS)hal_vsr_table[_vector_]; \
hal_vsr_table[_vector_] = (CYG_ADDRESS)_vsr_; \
CYG_MACRO_END
 
// This is an ugly name, but what it means is: grab the VSR back to eCos
// internal handling, or if you like, the default handler. But if
// cooperating with GDB and CygMon, the default behaviour is to pass most
// exceptions to CygMon. This macro undoes that so that eCos handles the
// exception. So use it with care.
 
externC void cyg_hal_default_exception_vsr(void);
externC void cyg_hal_default_interrupt_vsr(void);
 
#define HAL_VSR_SET_TO_ECOS_HANDLER( _vector_, _poldvsr_ ) CYG_MACRO_START \
HAL_VSR_SET( _vector_, _vector_ == CYGNUM_HAL_VECTOR_INTERRUPT \
? (CYG_ADDRESS)cyg_hal_default_interrupt_vsr \
: (CYG_ADDRESS)cyg_hal_default_exception_vsr, \
_poldvsr_ ); \
CYG_MACRO_END
 
//--------------------------------------------------------------------------
// Interrupt controller access
 
#ifndef CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED
#define CYGHWR_HAL_INTERRUPT_CONTROLLER_ACCESS_DEFINED
 
// Mask (disable) interrupts from specified source
#define HAL_INTERRUPT_MASK( _vector_ ) \
CYG_MACRO_START \
int mask; \
if ((_vector_) == CYGNUM_HAL_INTERRUPT_RTC) { \
/* The tick timer interrupt isn't */ \
/* controlled by the PIC; It has its own*/\
/* enable bit in the SR. */ \
MTSPR(SPR_SR, MFSPR(SPR_SR)& ~SPR_SR_TEE);\
} else { \
mask = ~(1 << (_vector_)); \
MTSPR(SPR_PICMR, MFSPR(SPR_PICMR)& mask); \
} \
CYG_MACRO_END
 
// Allow interrupts from specified source
#define HAL_INTERRUPT_UNMASK( _vector_ ) \
CYG_MACRO_START \
int bit; \
if ((_vector_) == CYGNUM_HAL_INTERRUPT_RTC) { \
/* The tick timer interrupt isn't */ \
/* controlled by the PIC; It has its own*/\
/* enable bit in the SR. */ \
MTSPR(SPR_SR, MFSPR(SPR_SR) | SPR_SR_TEE);\
} else { \
bit = (1 << (_vector_)); \
MTSPR(SPR_PICMR, MFSPR(SPR_PICMR) | bit); \
} \
CYG_MACRO_END
 
// Reset interrupt request in the PIC for specified device
#define HAL_INTERRUPT_ACKNOWLEDGE( _vector_ ) \
CYG_MACRO_START \
int mask; \
if ((_vector_) != CYGNUM_HAL_INTERRUPT_RTC) { \
mask = ~(1 << (_vector_)); \
MTSPR(SPR_PICSR, MFSPR(SPR_PICSR) & mask);\
} \
CYG_MACRO_END
 
#define HAL_INTERRUPT_CONFIGURE( _vector_, _level_, _up_ ) CYG_EMPTY_STATEMENT
 
#define HAL_INTERRUPT_SET_LEVEL( _vector_, _level_ ) CYG_EMPTY_STATEMENT
 
#endif
 
//--------------------------------------------------------------------------
// Clock control.
 
externC CYG_WORD32 cyg_hal_clock_period;
#define CYGHWR_HAL_CLOCK_PERIOD_DEFINED
 
// Start tick timer interrupts
#define HAL_CLOCK_INITIALIZE( _period_ ) \
CYG_MACRO_START \
{ \
int ttmr_new = _period_ | 0x60000000; \
MTSPR(SPR_TTMR, 0); \
MTSPR(SPR_TTCR, 0); \
MTSPR(SPR_TTMR, ttmr_new); \
cyg_hal_clock_period = _period_; \
} \
CYG_MACRO_END
 
// Acknowledge clock timer interrupt
#define HAL_CLOCK_RESET( _vector_, _period_ ) \
CYG_MACRO_START \
int ttmr_new = _period_ | 0x60000000; \
MTSPR(SPR_TTMR, ttmr_new); \
CYG_MACRO_END
 
// Read the current value of the tick timer
#define HAL_CLOCK_READ( _pvalue_ ) \
CYG_MACRO_START \
*(_pvalue_) = MFSPR(SPR_TTCR); \
CYG_MACRO_END
 
#if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY) && \
!defined(HAL_CLOCK_LATENCY)
#define HAL_CLOCK_LATENCY( _pvalue_ ) \
CYG_MACRO_START \
register CYG_WORD32 _cval_; \
HAL_CLOCK_READ(&_cval_); \
*(_pvalue_) = _cval_ - cyg_hal_clock_period; \
CYG_MACRO_END
#endif
 
 
//--------------------------------------------------------------------------
// Microsecond delay function provided in hal_misc.c
externC void hal_delay_us(int us);
 
#define HAL_DELAY_US(n) hal_delay_us(n)
 
#endif /* #ifndef __ASSEMBLER__ */
 
//--------------------------------------------------------------------------
#endif // ifndef CYGONCE_HAL_HAL_INTR_H
// End of hal_intr.h
/arch/current/include/hal_arch.h
0,0 → 1,369
//==========================================================================
//
// hal_arch.h
//
// Architecture specific abstractions
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors:
// Date: 2003-01-17
// Purpose: Define architecture abstractions
// Usage: #include <cyg/hal/hal_arch.h>
//
//####DESCRIPTIONEND####
//
//==========================================================================
 
#ifndef CYGONCE_HAL_HAL_ARCH_H
#define CYGONCE_HAL_HAL_ARCH_H
 
// Include macros to access special-purpose registers (SPRs)
#include <cyg/hal/spr_defs.h>
 
#define CYG_HAL_OPENRISC_REG_SIZE 4
 
#ifndef __ASSEMBLER__
#include <pkgconf/hal.h>
#include <cyg/infra/cyg_type.h>
 
//--------------------------------------------------------------------------
// Processor saved states:
// The layout of this structure is also defined in "arch.inc", for assembly
// code. Do not change this without changing that (or vice versa).
 
#define CYG_HAL_OPENRISC_REG CYG_WORD32
 
typedef struct
{
// These are common to all saved states
CYG_HAL_OPENRISC_REG r[32]; // GPR regs
CYG_HAL_OPENRISC_REG machi; // High and low words of
CYG_HAL_OPENRISC_REG maclo; // multiply/accumulate reg
// These are only saved for exceptions and interrupts
CYG_WORD32 vector; /* Vector number */
CYG_WORD32 sr; /* Status Reg */
CYG_HAL_OPENRISC_REG pc; /* Program Counter */
 
// Saved only for exceptions, and not restored when continued:
// Effective address of instruction/data access that caused exception
CYG_HAL_OPENRISC_REG eear; /* Exception effective address reg */
} HAL_SavedRegisters;
 
//--------------------------------------------------------------------------
// Utilities
 
// Move from architecture special register (SPR)
#define MFSPR(_spr_) \
({ CYG_HAL_OPENRISC_REG _result_; \
asm volatile ("l.mfspr %0, r0, %1;" \
: "=r"(_result_) \
: "K"(_spr_) \
); \
_result_;})
 
// Move data to architecture special registers (SPR)
#define MTSPR(_spr_, _val_) \
CYG_MACRO_START \
CYG_HAL_OPENRISC_REG val = _val_; \
asm volatile ("l.mtspr r0, %0, %1;" \
: \
: "r"(val), "K"(_spr_) \
); \
CYG_MACRO_END
 
//--------------------------------------------------------------------------
// Exception handling function.
// This function is defined by the kernel according to this prototype. It is
// invoked from the HAL to deal with any CPU exceptions that the HAL does
// not want to deal with itself. It usually invokes the kernel's exception
// delivery mechanism.
 
externC void cyg_hal_deliver_exception( CYG_WORD code, CYG_ADDRWORD data );
 
//--------------------------------------------------------------------------
// Bit manipulation macros
 
externC cyg_uint32 hal_lsbit_index(cyg_uint32 mask);
externC cyg_uint32 hal_msbit_index(cyg_uint32 mask);
 
#define HAL_LSBIT_INDEX(index, mask) index = hal_lsbit_index(mask);
 
// NOTE - Below can be optimized with l.ff1 instruction if that optional
// instruction is implemented in HW. OR12k does not implement
// it at this time, however.
#define HAL_MSBIT_INDEX(index, mask) index = hal_msbit_index(mask);
 
//--------------------------------------------------------------------------
// Context Initialization
 
 
// Initialize the context of a thread.
// Arguments:
// _sparg_ name of variable containing current sp, will be written with new sp
// _thread_ thread object address, passed as argument to entry point
// _entry_ entry point address.
// _id_ bit pattern used in initializing registers, for debugging.
#define HAL_THREAD_INIT_CONTEXT( _sparg_, _thread_, _entry_, _id_ ) \
{ \
int _i_; \
register CYG_WORD _sp_ = ((CYG_WORD)_sparg_); \
register HAL_SavedRegisters *_regs_; \
_regs_ = (HAL_SavedRegisters *)(((_sp_) - sizeof(HAL_SavedRegisters)) & ~(CYGARC_ALIGNMENT));\
_sp_ &= ~(CYGARC_ALIGNMENT); \
for( _i_ = 1; _i_ < 32; _i_++ ) (_regs_)->r[_i_] = (_id_)|_i_; \
(_regs_)->r[1] = (CYG_HAL_OPENRISC_REG)(_sp_); /* SP = top of stack */ \
(_regs_)->r[2] = (CYG_HAL_OPENRISC_REG)(_sp_); /* FP = top of stack */ \
(_regs_)->r[3] = (CYG_HAL_OPENRISC_REG)(_thread_); /* R3 = arg1 = thread ptr */ \
(_regs_)->maclo = 0; /* MACLO = 0 */ \
(_regs_)->machi = 0; /* MACHI = 0 */ \
(_regs_)->sr = (SPR_SR_TEE|SPR_SR_IEE); /* Interrupts enabled */ \
(_regs_)->pc = (CYG_HAL_OPENRISC_REG)(_entry_); /* PC = entry point */ \
(_regs_)->r[9] = (CYG_HAL_OPENRISC_REG)(_entry_); /* PC = entry point */ \
_sparg_ = (CYG_ADDRESS)_regs_; \
}
 
//--------------------------------------------------------------------------
// Context switch macros.
 
// The arguments to these macros are *pointers* to locations where the
// stack pointer of the thread is to be stored/retrieved, i.e. *not*
// the value of the stack pointer itself.
 
externC void hal_thread_switch_context( CYG_ADDRESS to, CYG_ADDRESS from );
externC void hal_thread_load_context( CYG_ADDRESS to )
__attribute__ ((noreturn));
 
#define HAL_THREAD_SWITCH_CONTEXT(_fspptr_,_tspptr_) \
hal_thread_switch_context( (CYG_ADDRESS)_tspptr_, \
(CYG_ADDRESS)_fspptr_);
 
#define HAL_THREAD_LOAD_CONTEXT(_tspptr_) \
hal_thread_load_context( (CYG_ADDRESS)_tspptr_ );
 
// Translate a stack pointer as saved by the thread context macros above into
// a pointer to a HAL_SavedRegisters structure.
#define HAL_THREAD_GET_SAVED_REGISTERS( _sp_, _regs_ ) \
(_regs_) = (HAL_SavedRegisters *)(_sp_)
 
//--------------------------------------------------------------------------
// Execution reorder barrier.
// When optimizing the compiler can reorder code. In multithreaded systems
// where the order of actions is vital, this can sometimes cause problems.
// This macro may be inserted into places where reordering should not happen.
// The "memory" keyword is potentially unnecessary, but it is harmless to
// keep it.
 
#define HAL_REORDER_BARRIER() asm volatile ( "" : : : "memory" )
 
//--------------------------------------------------------------------------
// Breakpoint support
// HAL_BREAKPOINT() is a code sequence that will cause a breakpoint to
// occur if executed.
// HAL_BREAKINST is the value of the breakpoint instruction and...
// HAL_BREAKINST_SIZE is its size in bytes and...
// HAL_BREAKINST_TYPE is its type.
 
#define HAL_BREAKPOINT(_label_) \
asm volatile (" .globl _" #_label_ ";" \
"_" #_label_ ":" \
" l.trap 1;" \
);
 
#define HAL_BREAKINST (0x21000001) // l.trap 1 instruction
 
#define HAL_BREAKINST_SIZE 4
 
#define HAL_BREAKINST_TYPE cyg_uint32
 
//--------------------------------------------------------------------------
// Thread register state manipulation for GDB support.
 
// Default to a 32 bit register size for GDB register dumps.
#ifndef CYG_HAL_GDB_REG
#define CYG_HAL_GDB_REG CYG_WORD32
#endif
 
// Register layout expected by GDB
typedef struct
{
CYG_HAL_OPENRISC_REG r[32]; // GPR regs
CYG_HAL_OPENRISC_REG pc; // Program Counter
CYG_HAL_OPENRISC_REG sr; // Supervisor/Status Reg
} GDB_Registers;
 
// Copy a set of registers from a HAL_SavedRegisters structure into a
// GDB_Registers structure.
#define HAL_GET_GDB_REGISTERS( _aregval_, _regs_ ) \
CYG_MACRO_START \
GDB_Registers *_gdb_ = (GDB_Registers *)(_aregval_); \
int _i_; \
\
for( _i_ = 0; _i_ < 32; _i_++ ) { \
_gdb_->r[_i_] = (_regs_)->r[_i_]; \
} \
\
_gdb_->pc = (_regs_)->pc; \
_gdb_->sr = (_regs_)->sr; \
CYG_MACRO_END
 
// Copy a set of registers from a GDB_Registers structure into a
// HAL_SavedRegisters structure.
#define HAL_SET_GDB_REGISTERS( _regs_ , _aregval_ ) \
CYG_MACRO_START \
GDB_Registers *_gdb_ = (GDB_Registers *)(_aregval_); \
int _i_; \
\
for( _i_ = 0; _i_ < 32; _i_++ ) \
(_regs_)->r[_i_] = _gdb_->r[_i_]; \
\
(_regs_)->pc = _gdb_->pc; \
(_regs_)->sr = _gdb_->sr; \
CYG_MACRO_END
 
//--------------------------------------------------------------------------
// HAL setjmp
// Note: These definitions are repeated in context.S. If changes are
// required remember to update both sets.
 
#define CYGARC_JMP_BUF_R1 0
#define CYGARC_JMP_BUF_R2 1
#define CYGARC_JMP_BUF_R9 2
#define CYGARC_JMP_BUF_R10 3
#define CYGARC_JMP_BUF_R12 4
#define CYGARC_JMP_BUF_R14 5
#define CYGARC_JMP_BUF_R16 6
#define CYGARC_JMP_BUF_R18 7
#define CYGARC_JMP_BUF_R20 8
#define CYGARC_JMP_BUF_R22 9
#define CYGARC_JMP_BUF_R24 10
#define CYGARC_JMP_BUF_R26 11
#define CYGARC_JMP_BUF_R28 12
#define CYGARC_JMP_BUF_R30 13
 
#define CYGARC_JMP_BUF_SIZE 14
 
typedef CYG_HAL_OPENRISC_REG hal_jmp_buf[CYGARC_JMP_BUF_SIZE];
 
externC int hal_setjmp(hal_jmp_buf env);
externC void hal_longjmp(hal_jmp_buf env, int val);
 
//-------------------------------------------------------------------------
// Idle thread code.
// This macro is called in the idle thread loop, and gives the HAL the
// chance to run code when no threads are runnable. Typical idle
// thread behaviour might be to halt the processor.
 
externC void hal_idle_thread_action(cyg_uint32 loop_count);
 
#define HAL_IDLE_THREAD_ACTION(_count_) hal_idle_thread_action(_count_)
 
//--------------------------------------------------------------------------
// Minimal and sensible stack sizes: the intention is that applications
// will use these to provide a stack size in the first instance prior to
// proper analysis. Idle thread stack should be this big.
 
// *** THESE ARE NOT INTENDED TO BE GUARANTEED SUFFICIENT STACK SIZES ***
// They are, however, enough to start programming.
// You might, for example, need to make your stacks larger if you have
// large "auto" variables.
 
// This is not a config option because it should not be adjusted except
// under "enough rope to hang yourself" sort of disclaimers.
 
// Typical case stack frame size: return link + 10 caller-saved temporaries + 4 locals.
#define CYGNUM_HAL_STACK_FRAME_SIZE (15 * CYG_HAL_OPENRISC_REG_SIZE)
 
// Stack needed for a context switch:
#define CYGNUM_HAL_STACK_CONTEXT_SIZE (38 * 4) // sizeof(HAL_SavedRegisters)
 
// Interrupt + call to ISR, interrupt_end() and the DSR
#define CYGNUM_HAL_STACK_INTERRUPT_SIZE (CYGNUM_HAL_STACK_CONTEXT_SIZE + 2*CYGNUM_HAL_STACK_FRAME_SIZE)
 
// We define a minimum stack size as the minimum any thread could ever
// legitimately get away with. We can throw asserts if users ask for less
// than this. Allow enough for three interrupt sources - clock, serial and
// one other
 
// If interrupts are segregated onto their own stack...
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
 
// An interrupt stack which is large enough for all possible interrupt
// conditions (and only used for that purpose) exists. "User" stacks
// can therefore be much smaller
// NOTE - interrupt stack sizes can be smaller if we don't allow interrupts
// to nest.
 
# define CYGNUM_HAL_STACK_SIZE_MINIMUM \
((3 * 5)*CYGNUM_HAL_STACK_FRAME_SIZE + 2*CYGNUM_HAL_STACK_INTERRUPT_SIZE)
 
#else
 
// No separate interrupt stack exists. Make sure all threads contain
// a stack sufficiently large
# define CYGNUM_HAL_STACK_SIZE_MINIMUM \
(( 3*CYGNUM_HAL_STACK_INTERRUPT_SIZE) + \
(25*CYGNUM_HAL_STACK_FRAME_SIZE))
#endif
 
// Now make a reasonable choice for a typical thread size. Pluck figures
// from thin air and say 40 call frames
#define CYGNUM_HAL_STACK_SIZE_TYPICAL \
(CYGNUM_HAL_STACK_SIZE_MINIMUM + \
40 * (CYGNUM_HAL_STACK_FRAME_SIZE))
 
#endif /* __ASSEMBLER__ */
 
//--------------------------------------------------------------------------
// Macros for switching context between two eCos instances (jump from
// code in ROM to code in RAM or vice versa).
// These are NOP's in the case of OpenRISC.
#define CYGARC_HAL_SAVE_GP()
#define CYGARC_HAL_RESTORE_GP()
 
//--------------------------------------------------------------------------
// Macro for finding return address of current function
#define CYGARC_HAL_GET_RETURN_ADDRESS(_x_, _dummy_) \
asm volatile ( "l.ori %0,r9,0;" : "=r" (_x_) )
 
#define CYGARC_HAL_GET_RETURN_ADDRESS_BACKUP(_dummy_)
 
//--------------------------------------------------------------------------
#endif // CYGONCE_HAL_HAL_ARCH_H
// End of hal_arch.h
/arch/current/include/openrisc.inc
0,0 → 1,59
# ====================================================================
#
# openrisc.inc
#
# OpenRISC architectural definitions for assembly code
#
# ====================================================================
#####ECOSGPLCOPYRIGHTBEGIN####
## -------------------------------------------
## This file is part of eCos, the Embedded Configurable Operating System.
## Copyright (C) 2003 Red Hat, Inc.
##
## eCos is free software; you can redistribute it and/or modify it under
## the terms of the GNU General Public License as published by the Free
## Software Foundation; either version 2 or (at your option) any later version.
##
## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
## WARRANTY; without even the implied warranty of MERCHANTABILITY or
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
## for more details.
##
## You should have received a copy of the GNU General Public License along
## with eCos; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
##
## As a special exception, if other files instantiate templates or use macros
## or inline functions from this file, or you compile this file and link it
## with other works to produce a work based on this file, this file does not
## by itself cause the resulting work to be covered by the GNU General Public
## License. However the source code for this file must still be made available
## in accordance with section (3) of the GNU General Public License.
##
## This exception does not invalidate any other reasons why a work based on
## this file might be covered by the GNU General Public License.
##
## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
## at http://sources.redhat.com/ecos/ecos-license/
## -------------------------------------------
#####ECOSGPLCOPYRIGHTEND####
# ====================================================================
######DESCRIPTIONBEGIN####
#
# Author(s): sfurman
# Original data:
# Contributors:
# Date: 2003-02-28
#
#####DESCRIPTIONEND####
#
# ====================================================================
 
 
#ifndef _OPENRISC_INC_
#define _OPENRISC_INC_
 
/* Definition of special-purpose registers (SPRs) */
#include <cyg/hal/spr_defs.h>
 
#endif /* ifdef _OPENRISC_INC_ */
/arch/current/include/spr_defs.h
0,0 → 1,464
//==========================================================================
//
// spr_defs.h
//
// Defines OR1K architecture specific special-purpose registers (SPRs)
//
//==========================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//==========================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): sfurman
// Contributors: Damjan Lambert
// Date: 2003-01-17
// Purpose: Define OpenRISC architecture special-purpose registers
// Usage: #include <cyg/hal/hal_arch.h>
//
//####DESCRIPTIONEND####
//
//==========================================================================
 
/* Definition of special-purpose registers (SPRs) */
 
#ifndef _ASM_SPR_DEFS_H
#define _ASM_SPR_DEFS_H
 
#define MAX_GRPS (32)
#define MAX_SPRS_PER_GRP_BITS (11)
#define MAX_SPRS_PER_GRP (1 << MAX_SPRS_PER_GRP_BITS)
#define MAX_SPRS (0x10000)
/* Base addresses for the groups */
#define SPRGROUP_SYS (0<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_DMMU (1<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_IMMU (2<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_DC (3<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_IC (4<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_MAC (5<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_D (6<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_PC (7<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_PM (8<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_PIC (9<< MAX_SPRS_PER_GRP_BITS)
#define SPRGROUP_TT (10<< MAX_SPRS_PER_GRP_BITS)
 
/* System control and status group */
#define SPR_VR (SPRGROUP_SYS + 0)
#define SPR_UPR (SPRGROUP_SYS + 1)
#define SPR_PC (SPRGROUP_SYS + 16) /* CZ 21/06/01 */
#define SPR_SR (SPRGROUP_SYS + 17) /* CZ 21/06/01 */
#define SPR_EPCR_BASE (SPRGROUP_SYS + 32) /* CZ 21/06/01 */
#define SPR_EPCR_LAST (SPRGROUP_SYS + 47) /* CZ 21/06/01 */
#define SPR_EEAR_BASE (SPRGROUP_SYS + 48)
#define SPR_EEAR_LAST (SPRGROUP_SYS + 63)
#define SPR_ESR_BASE (SPRGROUP_SYS + 64)
#define SPR_ESR_LAST (SPRGROUP_SYS + 79)
 
#if 0
/* Data MMU group */
#define SPR_DMMUCR (SPRGROUP_DMMU + 0)
#define SPR_DTLBMR_BASE(WAY) (SPRGROUP_DMMU + 0x200 + (WAY) * 0x200)
#define SPR_DTLBMR_LAST(WAY) (SPRGROUP_DMMU + 0x2ff + (WAY) * 0x200)
#define SPR_DTLBTR_BASE(WAY) (SPRGROUP_DMMU + 0x300 + (WAY) * 0x200)
#define SPR_DTLBTR_LAST(WAY) (SPRGROUP_DMMU + 0x3ff + (WAY) * 0x200)
 
/* Instruction MMU group */
#define SPR_IMMUCR (SPRGROUP_IMMU + 0)
#define SPR_ITLBMR_BASE(WAY) (SPRGROUP_IMMU + 0x200 + (WAY) * 0x200)
#define SPR_ITLBMR_LAST(WAY) (SPRGROUP_IMMU + 0x2ff + (WAY) * 0x200)
#define SPR_ITLBTR_BASE(WAY) (SPRGROUP_IMMU + 0x300 + (WAY) * 0x200)
#define SPR_ITLBTR_LAST(WAY) (SPRGROUP_IMMU + 0x3ff + (WAY) * 0x200)
#else
/* Data MMU group */
#define SPR_DMMUCR (SPRGROUP_DMMU + 0)
#define SPR_DTLBMR_BASE(WAY) (SPRGROUP_DMMU + 0x200 + (WAY) * 0x100)
#define SPR_DTLBMR_LAST(WAY) (SPRGROUP_DMMU + 0x27f + (WAY) * 0x100)
#define SPR_DTLBTR_BASE(WAY) (SPRGROUP_DMMU + 0x280 + (WAY) * 0x100)
#define SPR_DTLBTR_LAST(WAY) (SPRGROUP_DMMU + 0x2ff + (WAY) * 0x100)
 
/* Instruction MMU group */
#define SPR_IMMUCR (SPRGROUP_IMMU + 0)
#define SPR_ITLBMR_BASE(WAY) (SPRGROUP_IMMU + 0x200 + (WAY) * 0x100)
#define SPR_ITLBMR_LAST(WAY) (SPRGROUP_IMMU + 0x27f + (WAY) * 0x100)
#define SPR_ITLBTR_BASE(WAY) (SPRGROUP_IMMU + 0x280 + (WAY) * 0x100)
#define SPR_ITLBTR_LAST(WAY) (SPRGROUP_IMMU + 0x2ff + (WAY) * 0x100)
#endif
 
/* Data cache group */
#define SPR_DCCR (SPRGROUP_DC + 0)
#define SPR_DCBPR (SPRGROUP_DC + 1)
#define SPR_DCBFR (SPRGROUP_DC + 2)
#define SPR_DCBIR (SPRGROUP_DC + 3)
#define SPR_DCBWR (SPRGROUP_DC + 4)
#define SPR_DCBLR (SPRGROUP_DC + 5)
#define SPR_DCR_BASE(WAY) (SPRGROUP_DC + 0x200 + (WAY) * 0x200)
#define SPR_DCR_LAST(WAY) (SPRGROUP_DC + 0x3ff + (WAY) * 0x200)
 
/* Instruction cache group */
#define SPR_ICCR (SPRGROUP_IC + 0)
#define SPR_ICBPR (SPRGROUP_IC + 1)
#define SPR_ICBIR (SPRGROUP_IC + 2)
#define SPR_ICBLR (SPRGROUP_IC + 3)
#define SPR_ICR_BASE(WAY) (SPRGROUP_IC + 0x200 + (WAY) * 0x200)
#define SPR_ICR_LAST(WAY) (SPRGROUP_IC + 0x3ff + (WAY) * 0x200)
 
/* MAC group */
#define SPR_MACLO (SPRGROUP_MAC + 1)
#define SPR_MACHI (SPRGROUP_MAC + 2)
 
/* Debug group */
#define SPR_DVR(N) (SPRGROUP_D + (N))
#define SPR_DCR(N) (SPRGROUP_D + 8 + (N))
#define SPR_DMR1 (SPRGROUP_D + 16)
#define SPR_DMR2 (SPRGROUP_D + 17)
#define SPR_DWCR0 (SPRGROUP_D + 18)
#define SPR_DWCR1 (SPRGROUP_D + 19)
#define SPR_DSR (SPRGROUP_D + 20)
#define SPR_DRR (SPRGROUP_D + 21)
#define SPR_DIR (SPRGROUP_D + 22)
 
/* Performance counters group */
#define SPR_PCCR(N) (SPRGROUP_PC + (N))
#define SPR_PCMR(N) (SPRGROUP_PC + 8 + (N))
 
/* Power management group */
#define SPR_PMR (SPRGROUP_PM + 0)
 
/* PIC group */
#define SPR_PICMR (SPRGROUP_PIC + 0)
#define SPR_PICPR (SPRGROUP_PIC + 1)
#define SPR_PICSR (SPRGROUP_PIC + 2)
 
/* Tick Timer group */
#define SPR_TTMR (SPRGROUP_TT + 0)
#define SPR_TTCR (SPRGROUP_TT + 1)
 
/*
* Bit definitions for the Version Register
*
*/
#define SPR_VR_VER 0xffff0000 /* Processor version */
#define SPR_VR_REV 0x0000003f /* Processor revision */
 
/*
* Bit definitions for the Unit Present Register
*
*/
#define SPR_UPR_UP 0x00000001 /* UPR present */
#define SPR_UPR_DCP 0x00000002 /* Data cache present */
#define SPR_UPR_ICP 0x00000004 /* Instruction cache present */
#define SPR_UPR_DMP 0x00000008 /* Data MMU present */
#define SPR_UPR_IMP 0x00000010 /* Instruction MMU present */
#define SPR_UPR_OB32P 0x00000020 /* ORBIS32 present */
#define SPR_UPR_OB64P 0x00000040 /* ORBIS64 present */
#define SPR_UPR_OF32P 0x00000080 /* ORFPX32 present */
#define SPR_UPR_OF64P 0x00000100 /* ORFPX64 present */
#define SPR_UPR_OV32P 0x00000200 /* ORVDX32 present */
#define SPR_UPR_OV64P 0x00000400 /* ORVDX64 present */
#define SPR_UPR_DUP 0x00000800 /* Debug unit present */
#define SPR_UPR_PCUP 0x00001000 /* Performance counters unit present */
#define SPR_UPR_PMP 0x00002000 /* Power management present */
#define SPR_UPR_PICP 0x00004000 /* PIC present */
#define SPR_UPR_TTP 0x00008000 /* Tick timer present */
#define SPR_UPR_SRP 0x00010000 /* Shadow registers present */
#define SPR_UPR_RES 0x00fe0000 /* ORVDX32 present */
#define SPR_UPR_CUST 0xff000000 /* Custom units */
 
/*
* Bit definitions for the Supervision Register
*
*/
#define SPR_SR_CID 0xf0000000 /* Context ID */
#define SPR_SR_FO 0x00008000 /* Fixed one */
#define SPR_SR_EPH 0x00004000 /* Exception Prefixi High */
#define SPR_SR_DSX 0x00002000 /* Delay Slot Exception */
#define SPR_SR_OVE 0x00001000 /* Overflow flag Exception */
#define SPR_SR_OV 0x00000800 /* Overflow flag */
#define SPR_SR_CY 0x00000400 /* Carry flag */
#define SPR_SR_F 0x00000200 /* Condition Flag */
#define SPR_SR_CE 0x00000100 /* CID Enable */
#define SPR_SR_LEE 0x00000080 /* Little Endian Enable */
#define SPR_SR_IME 0x00000040 /* Instruction MMU Enable */
#define SPR_SR_DME 0x00000020 /* Data MMU Enable */
#define SPR_SR_ICE 0x00000010 /* Instruction Cache Enable */
#define SPR_SR_DCE 0x00000008 /* Data Cache Enable */
#define SPR_SR_IEE 0x00000004 /* Interrupt Exception Enable */
#define SPR_SR_TEE 0x00000002 /* Tick timer Exception Enable */
#define SPR_SR_SM 0x00000001 /* Supervisor Mode */
#define SPR_SR_FO_BIT 15
#define SPR_SR_EPH_BIT 14
#define SPR_SR_DSX_BIT 13
#define SPR_SR_OVE_BIT 12
#define SPR_SR_OV_BIT 11
#define SPR_SR_CY_BIT 10
#define SPR_SR_F_BIT 9
#define SPR_SR_CE_BIT 8
#define SPR_SR_LEE_BIT 7
#define SPR_SR_IME_BIT 6
#define SPR_SR_DME_BIT 5
#define SPR_SR_ICE_BIT 4
#define SPR_SR_DCE_BIT 3
#define SPR_SR_IEE_BIT 2
#define SPR_SR_TEE_BIT 1
#define SPR_SR_SM_BIT 0
 
 
/*
* Bit definitions for the Data MMU Control Register
*
*/
#define SPR_DMMUCR_P2S 0x0000003e /* Level 2 Page Size */
#define SPR_DMMUCR_P1S 0x000007c0 /* Level 1 Page Size */
#define SPR_DMMUCR_VADDR_WIDTH 0x0000f800 /* Virtual ADDR Width */
#define SPR_DMMUCR_PADDR_WIDTH 0x000f0000 /* Physical ADDR Width */
 
/*
* Bit definitions for the Instruction MMU Control Register
*
*/
#define SPR_IMMUCR_P2S 0x0000003e /* Level 2 Page Size */
#define SPR_IMMUCR_P1S 0x000007c0 /* Level 1 Page Size */
#define SPR_IMMUCR_VADDR_WIDTH 0x0000f800 /* Virtual ADDR Width */
#define SPR_IMMUCR_PADDR_WIDTH 0x000f0000 /* Physical ADDR Width */
 
/*
* Bit definitions for the Data TLB Match Register
*
*/
#define SPR_DTLBMR_V 0x00000001 /* Valid */
#define SPR_DTLBMR_PL1 0x00000002 /* Page Level 1 (if 0 then PL2) */
#define SPR_DTLBMR_CID 0x0000003c /* Context ID */
#define SPR_DTLBMR_LRU 0x000000c0 /* Least Recently Used */
#define SPR_DTLBMR_VPN 0xfffff000 /* Virtual Page Number */
 
/*
* Bit definitions for the Data TLB Translate Register
*
*/
#define SPR_DTLBTR_CC 0x00000001 /* Cache Coherency */
#define SPR_DTLBTR_CI 0x00000002 /* Cache Inhibit */
#define SPR_DTLBTR_WBC 0x00000004 /* Write-Back Cache */
#define SPR_DTLBTR_WOM 0x00000008 /* Weakly-Ordered Memory */
#define SPR_DTLBTR_A 0x00000010 /* Accessed */
#define SPR_DTLBTR_D 0x00000020 /* Dirty */
#define SPR_DTLBTR_URE 0x00000040 /* User Read Enable */
#define SPR_DTLBTR_UWE 0x00000080 /* User Write Enable */
#define SPR_DTLBTR_SRE 0x00000100 /* Supervisor Read Enable */
#define SPR_DTLBTR_SWE 0x00000200 /* Supervisor Write Enable */
#define SPR_DTLBTR_PPN 0xfffff000 /* Physical Page Number */
#define DTLBTR_NO_LIMIT ( SPR_DTLBTR_URE | \
SPR_DTLBTR_UWE | \
SPR_DTLBTR_SRE | \
SPR_DTLBTR_SWE )
 
/*
* Bit definitions for the Instruction TLB Match Register
*
*/
#define SPR_ITLBMR_V 0x00000001 /* Valid */
#define SPR_ITLBMR_PL1 0x00000002 /* Page Level 1 (if 0 then PL2) */
#define SPR_ITLBMR_CID 0x0000003c /* Context ID */
#define SPR_ITLBMR_LRU 0x000000c0 /* Least Recently Used */
#define SPR_ITLBMR_VPN 0xfffff000 /* Virtual Page Number */
 
/*
* Bit definitions for the Instruction TLB Translate Register
*
*/
#define SPR_ITLBTR_CC 0x00000001 /* Cache Coherency */
#define SPR_ITLBTR_CI 0x00000002 /* Cache Inhibit */
#define SPR_ITLBTR_WBC 0x00000004 /* Write-Back Cache */
#define SPR_ITLBTR_WOM 0x00000008 /* Weakly-Ordered Memory */
#define SPR_ITLBTR_A 0x00000010 /* Accessed */
#define SPR_ITLBTR_D 0x00000020 /* Dirty */
#define SPR_ITLBTR_SXE 0x00000040 /* User Read Enable */
#define SPR_ITLBTR_UXE 0x00000080 /* User Write Enable */
#define SPR_ITLBTR_PPN 0xfffff000 /* Physical Page Number */
#define ITLBTR_NO_LIMIT (SPR_ITLBTR_SXE | SPR_ITLBTR_UXE)
 
/*
* Bit definitions for Data Cache Control register
*
*/
#define SPR_DCCR_EW 0x000000ff /* Enable ways */
 
/*
* Bit definitions for Insn Cache Control register
*
*/
#define SPR_ICCR_EW 0x000000ff /* Enable ways */
 
/*
* Bit definitions for Debug Control registers
*
*/
#define SPR_DCR_DP 0x00000001 /* DVR/DCR present */
#define SPR_DCR_CC 0x0000000e /* Compare condition */
#define SPR_DCR_SC 0x00000010 /* Signed compare */
#define SPR_DCR_CT 0x000000e0 /* Compare to */
 
/*
* Bit definitions for Debug Mode 1 register
*
*/
#define SPR_DMR1_CW0 0x00000003 /* Chain watchpoint 0 */
#define SPR_DMR1_CW1 0x0000000c /* Chain watchpoint 1 */
#define SPR_DMR1_CW2 0x00000030 /* Chain watchpoint 2 */
#define SPR_DMR1_CW3 0x000000c0 /* Chain watchpoint 3 */
#define SPR_DMR1_CW4 0x00000300 /* Chain watchpoint 4 */
#define SPR_DMR1_CW5 0x00000c00 /* Chain watchpoint 5 */
#define SPR_DMR1_CW6 0x00003000 /* Chain watchpoint 6 */
#define SPR_DMR1_CW7 0x0000c000 /* Chain watchpoint 7 */
#define SPR_DMR1_CW8 0x00030000 /* Chain watchpoint 8 */
#define SPR_DMR1_CW9 0x000c0000 /* Chain watchpoint 9 */
#define SPR_DMR1_CW10 0x00300000 /* Chain watchpoint 10 */
#define SPR_DMR1_ST 0x00400000 /* Single-step trace*/
#define SPR_DMR1_BT 0x00800000 /* Branch trace */
#define SPR_DMR1_DXFW 0x01000000 /* Disable external force watchpoint */
 
/*
* Bit definitions for Debug Mode 2 register
*
*/
#define SPR_DMR2_WCE0 0x00000001 /* Watchpoint counter 0 enable */
#define SPR_DMR2_WCE1 0x00000002 /* Watchpoint counter 0 enable */
#define SPR_DMR2_AWTC 0x00001ffc /* Assign watchpoints to counters */
#define SPR_DMR2_WGB 0x00ffe000 /* Watchpoints generating breakpoint */
 
/*
* Bit definitions for Debug watchpoint counter registers
*
*/
#define SPR_DWCR_COUNT 0x0000ffff /* Count */
#define SPR_DWCR_MATCH 0xffff0000 /* Match */
 
/*
* Bit definitions for Debug stop register
*
*/
#define SPR_DSR_RSTE 0x00000001 /* Reset exception */
#define SPR_DSR_BUSEE 0x00000002 /* Bus error exception */
#define SPR_DSR_DPFE 0x00000004 /* Data Page Fault exception */
#define SPR_DSR_IPFE 0x00000008 /* Insn Page Fault exception */
#define SPR_DSR_LPINTE 0x00000010 /* Low priority interrupt exception */
#define SPR_DSR_AE 0x00000020 /* Alignment exception */
#define SPR_DSR_IIE 0x00000040 /* Illegal Instruction exception */
#define SPR_DSR_HPINTE 0x00000080 /* High priority interrupt exception */
#define SPR_DSR_DME 0x00000100 /* DTLB miss exception */
#define SPR_DSR_IME 0x00000200 /* ITLB miss exception */
#define SPR_DSR_RE 0x00000400 /* Range exception */
#define SPR_DSR_SCE 0x00000800 /* System call exception */
#define SPR_DSR_BE 0x00001000 /* Breakpoint exception */
 
/*
* Bit definitions for Debug reason register
*
*/
#define SPR_DRR_RSTE 0x00000001 /* Reset exception */
#define SPR_DRR_BUSEE 0x00000002 /* Bus error exception */
#define SPR_DRR_DPFE 0x00000004 /* Data Page Fault exception */
#define SPR_DRR_IPFE 0x00000008 /* Insn Page Fault exception */
#define SPR_DRR_LPINTE 0x00000010 /* Low priority interrupt exception */
#define SPR_DRR_AE 0x00000020 /* Alignment exception */
#define SPR_DRR_IIE 0x00000040 /* Illegal Instruction exception */
#define SPR_DRR_HPINTE 0x00000080 /* High priority interrupt exception */
#define SPR_DRR_DME 0x00000100 /* DTLB miss exception */
#define SPR_DRR_IME 0x00000200 /* ITLB miss exception */
#define SPR_DRR_RE 0x00000400 /* Range exception */
#define SPR_DRR_SCE 0x00000800 /* System call exception */
#define SPR_DRR_BE 0x00001000 /* Breakpoint exception */
 
/*
* Bit definitions for Performance counters mode registers
*
*/
#define SPR_PCMR_CP 0x00000001 /* Counter present */
#define SPR_PCMR_UMRA 0x00000002 /* User mode read access */
#define SPR_PCMR_CISM 0x00000004 /* Count in supervisor mode */
#define SPR_PCMR_CIUM 0x00000008 /* Count in user mode */
#define SPR_PCMR_LA 0x00000010 /* Load access event */
#define SPR_PCMR_SA 0x00000020 /* Store access event */
#define SPR_PCMR_IF 0x00000040 /* Instruction fetch event*/
#define SPR_PCMR_DCM 0x00000080 /* Data cache miss event */
#define SPR_PCMR_ICM 0x00000100 /* Insn cache miss event */
#define SPR_PCMR_IFS 0x00000200 /* Insn fetch stall event */
#define SPR_PCMR_LSUS 0x00000400 /* LSU stall event */
#define SPR_PCMR_BS 0x00000800 /* Branch stall event */
#define SPR_PCMR_DTLBM 0x00001000 /* DTLB miss event */
#define SPR_PCMR_ITLBM 0x00002000 /* ITLB miss event */
#define SPR_PCMR_DDS 0x00004000 /* Data dependency stall event */
#define SPR_PCMR_WPE 0x03ff8000 /* Watchpoint events */
 
/*
* Bit definitions for the Power management register
*
*/
#define SPR_PMR_SDF 0x00000001 /* Slow down factor */
#define SPR_PMR_DME 0x00000002 /* Doze mode enable */
#define SPR_PMR_SME 0x00000004 /* Sleep mode enable */
#define SPR_PMR_DCGE 0x00000008 /* Dynamic clock gating enable */
#define SPR_PMR_SUME 0x00000010 /* Suspend mode enable */
 
/*
* Bit definitions for PICMR
*
*/
#define SPR_PICMR_IUM 0xfffffffc /* Interrupt unmask */
 
/*
* Bit definitions for PICPR
*
*/
#define SPR_PICPR_IPRIO 0xfffffffc /* Interrupt priority */
 
/*
* Bit definitions for PICSR
*
*/
#define SPR_PICSR_IS 0xffffffff /* Interrupt status */
 
/*
* Bit definitions for Tick Timer Control Register
*
*/
#define SPR_TTCR_PERIOD 0x0fffffff /* Time Period */
#define SPR_TTMR_PERIOD SPR_TTCR_PERIOD
#define SPR_TTMR_IP 0x10000000 /* Interrupt Pending */
#define SPR_TTMR_IE 0x20000000 /* Interrupt Enable */
#define SPR_TTMR_RT 0x40000000 /* Restart tick */
#define SPR_TTMR_SR 0x80000000 /* Single run */
#define SPR_TTMR_CR 0xc0000000 /* Continuous run */
#define SPR_TTMR_M 0xc0000000 /* Tick mode */
 
#endif
/arch/current/include/hal_cache.h
0,0 → 1,242
#ifndef CYGONCE_HAL_CACHE_H
#define CYGONCE_HAL_CACHE_H
 
//=============================================================================
//
// hal_cache.h
//
// HAL cache control API
//
//=============================================================================
//####ECOSGPLCOPYRIGHTBEGIN####
// -------------------------------------------
// This file is part of eCos, the Embedded Configurable Operating System.
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
//
// eCos is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free
// Software Foundation; either version 2 or (at your option) any later version.
//
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
// for more details.
//
// You should have received a copy of the GNU General Public License along
// with eCos; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
//
// As a special exception, if other files instantiate templates or use macros
// or inline functions from this file, or you compile this file and link it
// with other works to produce a work based on this file, this file does not
// by itself cause the resulting work to be covered by the GNU General Public
// License. However the source code for this file must still be made available
// in accordance with section (3) of the GNU General Public License.
//
// This exception does not invalidate any other reasons why a work based on
// this file might be covered by the GNU General Public License.
//
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
// at http://sources.redhat.com/ecos/ecos-license/
// -------------------------------------------
//####ECOSGPLCOPYRIGHTEND####
//=============================================================================
//#####DESCRIPTIONBEGIN####
//
// Author(s): Scott Furman
// Contributors:
// Date: 2003-02-08
// Purpose: Cache control API
// Description: The macros defined here provide the HAL APIs for handling
// cache control operations.
// Usage:
// #include <cyg/hal/hal_cache.h>
// ...
//
//
//####DESCRIPTIONEND####
//
//=============================================================================
 
//-----------------------------------------------------------------------------
// Cache dimensions.
// These really should be defined in var_cache.h. If they are not, then provide
// a set of numbers that are typical of many variants.
 
#ifndef HAL_DCACHE_SIZE
 
// Data cache
#define HAL_DCACHE_SIZE 4096 // Size of data cache in bytes
#define HAL_DCACHE_LINE_SIZE 16 // Bytes in a data cache line
#define HAL_DCACHE_WAYS 1 // Associativity of the cache
 
// Instruction cache
#define HAL_ICACHE_SIZE 4096 // Size of cache in bytes
#define HAL_ICACHE_LINE_SIZE 16 // Bytes in a cache line
#define HAL_ICACHE_WAYS 1 // Associativity of the cache
 
#define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
#define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
 
#endif
 
#ifndef __ASSEMBLER__
 
//-----------------------------------------------------------------------------
// Global control of data cache
 
// Enable the data cache
#define HAL_DCACHE_ENABLE() MTSPR(SPR_SR, MFSPR(SPR_SR) | SPR_SR_DCE)
 
// Disable the data cache
#define HAL_DCACHE_DISABLE() MTSPR(SPR_SR, MFSPR(SPR_SR) & ~SPR_SR_DCE)
 
// Enable or disable the data cache, depending on argument, which is required
// to be 0 or 1.
#define HAL_SET_DCACHE_ENABLED(enable) \
MTSPR(SPR_SR, MFSPR(SPR_SR) | (SPR_SR_DCE & -(enable)))
 
// Invalidate the entire data cache
#define HAL_DCACHE_INVALIDATE_ALL() \
CYG_MACRO_START \
int cache_enabled, addr; \
\
/* Save current cache mode (disabled/enabled) */ \
HAL_DCACHE_IS_ENABLED(cache_enabled); \
\
/* Disable cache, so that invalidation ignores cache tags */\
HAL_DCACHE_DISABLE(); \
addr = HAL_DCACHE_SIZE; \
do { \
MTSPR(SPR_DCBIR, addr); \
addr -= HAL_DCACHE_LINE_SIZE; \
} while (addr > 0); \
\
/* Re-enable cache if it was enabled on entry */ \
HAL_SET_DCACHE_ENABLED(cache_enabled); \
CYG_MACRO_END
 
// Synchronize the contents of the cache with memory.
// (Unnecessary on OR12K, since cache is write-through.)
#define HAL_DCACHE_SYNC() \
CYG_MACRO_START \
CYG_MACRO_END
 
// Query the state (enabled/disabled) of the data cache
#define HAL_DCACHE_IS_ENABLED(_state_) \
CYG_MACRO_START \
(_state_) = (1 - !(MFSPR(SPR_SR) & SPR_SR_DCE)); \
CYG_MACRO_END
 
// Load the contents of the given address range into the data cache
// and then lock the cache so that it stays there.
 
// The OpenRISC architecture defines these operations, but no
// implementation supports them yet.
 
//#define HAL_DCACHE_LOCK(_base_, _size_)
// Undo a previous lock operation
//#define HAL_DCACHE_UNLOCK(_base_, _size_)
 
// Unlock entire cache
//#define HAL_DCACHE_UNLOCK_ALL()
 
 
//-----------------------------------------------------------------------------
// Data cache line control
 
// Write dirty cache lines to memory and invalidate the cache entries
// for the given address range.
// OR12k has write-through cache, so no flushing of writes to memory
// are necessary.
#define HAL_DCACHE_FLUSH( _base_ , _size_ ) \
HAL_DCACHE_INVALIDATE(_base_, _size_)
// Invalidate cache lines in the given range without writing to memory.
#define HAL_DCACHE_INVALIDATE( _base_ , _size_ ) \
CYG_MACRO_START \
int addr; \
int end = _base_ + _size_; \
for (addr = end; addr >= _base_; addr -= HAL_DCACHE_LINE_SIZE) { \
MTSPR(SPR_DCBIR, addr); \
} \
CYG_MACRO_END
 
// Write dirty cache lines to memory for the given address range.
// OR12k has write-through cache, so this is a NOP
#define HAL_DCACHE_STORE( _base_ , _size_ )
 
// Preread the given range into the cache with the intention of reading
// from it later.
//#define HAL_DCACHE_READ_HINT( _base_ , _size_ )
 
// Preread the given range into the cache with the intention of writing
// to it later.
//#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ )
 
// Allocate and zero the cache lines associated with the given range.
//#define HAL_DCACHE_ZERO( _base_ , _size_ )
 
//-----------------------------------------------------------------------------
// Global control of Instruction cache
 
// Enable the instruction cache
#define HAL_ICACHE_ENABLE() MTSPR(SPR_SR, MFSPR(SPR_SR) | SPR_SR_ICE)
 
// Disable the instruction cache
#define HAL_ICACHE_DISABLE() MTSPR(SPR_SR, MFSPR(SPR_SR) & ~SPR_SR_ICE)
 
// Enable or disable the data cache, depending on argument, which must
// be 0 or 1.
#define HAL_SET_ICACHE_ENABLED(enable) \
MTSPR(SPR_SR, MFSPR(SPR_SR) | (SPR_SR_ICE & -(enable)))
 
// Invalidate the entire instruction cache
#define HAL_ICACHE_INVALIDATE_ALL() \
CYG_MACRO_START \
int cache_enabled, addr; \
\
/* Save current cache mode (disabled/enabled) */ \
HAL_ICACHE_IS_ENABLED(cache_enabled); \
\
/* Disable cache, so that invalidation ignores cache tags */\
HAL_ICACHE_DISABLE(); \
addr = HAL_ICACHE_SIZE; \
do { \
MTSPR(SPR_ICBIR, addr); \
addr -= HAL_ICACHE_LINE_SIZE; \
} while (addr > 0); \
\
/* Re-enable cache if it was enabled on entry */ \
HAL_SET_ICACHE_ENABLED(cache_enabled); \
CYG_MACRO_END
 
// Synchronize the contents of the cache with memory.
#define HAL_ICACHE_SYNC() HAL_ICACHE_INVALIDATE_ALL()
 
// Query the state of the instruction cache
#define HAL_ICACHE_IS_ENABLED(_state_) \
CYG_MACRO_START \
(_state_) = (1 - !(MFSPR(SPR_SR) & SPR_SR_ICE)); \
CYG_MACRO_END
 
 
// Load the contents of the given address range into the instruction cache
// and then lock the cache so that it stays there.
 
// The OpenRISC architecture defines these operations, but no
// implementation supports them yet.
 
//#define HAL_ICACHE_LOCK(_base_, _size_)
 
// Undo a previous lock operation
//#define HAL_ICACHE_UNLOCK(_base_, _size_)
 
// Unlock entire cache
//#define HAL_ICACHE_UNLOCK_ALL()
 
#endif /* __ASSEMBLER__ */
 
#endif // ifndef CYGONCE_HAL_CACHE_H
// End of hal_cache.h
/arch/current/doc/README.html
0,0 → 1,39
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>README - eCos OpenRISC Port</title>
</head>
<body>
For those unfamiliar with OpenRISC, it is an open-source RISC/DSP processor
architecture. &nbsp;OpenCores.org makes available an <a
href="http://www.opencores.org/projects/or1k">implementation</a> of this
architecture that can be synthesized, for example, as part of an FPGA or ASIC.
&nbsp;The port of eCos to OpenRISC was sponsored by the <a
href="http://www.rosum.com">Rosum Corporation</a>.<br>
<br>
A few notes and caveats about the eCos OpenRISC port:
<ul>
<li>The only platform supported at this time is ORP (OpenRISC Reference
Platform).</li>
<li>The only ORP devices supported so far are serial ports used for
diagnostic and debugging purposes and AM29LVxxxx Flash ROM.</li>
<li>To build and debug, you must build the GNU development tools from
<a
href="#%20http://www.opencores.org/projects/or1k/GNU%20Toolchain%20Port">source
available at the OpenCores web site</a> -- not the versions available
from the GNU web site or elsewhere. &nbsp;There is a <a
href="./build_or32_elf_tools.sh">shell script</a> in this directory that
will assist in downloading and building the GNU toolchain.</li>
<li>For debugging, you can use either gdb's JTAG target or the serial
target. The latter has some advantages, e.g. the gdb serial target is
thread-aware, but it is much slower, especially while simulating.<br>
</li>
</ul>
Scott Furman<br>
<i>sfurman at rosum dot com</i><br>
<br>
</body>
</html>
/arch/current/doc/build_or32_elf_tools.sh
0,0 → 1,156
#!/bin/bash -x
 
# Checkout and build gnu toolchain for OpenRISC (or32 target)
 
# Usage:
# build_or32_elf_tools.sh [-c]
# -c Controls whether CVS checkout is done prior to build
# You probably only want to use this command-line option the first time you build.
 
# Directory in which to checkout sources and build
BUILD_DIR=$HOME/or32-elf-src
 
# Target architecture/OS
TARGET=or32-elf
 
# Directory in which to put compiled files, exported headers, etc.
INSTALL_PREFIX=$HOME/tools/i386-redhat-linux
 
########################################################################
 
if [ $1foo = -cfoo ]; then DO_CVS_CHECKOUT=1; else DO_CVS_CHECKOUT=0; fi
 
#
# Some common variables
#
OK_STR="Build OK"
FAIL_STR="Build Failed"
 
mkdir -p $BUILD_DIR
cd $BUILD_DIR
 
#
# Start with binutils
#
if [ $DO_CVS_CHECKOUT != 0 ]; then
date > checkout_binutils.log 2>&1
cvs -d :pserver:cvs@cvs.opencores.org:/home/oc/cvs -z9 co -d binutils or1k/binutils >> \
checkout_binutils.log 2>&1
fi
 
mkdir -p b-b
cd b-b
date > ../build_binutils.log 2>&1
 
../binutils/configure --target=$TARGET --prefix=$INSTALL_PREFIX >> ../build_binutils.log 2>&1
 
make all install >> ../build_binutils.log 2>&1
BUILD_BINUTILS_STATUS=$?
export PATH=$INSTALL_PREFIX/bin:$PATH
cd ..
 
#
# Check if binutils was built and installed correctly
#
if [ $BUILD_BINUTILS_STATUS = 0 ]; then
echo "$OK_STR (`date`)" >> build_binutils.log
else
echo "$FAIL_STR (`date`)" >> build_binutils.log
fi
 
#
# Build gdb
#
if [ $DO_CVS_CHECKOUT != 0 ]; then
date > checkout_gdb.log 2>&1
cvs -d :pserver:cvs@cvs.opencores.org:/home/oc/cvs -z9 co -d gdb or1k/gdb-5.0 >> checkout_gdb.log 2>&1
fi
 
mkdir -p b-gdb
cd b-gdb
date > ../build_gdb.log 2>&1
# Current version of readline has a configuration bug, so you must not specify
# the prefix
#../gdb/configure --target=$TARGET --prefix=$INSTALL_PREFIX >> ../build_gdb.log 2>&1
../gdb/configure --target=$TARGET >> ../build_gdb.log 2>&1
make all >> ../build_gdb.log 2>&1
BUILD_GDB_STATUS=$?
cp gdb/gdb $INSTALL_PREFIX/bin/$TARGET-gdb
cd ..
 
 
#
# Check if gdb was built and installed correctly
#
if [ $BUILD_GDB_STATUS = 0 ]; then
echo "$OK_STR (`date`)" >> build_gdb.log
else
echo "$FAIL_STR (`date`)" >> build_gdb.log
fi
 
#
# Build or1k simulator
#
if [ $DO_CVS_CHECKOUT != 0 ]; then
date > checkout_or1ksim.log 2>&1
cvs -d :pserver:cvs@cvs.opencores.org:/home/oc/cvs -z9 co -d or1ksim or1k/or1ksim >> checkout_or1ksim.log 2>&1
fi
 
cd or1ksim
date > ../build_or1ksim.log 2>&1
../or1ksim/configure --target=$TARGET --prefix=$INSTALL_PREFIX >> ../build_or1ksim.log 2>&1
make all install >> ../build_or1ksim.log 2>&1
BUILD_OR1KSIM_STATUS=$?
cp sim $INSTALL_PREFIX/bin/or32-elf-sim
cd ..
 
#
# Check if or1ksim was built and installed correctly
#
if [ $BUILD_OR1KSIM_STATUS = 0 ]; then
echo "$OK_STR (`date`)" >> build_or1ksim.log
else
echo "$FAIL_STR (`date`)" >> build_or1ksim.log
fi
 
# For now, bail here
#exit
 
#
# Build gcc
#
if [ $DO_CVS_CHECKOUT != 0 ]; then
date > checkout_gcc.log 2>&1
cvs -d :pserver:cvs@cvs.opencores.org:/home/oc/cvs -z9 co -d gcc or1k/gcc-3.1 >> checkout_gcc.log 2>&1
fi
 
# The config script looks for libraries in a weird place. Instead of figuring out what's wrong,
# I just placate it.
 
pushd $INSTALL_PREFIX
cp -pr lib $TARGET
popd
 
mkdir -p b-gcc
cd b-gcc
date > ../build_gcc.log 2>&1
../gcc/configure --target=$TARGET \
--with-gnu-as --with-gnu-ld --verbose \
--enable-threads --prefix=$INSTALL_PREFIX \
--enable-languages="c,c++" >> ../build_gcc.log 2>&1
make all install >> ../build_gcc.log 2>&1
BUILD_GCC_STATUS=$?
 
#
# Check if gcc was built and installed correctly
#
if [ $BUILD_GCC_STATUS = 0 ]; then
echo "$OK_STR (`date`)" >> build_gcc.log
else
echo "$FAIL_STR (`date`)" >> build_gcc.log
fi
 
# Install even though g++ build fails due to inability to build libg++ without C library.
# (How do we prevent building of libg++ ?)
make install
 
arch/current/doc/build_or32_elf_tools.sh Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: arch/current/ChangeLog =================================================================== --- arch/current/ChangeLog (nonexistent) +++ arch/current/ChangeLog (revision 1765) @@ -0,0 +1,45 @@ +2003-04-17 Scott Furman + + Init tick timer on boot + + Ensure stack is aligned in HAL_INIT_CONTEXT() + + Add .text.ram section for time-critical code + + +2003-03-06 Scott Furman + + Initial port of eCos to OpenRISC architecture + +//=========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// Copyright (C) 2002 Gary Thomas +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//=========================================================================== Index: arch/current/src/hal_misc.c =================================================================== --- arch/current/src/hal_misc.c (nonexistent) +++ arch/current/src/hal_misc.c (revision 1765) @@ -0,0 +1,283 @@ +//========================================================================== +// +// hal_misc.c +// +// HAL miscellaneous functions +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg, jlarmour +// Date: 1999-01-21 +// Purpose: HAL miscellaneous functions +// Description: This file contains miscellaneous functions provided by the +// HAL. +// +//####DESCRIPTIONEND#### +// +//========================================================================*/ + +#include + +#include // Base types +#include // tracing macros +#include // assertion macros + +#define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS +#include // architectural definitions +#include // Interrupt handling +#include // hal_ctrlc_isr() + +#include CYGHWR_MEMORY_LAYOUT_H + +/*------------------------------------------------------------------------*/ +/* If required, define a variable to store the clock period. */ + +#ifdef CYGHWR_HAL_CLOCK_PERIOD_DEFINED + +CYG_WORD32 cyg_hal_clock_period; + +#endif + +/*------------------------------------------------------------------------*/ +/* First level C exception handler. */ + +externC void __handle_exception (void); + +externC HAL_SavedRegisters *_hal_registers; + +externC void* volatile __mem_fault_handler; + +externC cyg_uint8 cyg_hal_mips_process_fpe( HAL_SavedRegisters *regs ); + +externC cyg_uint32 cyg_hal_exception_handler(HAL_SavedRegisters *regs) +{ +#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) + + // If we caught an exception inside the stubs, see if we were expecting it + // and if so jump to the saved address + if (__mem_fault_handler) { + regs->pc = (CYG_HAL_OPENRISC_REG)(signed long)__mem_fault_handler; + return 0; // Caught an exception inside stubs + } + + // Set the pointer to the registers of the current exception + // context. At entry the GDB stub will expand the + // HAL_SavedRegisters structure into a (bigger) register array. + _hal_registers = regs; + __handle_exception(); + +#elif defined(CYGFUN_HAL_COMMON_KERNEL_SUPPORT) && defined(CYGPKG_HAL_EXCEPTIONS) + + // We should decode the vector and pass a more appropriate + // value as the second argument. For now we simply pass a + // pointer to the saved registers. We should also divert + // breakpoint and other debug vectors into the debug stubs. + + cyg_hal_deliver_exception( regs->vector, (CYG_ADDRWORD)regs ); + +#else + + CYG_FAIL("Exception!!!"); + +#endif + return 0; +} + +/*------------------------------------------------------------------------*/ +/* default ISR */ + +externC cyg_uint32 +hal_arch_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data) +{ + return 0; +} + +/*------------------------------------------------------------------------*/ +// Come here if interrupt triggered, but no apparent cause +void hal_spurious_IRQ(HAL_SavedRegisters *regs) CYGBLD_ATTRIB_WEAK; +void +hal_spurious_IRQ(HAL_SavedRegisters *regs) +{ +#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) + cyg_hal_exception_handler(regs); +#else + CYG_FAIL("Spurious interrupt!!"); +#endif +} +/*------------------------------------------------------------------------*/ + +#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG +cyg_bool cyg_hal_stop_constructors; +#endif + +typedef void (*pfunc) (void); +extern pfunc __CTOR_LIST__[]; +extern pfunc __CTOR_END__[]; + +void +cyg_hal_invoke_constructors(void) +{ +#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG + static pfunc *p = &__CTOR_END__[-1]; + + cyg_hal_stop_constructors = 0; + for (; p >= __CTOR_LIST__; p--) { + (*p) (); + if (cyg_hal_stop_constructors) { + p--; + break; + } + } +#else + pfunc *p; + + for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--) + (*p) (); +#endif + +} // cyg_hal_invoke_constructors() + +/*------------------------------------------------------------------------*/ +/* Determine the index of the ls bit of the supplied mask. */ + +cyg_uint32 hal_lsbit_index(cyg_uint32 mask) +{ + cyg_uint32 n = mask; + + static const signed char tab[64] = + { -1, 0, 1, 12, 2, 6, 0, 13, 3, 0, 7, 0, 0, 0, 0, 14, 10, + 4, 0, 0, 8, 0, 0, 25, 0, 0, 0, 0, 0, 21, 27 , 15, 31, 11, + 5, 0, 0, 0, 0, 0, 9, 0, 0, 24, 0, 0 , 20, 26, 30, 0, 0, 0, + 0, 23, 0, 19, 29, 0, 22, 18, 28, 17, 16, 0 + }; + + n &= ~(n-1UL); + n = (n<<16)-n; + n = (n<<6)+n; + n = (n<<4)+n; + + return tab[n>>26]; +} + +/*------------------------------------------------------------------------*/ +/* Determine the index of the ms bit of the supplied mask. */ + +cyg_uint32 hal_msbit_index(cyg_uint32 mask) +{ + cyg_uint32 x = mask; + cyg_uint32 w; + + /* Phase 1: make word with all ones from that one to the right */ + x |= x >> 16; + x |= x >> 8; + x |= x >> 4; + x |= x >> 2; + x |= x >> 1; + + /* Phase 2: calculate number of "1" bits in the word */ + w = (x & 0x55555555) + ((x >> 1) & 0x55555555); + w = (w & 0x33333333) + ((w >> 2) & 0x33333333); + w = w + (w >> 4); + w = (w & 0x000F000F) + ((w >> 8) & 0x000F000F); + return (cyg_uint32)((w + (w >> 16)) & 0xFF) - 1; + +} + +/*------------------------------------------------------------------------*/ +/* Delay for some number of useconds. */ +void +hal_delay_us(int us) +{ + cyg_uint32 val1, val2; + int diff; + long usticks; + long ticks; + + // Calculate the number of counter register ticks per microsecond. + + usticks = (CYGNUM_HAL_RTC_PERIOD * CYGNUM_HAL_RTC_DENOMINATOR) / 1000000; + + // Make sure that the value is not zero. + if( usticks == 0 ) usticks = 1; + + while( us > 0 ) + { + int us1 = us; + + // Wait in bursts of less than 10000us to avoid any overflow + // problems in the multiply. + if( us1 > 10000 ) + us1 = 10000; + + us -= us1; + + ticks = us1 * usticks; + + HAL_CLOCK_READ(&val1); + while (ticks > 0) { + do { + HAL_CLOCK_READ(&val2); + } while (val1 == val2); + diff = val2 - val1; + if (diff < 0) diff += CYGNUM_HAL_RTC_PERIOD; + ticks -= diff; + val1 = val2; + } + } +} + +/*------------------------------------------------------------------------*/ + +void hal_arch_program_new_stack(void *_func) +{ + externC void hal_program_new_stack( void *func, CYG_ADDRESS addr); + hal_program_new_stack( (void *)_func, + (CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE - sizeof(CYG_ADDRESS)) & ~7 ); +} + +/*------------------------------------------------------------------------*/ +/* Idle thread action */ + +#include + +void hal_idle_thread_action( cyg_uint32 count ) +{ +} + +/*------------------------------------------------------------------------*/ +/* End of hal_misc.c */ Index: arch/current/src/openrisc.ld =================================================================== --- arch/current/src/openrisc.ld (nonexistent) +++ arch/current/src/openrisc.ld (revision 1765) @@ -0,0 +1,177 @@ +//========================================================================== +// +// openrisc.ld +// +// Linker script for OpenRISC architecture +// +//========================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sfurman +// Contributors:jskov +// Date: 2002-02-28 +// Purpose: OpenRISC Linker script +// +//####DESCRIPTIONEND#### +// +//========================================================================== +STARTUP(vectors.o) +ENTRY(__exception_reset) +#ifdef EXTRAS +INPUT(extras.o) +#endif +GROUP(libtarget.a libgcc.a) + +#define ALIGN_LMA 8 +#define FOLLOWING(_section_) AT ((LOADADDR (_section_) + SIZEOF (_section_) + ALIGN_LMA - 1) & ~ (ALIGN_LMA - 1)) +#define LMA_EQ_VMA +#define FORCE_OUTPUT . = . + + +#define SECTIONS_BEGIN + +#define SECTION_vectors(_region_, _vma_, _lma_) \ + .vectors _vma_ : _lma_ \ + { FORCE_OUTPUT; KEEP(*(.vectors)) } \ + > _region_ + +// Code that might be executed out of either RAM or ROM +#define SECTION_text(_region_, _vma_, _lma_) \ + .text _vma_ : _lma_ \ + { __stext = .; \ + *(.text*) *(.gnu.warning) *(.gnu.linkonce*) *(.init) } \ + > _region_ \ + __etext = .; PROVIDE (etext = .); + +// The .text.ram section is for performance-sensitive code that is +// always executed from RAM. (If the code is loaded into ROM, it will +// be copied into RAM prior to execution.) +// +// Note: The SECTION_text_ram() macro must be listed in the linker +// include script (*.ldi file) prior to SECTION_text(). +// +// All eCos code is put in the .text section unless explicitly placed +// into a section named section .text.ram*. + +#define SECTION_text_ram(_region_, _vma_, _lma_) \ + .text.ram _vma_ : _lma_ \ + { __stext_ram = .; \ + __ram_text_start = ABSOLUTE(.); \ + *(.text.ram*) \ + } > _region_ \ + __load_addr_text_ram = LOADADDR(.text.ram); \ + __ram_text_end = .; PROVIDE(__ram_text_end = .); \ + __etext_ram = .; PROVIDE (etext_ram = .); + +#define SECTION_fini(_region_, _vma_, _lma_) \ + .fini _vma_ : _lma_ \ + { FORCE_OUTPUT; *(.fini) } \ + > _region_ + +#define SECTION_rodata1(_region_, _vma_, _lma_) \ + .rodata1 _vma_ : _lma_ \ + { FORCE_OUTPUT; *(.rodata1*) } \ + > _region_ + +#define SECTION_rodata(_region_, _vma_, _lma_) \ + .rodata _vma_ : _lma_ \ + { FORCE_OUTPUT; *(.rodata*) } \ + > _region_ + +#define SECTION_fixup(_region_, _vma_, _lma_) \ + .fixup _vma_ : _lma_ \ + { __FIXUP_START__ = ABSOLUTE(.); *(.fixup) __FIXUP_END__ = ABSOLUTE(.);}\ + > _region_ + +#define SECTION_gcc_except_table(_region_, _vma_, _lma_) \ + .gcc_except_table _vma_ : _lma_ \ + { __EXCEPT_START__ = ABSOLUTE(.); *(.gcc_except_table) \ + __EXCEPT_END__ = ABSOLUTE(.);} \ + > _region_ + +#define SECTION_data(_region_, _vma_, _lma_) \ + .data _vma_ : _lma_ \ + { __ram_data_start = ABSOLUTE(.); *(.data*) \ + __GOT1_START__ = ABSOLUTE(.); *(.got1) __GOT1_END__ = ABSOLUTE(.); \ + /* Put .ctors and .dtors next to the .got2 section, so that */ \ + /* the pointers get relocated with -mrelocatable. */ \ + . = ALIGN(8); ___CTOR_LIST__ = ABSOLUTE(.); \ + KEEP(*(SORT(.ctors*))) ___CTOR_END__ = ABSOLUTE(.); \ + ___DTOR_LIST__ = ABSOLUTE(.); \ + KEEP(*(SORT(.dtors*))) ___DTOR_END__ = ABSOLUTE(.); \ + . = ALIGN(8); \ + KEEP(*( SORT (.ecos.table.*))) ; \ + . = ALIGN(4); \ + *( .2ram.*) ; \ + __GOT2_START__ = ABSOLUTE(.); *(.got2) __GOT2_END__ = ABSOLUTE(.); \ + __GOT_START = ABSOLUTE(.); _GLOBAL_OFFSET_TABLE_ = ABSOLUTE(. + 32768); \ + _SDA_BASE_ = ABSOLUTE(.); *(.got.plt) *(.got) \ + __GOT_END__ = ABSOLUTE(.); *(.dynamic) \ + /* We want the small data sections together, so single-instruction */ \ + /* offsets can access them all, and initialized data all before */ \ + /* uninitialized, so we can shorten the on-disk segment size. */ \ + __SDATA_START__ = ABSOLUTE(.); *(.sdata) *(.sdata.*) \ + __SDATA2_START__ = ABSOLUTE(.); *(.sdata2*) } \ + > _region_ \ + __rom_data_start = LOADADDR(.data); \ + __ram_data_end = .; PROVIDE(__ram_data_end = .); \ + _edata = .; PROVIDE (edata = .); + +#define SECTION_sbss(_region_, _vma_, _lma_) \ + .sbss _vma_ : _lma_ \ + { __sbss_start = ABSOLUTE (.); \ + __SBSS_START__ = ABSOLUTE(.); *(.sbss.*) __SBSS_END__ = ABSOLUTE(.); \ + __SBSSx_START__ = ABSOLUTE(.); *(.sbss*) __SBSSx_END__ = ABSOLUTE(.);\ + *(.scommon*) \ + __sbss_end = ABSOLUTE (.); } \ + > _region_ + +#define SECTION_bss(_region_, _vma_, _lma_) \ + .bss _vma_ : _lma_ \ + { __bss_start = ABSOLUTE (.); \ + FORCE_OUTPUT; *(.dynbss*) *(.bss*) *(COMMON) \ + __bss_end = ABSOLUTE (.); } \ + > _region_ + +#define SECTIONS_END . = ALIGN(4); _end = .; PROVIDE (end = .); + +#include +#include CYGHWR_MEMORY_LAYOUT_LDI + +// Define VSR and virtual tables to reside at fixed addresses. +#include CYGBLD_HAL_TARGET_H +_hal_vsr_table = CYGHWR_HAL_VSR_TABLE; +_hal_virtual_vector_table = CYGHWR_HAL_VIRTUAL_VECTOR_TABLE; Index: arch/current/src/openrisc_stub.c =================================================================== --- arch/current/src/openrisc_stub.c (nonexistent) +++ arch/current/src/openrisc_stub.c (revision 1765) @@ -0,0 +1,298 @@ +//======================================================================== +// +// openrisc_stub.c +// +// OpenRISC-specific code for remote debugging via gdb +// +//======================================================================== +//####ECOSGPLCOPYRIGHTBEGIN#### +// ------------------------------------------- +// This file is part of eCos, the Embedded Configurable Operating System. +// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +// +// eCos is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 or (at your option) any later version. +// +// eCos is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with eCos; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +// +// As a special exception, if other files instantiate templates or use macros +// or inline functions from this file, or you compile this file and link it +// with other works to produce a work based on this file, this file does not +// by itself cause the resulting work to be covered by the GNU General Public +// License. However the source code for this file must still be made available +// in accordance with section (3) of the GNU General Public License. +// +// This exception does not invalidate any other reasons why a work based on +// this file might be covered by the GNU General Public License. +// +// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +// at http://sources.redhat.com/ecos/ecos-license/ +// ------------------------------------------- +//####ECOSGPLCOPYRIGHTEND#### +//======================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sfurman +// Contributors: Red Hat, jskov, gthomas +// Date: 2003-02-07 +// Purpose: +// Description: Helper functions for gdb stub for OpenRISC processors +// Usage: +// +//####DESCRIPTIONEND#### +// +//======================================================================== + +#include + +#include + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + +#define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS + +#include +#include +#include +#include +#include // assertion macros + +#ifdef CYGNUM_HAL_NO_VECTOR_TRACE +#define USE_BREAKPOINTS_FOR_SINGLE_STEP +#endif + +#ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT +#include // dbg_currthread_id +#endif + +/* Given a trap value TRAP, return the corresponding signal. */ + +int __computeSignal (unsigned int trap_number) +{ + switch (trap_number) + { + // Either no matching page-table entry or protection fault + // while executing load/store operation + case CYGNUM_HAL_VECTOR_DATA_PAGE_FAULT: + // Either no matching page-table entry or protection fault + // while executing load/store operation + case CYGNUM_HAL_VECTOR_INSTR_PAGE_FAULT: + return SIGSEGV; + + // No matching entry in D-TLB + case CYGNUM_HAL_VECTOR_DTLB_MISS: + // No matching entry in I-TLB + case CYGNUM_HAL_VECTOR_ITLB_MISS: + // Unaligned load/store memory access + case CYGNUM_HAL_VECTOR_UNALIGNED_ACCESS: + // Access to non-existent physical memory/device + case CYGNUM_HAL_VECTOR_BUS_ERROR: + return SIGBUS; + + // TRAP instruction executed + case CYGNUM_HAL_VECTOR_TRAP: + return SIGTRAP; + + /* System call instruction executed */ + case CYGNUM_HAL_VECTOR_SYSTEM_CALL: + return SIGSYS; + + /* Tick timer interrupt fired */ + case CYGNUM_HAL_VECTOR_TICK_TIMER: + return SIGALRM; + + /* External interrupt */ + case CYGNUM_HAL_VECTOR_INTERRUPT: + return SIGINT; + + // Illegal or reserved instruction + case CYGNUM_HAL_VECTOR_RESERVED_INSTRUCTION: + return SIGILL; + + // Numeric overflow, etc. + case CYGNUM_HAL_VECTOR_RANGE: + return SIGFPE; + + default: + return SIGTERM; + } +} + + +/* Return the trap number corresponding to the last-taken trap. */ + +int __get_trap_number (void) +{ + // The vector is not not part of the GDB register set so get it + // directly from the save context. + return _hal_registers->vector; +} + +/* Set the currently-saved pc register value to PC. This also updates NPC + as needed. */ + +void set_pc (target_register_t pc) +{ + put_register (PC, pc); +} + + + +/*---------------------------------------------------------------------- + * Single-step support + */ + +// Type of a single OpenRISC instruction +typedef cyg_uint32 t_inst; + +/* Saved instruction data for single step support. */ +static struct +{ + t_inst *targetAddr; + t_inst savedInstr; +} instrBuffer; + + +/* Set things up so that the next user resume will execute one instruction. + This may be done by setting breakpoints or setting a single step flag + in the saved user registers, for example. */ + +void __single_step (void) +{ + t_inst *pc = (t_inst *) get_register (PC); + t_inst *targetAddr; + InstFmt insn; + int flag; + + targetAddr = pc + 1; /* set default */ + + insn.word = *pc; + switch (insn.JType.op) { + case OP_J: + case OP_JAL: + targetAddr = pc + insn.JType.target; + break; + + case OP_BNF: + flag = get_register(SR) & SPR_SR_F; + if (!flag) + targetAddr = pc + insn.JType.target; + break; + + case OP_BF: + flag = get_register(SR) & SPR_SR_F; + if (flag) + targetAddr = pc + insn.JType.target; + break; + + case OP_JR: + case OP_JALR: + targetAddr = (t_inst*)get_register(insn.JRType.rB); + break; + + /* We don't step into interrupts, syscalls or traps */ + default: + break; + } + + instrBuffer.targetAddr = targetAddr; + instrBuffer.savedInstr = *targetAddr; + *targetAddr = __break_opcode (); + + // No need to flush caches; Generic stub code will handle this. +} + +/* Clear the single-step state. */ +void __clear_single_step (void) +{ + if (instrBuffer.targetAddr != NULL) + { + *instrBuffer.targetAddr = instrBuffer.savedInstr; + instrBuffer.targetAddr = NULL; + instrBuffer.savedInstr = 0; + } +} + + +void __install_breakpoints () +{ + /* if (instrBuffer.targetAddr != NULL) + { + instrBuffer.savedInstr = *instrBuffer.targetAddr; + *instrBuffer.targetAddr = __break_opcode (); + } */ + + /* Install the breakpoints in the breakpoint list */ + __install_breakpoint_list(); + + // No need to flush caches here; Generic stub code will handle this. +} + +void __clear_breakpoints (void) +{ + __clear_breakpoint_list(); +} + +/* If the breakpoint we hit is in the breakpoint() instruction, return a + non-zero value. */ + +int +__is_breakpoint_function () +{ + return get_register (PC) == (target_register_t)&_breakinst; +} + + +/* Skip the current instruction. Since this is only called by the + stub when the PC points to a breakpoint or trap instruction, + we can safely just skip 4. */ + +void __skipinst (void) +{ + put_register (PC, get_register (PC) + 4); +} + +target_register_t +get_register (regnames_t reg) +{ + GDB_Registers* gdb_regs; + + gdb_regs = (GDB_Registers*)_registers; + + if (reg >= R0 && reg <= R31) + return gdb_regs->r[reg]; + if (reg == PC) + return gdb_regs->pc; + if (reg == SR) + return gdb_regs->sr; + return 0xdeadbeef; +} + +void +put_register (regnames_t reg, target_register_t value) +{ + GDB_Registers* gdb_regs; + + gdb_regs = (GDB_Registers*)_registers; + + if (reg >= R0 && reg <= R31) { + gdb_regs->r[reg] = value; + } else if (reg == PC) { + gdb_regs->pc = value; + } else if (reg == SR) { + gdb_regs->sr = value; + } else { + CYG_FAIL("Attempt to write to non-existent register "); + } +} + +#endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + Index: arch/current/src/context.S =================================================================== --- arch/current/src/context.S (nonexistent) +++ arch/current/src/context.S (revision 1765) @@ -0,0 +1,295 @@ +##=============================================================================## +## context.S +## +## OpenRISC context switch code +## +##============================================================================= +#####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. +## +## eCos is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free +## Software Foundation; either version 2 or (at your option) any later version. +## +## eCos is distributed in the hope that it will be useful, but WITHOUT ANY +## WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## +## You should have received a copy of the GNU General Public License along +## with eCos; if not, write to the Free Software Foundation, Inc., +## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +## +## As a special exception, if other files instantiate templates or use macros +## or inline functions from this file, or you compile this file and link it +## with other works to produce a work based on this file, this file does not +## by itself cause the resulting work to be covered by the GNU General Public +## License. However the source code for this file must still be made available +## in accordance with section (3) of the GNU General Public License. +## +## This exception does not invalidate any other reasons why a work based on +## this file might be covered by the GNU General Public License. +## +## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +## at http://sources.redhat.com/ecos/ecos-license/ +## ------------------------------------------- +#####ECOSGPLCOPYRIGHTEND#### +##============================================================================= +#######DESCRIPTIONBEGIN#### +## +## Author(s): Scott Furman +## Contributors: +## Date: 2003-01-21 +## Purpose: OpenRISC context switch code +## Description: This file contains implementations of the thread context +## switch routines. It also contains the longjmp() and setjmp() +## routines. +## +######DESCRIPTIONEND#### +## +##============================================================================= + +#include + +#include +#include + + + +#------------------------------------------------------------------------------ +# hal_thread_switch_context() +# Switch thread contexts +# R3 = address of sp of next thread to execute +# R4 = address of sp save location of current thread + +FUNC_START(hal_thread_switch_context) + l.addi sp,sp,-SIZEOF_OR1KREGS # space for registers + + # Store General Purpose Registers (GPRs). + l.sw 2 * OR1K_GPRSIZE(sp), r2 + l.sw 9 * OR1K_GPRSIZE(sp), r9 + l.sw 10 * OR1K_GPRSIZE(sp), r10 + l.sw 12 * OR1K_GPRSIZE(sp), r12 + l.sw 14 * OR1K_GPRSIZE(sp), r14 + l.sw 16 * OR1K_GPRSIZE(sp), r16 + l.sw 18 * OR1K_GPRSIZE(sp), r18 + l.sw 20 * OR1K_GPRSIZE(sp), r20 + l.sw 22 * OR1K_GPRSIZE(sp), r22 + l.sw 24 * OR1K_GPRSIZE(sp), r24 + l.sw 26 * OR1K_GPRSIZE(sp), r26 + l.sw 28 * OR1K_GPRSIZE(sp), r28 + l.sw 30 * OR1K_GPRSIZE(sp), r30 + +#ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM + + # R0 is not typically stored because it is always zero-valued, + # but we store it here for consistency when examining registers + # in the debugger. + l.sw 0 * OR1K_GPRSIZE(sp), r0 + + # Caller-saved regs don't need to be preserved across + # context switches, but we do so to make debugging easier. + + l.sw 3 * OR1K_GPRSIZE(sp), r3 + l.sw 4 * OR1K_GPRSIZE(sp), r4 + l.sw 5 * OR1K_GPRSIZE(sp), r5 + l.sw 6 * OR1K_GPRSIZE(sp), r6 + l.sw 7 * OR1K_GPRSIZE(sp), r7 + l.sw 8 * OR1K_GPRSIZE(sp), r8 + l.sw 11 * OR1K_GPRSIZE(sp), r11 + l.sw 13 * OR1K_GPRSIZE(sp), r13 + l.sw 15 * OR1K_GPRSIZE(sp), r15 + l.sw 17 * OR1K_GPRSIZE(sp), r17 + l.sw 19 * OR1K_GPRSIZE(sp), r19 + l.sw 21 * OR1K_GPRSIZE(sp), r21 + l.sw 23 * OR1K_GPRSIZE(sp), r23 + l.sw 25 * OR1K_GPRSIZE(sp), r25 + l.sw 27 * OR1K_GPRSIZE(sp), r27 + l.sw 29 * OR1K_GPRSIZE(sp), r29 + l.sw 31 * OR1K_GPRSIZE(sp), r31 + + # save MAC LO and HI regs + l.mfspr r5,r0,SPR_MACLO + l.sw OR1KREG_MACLO(sp),r5 + l.mfspr r5,r0,SPR_MACHI + l.sw OR1KREG_MACHI(sp),r5 + +#endif + +#ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT + # Make the thread context look like an exception context if thread- + # aware debugging is required. This state does not need restoring. + l.sw OR1KREG_PC(sp),r9 +#endif + + l.addi r5,sp,SIZEOF_OR1KREGS # save SP in reg dump + l.sw 1 * OR1K_GPRSIZE(sp), r5 + + l.mfspr r5,r0,SPR_SR # save SR in reg dump + l.sw OR1KREG_SR(sp), r5 + + # Return resulting new SP to caller via second argument + l.sw 0(r4), sp + + # Now load the destination thread by dropping through + # to hal_thread_load_context... +FUNC_END(hal_thread_switch_context) + + +#------------------------------------------------------------------------------ +# hal_thread_load_context() +# Load thread context +# R3 = address of sp of next thread to execute +# Note that this function is also the second half of hal_thread_switch_context() +# and is simply dropped into from it. + +FUNC_START(hal_thread_load_context) + + # Copy R3 to SP + l.lwz sp, 0(r3) + + # Restore General Purpose Registers (GPRs). + # R0 is not restored because it is always zero-valued. + l.lwz r2, 2 * OR1K_GPRSIZE(sp) + l.lwz r9, 9 * OR1K_GPRSIZE(sp) + l.lwz r10, 10 * OR1K_GPRSIZE(sp) + l.lwz r12, 12 * OR1K_GPRSIZE(sp) + l.lwz r14, 14 * OR1K_GPRSIZE(sp) + l.lwz r16, 16 * OR1K_GPRSIZE(sp) + l.lwz r18, 18 * OR1K_GPRSIZE(sp) + l.lwz r20, 20 * OR1K_GPRSIZE(sp) + l.lwz r22, 22 * OR1K_GPRSIZE(sp) + l.lwz r24, 24 * OR1K_GPRSIZE(sp) + l.lwz r26, 26 * OR1K_GPRSIZE(sp) + l.lwz r28, 28 * OR1K_GPRSIZE(sp) + l.lwz r30, 30 * OR1K_GPRSIZE(sp) + + # Merge interrupt-enable state of new thread into + # current SR + load32i r5,~(SPR_SR_TEE|SPR_SR_IEE) + l.mfspr r6, r0, SPR_SR + l.and r6, r5, r6 + l.lwz r5, OR1KREG_SR(sp) + l.andi r5, r5, (SPR_SR_TEE|SPR_SR_IEE) + l.or r5, r5, r6 + l.mtspr r0, r5, SPR_SR + +#ifndef CYGDBG_HAL_COMMON_CONTEXT_SAVE_MINIMUM + + # Caller-saved regs don't need to be preserved across + # context switches, but we do so here to make debugging + # easier. + + # Restore MAC LO and HI regs + l.lwz r5, OR1KREG_MACLO(sp) + l.mtspr r0,r5,SPR_MACLO + l.lwz r5, OR1KREG_MACHI(sp) + l.mtspr r0,r5,SPR_MACHI + + l.lwz r4, 4 * OR1K_GPRSIZE(sp) + l.lwz r5, 5 * OR1K_GPRSIZE(sp) + l.lwz r6, 6 * OR1K_GPRSIZE(sp) + l.lwz r7, 7 * OR1K_GPRSIZE(sp) + l.lwz r8, 8 * OR1K_GPRSIZE(sp) + l.lwz r11, 11 * OR1K_GPRSIZE(sp) + l.lwz r13, 13 * OR1K_GPRSIZE(sp) + l.lwz r15, 15 * OR1K_GPRSIZE(sp) + l.lwz r17, 17 * OR1K_GPRSIZE(sp) + l.lwz r19, 19 * OR1K_GPRSIZE(sp) + l.lwz r21, 21 * OR1K_GPRSIZE(sp) + l.lwz r23, 23 * OR1K_GPRSIZE(sp) + l.lwz r25, 25 * OR1K_GPRSIZE(sp) + l.lwz r27, 27 * OR1K_GPRSIZE(sp) + l.lwz r29, 29 * OR1K_GPRSIZE(sp) + l.lwz r31, 31 * OR1K_GPRSIZE(sp) + +#endif + + # If this is the first time we're running a thread, R3 + # contains the argument to the thread entry point function, + # So we always have to restore it even though it's a callee-saved + # register. + l.lwz r3, 3 * OR1K_GPRSIZE(sp) + + # Finally, restore target thread's true SP + l.lwz sp, 1 * OR1K_GPRSIZE(sp) + + l.jr lr + l.nop # delay slot - must be nop + +FUNC_END(hal_thread_load_context) + +#------------------------------------------------------------------------------ +# HAL longjmp, setjmp implementations +# hal_setjmp saves only callee-saved registers into buffer supplied in r3: +# 1,2,9,10,13,15,17,19,21,23,25,27,29,31 +# Note: These definitions are repeated in hal_arch.h. If changes are required +# remember to update both sets. + +#define CYGARC_JMP_BUF_R1 0 +#define CYGARC_JMP_BUF_R2 1 +#define CYGARC_JMP_BUF_R9 2 +#define CYGARC_JMP_BUF_R10 3 +#define CYGARC_JMP_BUF_R12 4 +#define CYGARC_JMP_BUF_R14 5 +#define CYGARC_JMP_BUF_R16 6 +#define CYGARC_JMP_BUF_R18 7 +#define CYGARC_JMP_BUF_R20 8 +#define CYGARC_JMP_BUF_R22 9 +#define CYGARC_JMP_BUF_R24 10 +#define CYGARC_JMP_BUF_R26 11 +#define CYGARC_JMP_BUF_R28 12 +#define CYGARC_JMP_BUF_R30 13 + +#define CYGARC_JMP_BUF_SIZE 14 + +#define jmpbuf_regsize 4 + +FUNC_START(hal_setjmp) + # Store General Purpose Registers (GPRs). + # R0 is not stored because it is always zero-valued. + # Caller-saved registers are not stored + l.sw CYGARC_JMP_BUF_R1 * OR1K_GPRSIZE(r3), r1 + l.sw CYGARC_JMP_BUF_R2 * OR1K_GPRSIZE(r3), r2 + l.sw CYGARC_JMP_BUF_R9 * OR1K_GPRSIZE(r3), r9 + l.sw CYGARC_JMP_BUF_R10 * OR1K_GPRSIZE(r3), r10 + l.sw CYGARC_JMP_BUF_R12 * OR1K_GPRSIZE(r3), r12 + l.sw CYGARC_JMP_BUF_R14 * OR1K_GPRSIZE(r3), r14 + l.sw CYGARC_JMP_BUF_R16 * OR1K_GPRSIZE(r3), r16 + l.sw CYGARC_JMP_BUF_R18 * OR1K_GPRSIZE(r3), r18 + l.sw CYGARC_JMP_BUF_R20 * OR1K_GPRSIZE(r3), r20 + l.sw CYGARC_JMP_BUF_R22 * OR1K_GPRSIZE(r3), r22 + l.sw CYGARC_JMP_BUF_R24 * OR1K_GPRSIZE(r3), r24 + l.sw CYGARC_JMP_BUF_R26 * OR1K_GPRSIZE(r3), r26 + l.sw CYGARC_JMP_BUF_R28 * OR1K_GPRSIZE(r3), r28 + l.sw CYGARC_JMP_BUF_R30 * OR1K_GPRSIZE(r3), r30 + l.jr lr + l.nop # delay slot +FUNC_END(hal_setjmp) + + +FUNC_START(hal_longjmp) + l.lwz r1, CYGARC_JMP_BUF_R1 * OR1K_GPRSIZE(r3) + l.lwz r2, CYGARC_JMP_BUF_R2 * OR1K_GPRSIZE(r3) + l.lwz r9, CYGARC_JMP_BUF_R9 * OR1K_GPRSIZE(r3) + l.lwz r10, CYGARC_JMP_BUF_R10 * OR1K_GPRSIZE(r3) + l.lwz r12, CYGARC_JMP_BUF_R12 * OR1K_GPRSIZE(r3) + l.lwz r14, CYGARC_JMP_BUF_R14 * OR1K_GPRSIZE(r3) + l.lwz r16, CYGARC_JMP_BUF_R16 * OR1K_GPRSIZE(r3) + l.lwz r18, CYGARC_JMP_BUF_R18 * OR1K_GPRSIZE(r3) + l.lwz r20, CYGARC_JMP_BUF_R20 * OR1K_GPRSIZE(r3) + l.lwz r22, CYGARC_JMP_BUF_R22 * OR1K_GPRSIZE(r3) + l.lwz r24, CYGARC_JMP_BUF_R24 * OR1K_GPRSIZE(r3) + l.lwz r26, CYGARC_JMP_BUF_R26 * OR1K_GPRSIZE(r3) + l.lwz r28, CYGARC_JMP_BUF_R28 * OR1K_GPRSIZE(r3) + l.lwz r30, CYGARC_JMP_BUF_R30 * OR1K_GPRSIZE(r3) + + l.jr lr + l.nop # delay slot +FUNC_END(hal_longjmp) + + +#------------------------------------------------------------------------------ +# end of context.S Index: arch/current/src/vectors.S =================================================================== --- arch/current/src/vectors.S (nonexistent) +++ arch/current/src/vectors.S (revision 1765) @@ -0,0 +1,838 @@ +##========================================================================== +## +## Vectors.S +## +## OpenRISC exception vectors, interrupt-handling, reset and +## platform-indepent initialization +## +##========================================================================== +#####ECOSGPLCOPYRIGHTBEGIN#### +## ------------------------------------------- +## This file is part of eCos, the Embedded Configurable Operating System. +## Copyright (C) 2002 Red Hat, Inc. +## +## eCos is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free +## Software Foundation; either version 2 or (at your option) any later version. +## +## eCos is distributed in the hope that it will be useful, but WITHOUT ANY +## WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## +## You should have received a copy of the GNU General Public License along +## with eCos; if not, write to the Free Software Foundation, Inc., +## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. +## +## As a special exception, if other files instantiate templates or use macros +## or inline functions from this file, or you compile this file and link it +## with other works to produce a work based on this file, this file does not +## by itself cause the resulting work to be covered by the GNU General Public +## License. However the source code for this file must still be made available +## in accordance with section (3) of the GNU General Public License. +## +## This exception does not invalidate any other reasons why a work based on +## this file might be covered by the GNU General Public License. +## +## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. +## at http://sources.redhat.com/ecos/ecos-license/ +## ------------------------------------------- +#####ECOSGPLCOPYRIGHTEND#### +##========================================================================== +#######DESCRIPTIONBEGIN#### +## +## Author(s): sfurman +## Contributors: +## Date: 2003-01-20 +## Purpose: OpenRISC interrupts, exception vectors and reset +## Description: This file defines the code placed into the exception +## vectors. It also contains the first level default VSRs +## that save and restore state for both exceptions and +## interrupts. +## +######DESCRIPTIONEND#### +## +##========================================================================== + +#include + +#ifdef CYGPKG_KERNEL +#include // CYGPKG_KERNEL_INSTRUMENT +#endif + +#include +#include + +#=========================================================================== + + + .extern _hal_vsr_table + + .extern _cyg_hal_invoke_constructors + .extern _cyg_instrument + .extern _cyg_start + .extern _hal_IRQ_init + .extern _hal_platform_init + .extern _initialize_stub + + .extern __bss_start + .extern __bss_end + .extern __sbss_start + .extern __sbss_end + +# Include variant macros after MSR definition. +#include +#include + + +#=========================================================================== +# Start by defining the exceptions vectors that must be placed in low +# memory, starting at location 0x100. + + .section ".vectors","ax" + +#--------------------------------------------------------------------------- +# Macros for generating an exception vector service routine + +# Reset vector macro + + .macro reset_vector name org + .p2align 8 + .globl __exception_\name +__exception_\name: + load32i r3,_start + l.jr r3 + l.nop # delay slot + .endm + +# Generic vector macro + + .macro exception_vector name org + .p2align 8 + .globl __exception_\name +__exception_\name: + l.addi sp,sp,-SIZEOF_OR1KREGS # space for registers + + # Store General Purpose Registers (GPRs). + + l.sw 3 * OR1K_GPRSIZE(sp), r3 + l.sw 4 * OR1K_GPRSIZE(sp), r4 + l.sw 5 * OR1K_GPRSIZE(sp), r5 + l.sw 6 * OR1K_GPRSIZE(sp), r6 + l.sw 7 * OR1K_GPRSIZE(sp), r7 + l.sw 8 * OR1K_GPRSIZE(sp), r8 + l.sw 9 * OR1K_GPRSIZE(sp), r9 + l.sw 11 * OR1K_GPRSIZE(sp), r11 + l.sw 13 * OR1K_GPRSIZE(sp), r13 + l.sw 15 * OR1K_GPRSIZE(sp), r15 + l.sw 17 * OR1K_GPRSIZE(sp), r17 + l.sw 19 * OR1K_GPRSIZE(sp), r19 + l.sw 21 * OR1K_GPRSIZE(sp), r21 + l.sw 23 * OR1K_GPRSIZE(sp), r23 + l.sw 25 * OR1K_GPRSIZE(sp), r25 + l.sw 27 * OR1K_GPRSIZE(sp), r27 + l.sw 29 * OR1K_GPRSIZE(sp), r29 + l.sw 31 * OR1K_GPRSIZE(sp), r31 + + +#ifndef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT + + # R0 is not typically stored because it is always zero-valued, + # but we store it here for consistency when examining registers + # in the debugger. + l.sw 0 * OR1K_GPRSIZE(sp), r0 + + # Callee-saved regs don't need to be preserved across a call into + # an ISR, but we can do so to make debugging easier. + l.sw 2 * OR1K_GPRSIZE(sp), r2 + l.sw 10 * OR1K_GPRSIZE(sp), r10 + l.sw 12 * OR1K_GPRSIZE(sp), r12 + l.sw 14 * OR1K_GPRSIZE(sp), r14 + l.sw 16 * OR1K_GPRSIZE(sp), r16 + l.sw 18 * OR1K_GPRSIZE(sp), r18 + l.sw 20 * OR1K_GPRSIZE(sp), r20 + l.sw 22 * OR1K_GPRSIZE(sp), r22 + l.sw 24 * OR1K_GPRSIZE(sp), r24 + l.sw 26 * OR1K_GPRSIZE(sp), r26 + l.sw 28 * OR1K_GPRSIZE(sp), r28 + l.sw 30 * OR1K_GPRSIZE(sp), r30 + + # save MAC LO and HI regs + l.mfspr r5,r0,SPR_MACLO + l.sw OR1KREG_MACLO(sp),r5 + l.mfspr r5,r0,SPR_MACHI + l.sw OR1KREG_MACHI(sp),r5 +#endif + + # Save SP of interruptee in reg dump + l.addi r5,sp,SIZEOF_OR1KREGS + l.sw 1 * OR1K_GPRSIZE(sp),r5 + + # ...and the PC + l.mfspr r5,r0,SPR_EPCR_BASE + l.sw OR1KREG_PC(sp),r5 + + # ... and the Supervisor Register + l.mfspr r5,r0,SPR_ESR_BASE + l.sw OR1KREG_SR(sp),r5 + + # ... and the exception's effective address, if there is one. + # FIXME - don't need to do this for some exceptions + l.mfspr r5,r0,SPR_EEAR_BASE + l.sw OR1KREG_EEAR(sp),r5 + + # Second arg to VSR is exception number + # First vector is located at 0x100, second at 0x200, etc. + # Shift right to get vector number for address lookup. + l.ori r4,r0,(\org>>8) + l.sw OR1KREG_VECTOR(sp),r4 + + # Lookup address of VSR in table and jump to it + # Arg 0: Pointer to HAL_SavedRegisters struct + # Arg 1: Vector # + load32i r5,_hal_vsr_table+(\org>>6) + l.lwz r5,0(r5) + l.jr r5 # To the VSR, Batman + + # First arg to VSR is SP + l.or r3,r0,sp # Delay slot + + .endm + +#--------------------------------------------------------------------------- +# Define the exception vectors. + +rom_vectors: + # These are the architecture-defined vectors that + # are always present. + + reset_vector reset 0x100 + exception_vector bus_error 0x200 + exception_vector data_page_fault 0x300 + exception_vector instruction_page_fault 0x400 + exception_vector tick_timer 0x500 + exception_vector unaligned_access 0x600 + exception_vector illegal_instruction 0x700 + exception_vector external_interrupt 0x800 + exception_vector dtlb_miss 0x900 + exception_vector itlb_miss 0xa00 + exception_vector range 0xb00 + exception_vector syscall 0xc00 + exception_vector reserved 0xd00 + exception_vector trap 0xe00 + +rom_vectors_end: + + +#if defined(CYG_HAL_STARTUP_ROM) || \ + ( defined(CYG_HAL_STARTUP_RAM) && \ + !defined(CYGSEM_HAL_USE_ROM_MONITOR)) + + .macro hal_vsr_table_init + + # Next initialize the VSR table. This happens whether the + # vectors were copied to RAM or not. + + # First fill with exception handlers + load32i r3,_cyg_hal_default_exception_vsr + load32i r4,_hal_vsr_table+4 # First entry in table is unused + l.ori r5,r0,CYGNUM_HAL_VSR_COUNT +1: l.sw 0(r4),r3 + l.addi r5,r5,-1 + l.sfgtsi r5,0 + l.bf 1b + l.addi r4,r4,4 # delay slot + + # Then fill in the interrupt handlers + load32i r4,_hal_vsr_table + load32i r3,_cyg_hal_default_interrupt_vsr + l.sw CYGNUM_HAL_VECTOR_INTERRUPT*4(r4),r3 + l.sw CYGNUM_HAL_VECTOR_TICK_TIMER*4(r4),r3 + .endm + +#elif defined(CYG_HAL_STARTUP_RAM) && defined(CYGSEM_HAL_USE_ROM_MONITOR) + + # Initialize the VSR table entries + # We only take control of the interrupt vectors, + # the rest are left to the ROM for now... + + .macro hal_vsr_table_init + load32i r4,_hal_vsr_table + load32i r3,_cyg_hal_default_interrupt_vsr + l.sw CYGNUM_HAL_VECTOR_INTERRUPT*4(r4),r3 + l.sw CYGNUM_HAL_VECTOR_TICK_TIMER*4(r4),r3 + .endm + + +#else + +#error "Need to define hal_vsr_table_init" + +#endif + +# I-Cache initialization macro + .macro hal_icache_init + /* Disable I-Cache */ + l.mfspr r13,r0,SPR_SR + l.addi r11,r0,-1 + l.xori r11,r11,SPR_SR_ICE + l.and r11,r13,r11 + l.mtspr r0,r11,SPR_SR + + /* Invalidate I-Cache */ + l.addi r13,r0,0 + l.addi r11,r0,HAL_ICACHE_SIZE +1: + l.mtspr r0,r13,SPR_ICBIR + l.sfne r13,r11 + l.bf 1b + l.addi r13,r13,HAL_ICACHE_LINE_SIZE + + /* Enable I-Cache */ + l.mfspr r13,r0,SPR_SR + l.ori r13,r13,SPR_SR_ICE + l.mtspr r0,r13,SPR_SR + + /* Flush instructions out of instruction buffer */ + l.nop + l.nop + l.nop + l.nop + l.nop + .endm + +# D-Cache initialization macro + .macro hal_dcache_init + + /* Flush DC */ + l.addi r10,r0,0 + l.addi r11,r0,HAL_DCACHE_SIZE +1: + l.mtspr r0,r10,SPR_DCBIR + l.sfne r10,r11 + l.bf 1b + l.addi r10,r10,HAL_DCACHE_LINE_SIZE + + /* Enable DC */ + l.mfspr r10,r0,SPR_SR + l.ori r10,r10,SPR_SR_DCE + l.mtspr r0,r10,SPR_SR + .endm + +#=========================================================================== +# Startup code: We jump here from the reset vector to set up the world. + + .text + +FUNC_START(start) + + # Initialize Supervision Register: + # Supervisor mode on, all interrupts off, caches off + # + # (If we've entered here from a hardware reset, then the SR is already + # set to this value, but we may have jumped here as part of a soft + # system reset.) + l.ori r3,r0,SPR_SR_SM + l.mtspr r0,r3,SPR_SR + + # Run platform-specific hardware initialization code. + # This may include memory controller initialization. + # Hence, it is not safe to access RAM until after this point. + hal_hardware_init + +#ifdef CYGSEM_HAL_ENABLE_ICACHE_ON_STARTUP + # Enable I-Cache + hal_icache_init +#endif + +#ifdef CYGSEM_HAL_ENABLE_DCACHE_ON_STARTUP + # Enable D-Cache + hal_dcache_init +#endif + + # Start the tick timer, in case timer polling routine hal_delay_us() is called. + # Initially, no interrupts are generated by the tick timer. Later on, that + # may change when the kernel is initialized. + l.movhi r3, hi(0x40000000|CYGNUM_HAL_RTC_PERIOD) + l.mtspr r0,r3, SPR_TTMR + + .globl _hal_hardware_init_done +_hal_hardware_init_done: + + # set up stack + load32i sp,__interrupt_stack + + # Make a dummy frame on the stack, so that stack backtraces are sane + # for debugging. On return from that function, the restore_state() + # function is called to resume the interrupted thread. + l.addi sp,sp,-8 + l.sw 4(sp),r0 # Dummy saved FP + l.sw 0(sp),r0 # Dummy saved LR + + # Set up exception handlers and VSR table, taking care not to + # step on any ROM monitor VSRs. + hal_vsr_table_init + +#if defined(CYG_HAL_STARTUP_ROM) + # Copy exception/interrupt vectors from ROM to address 0x100 + load32i r4,0x100 + load32i r3,rom_vectors + load32i r5,rom_vectors_end +1: l.sfeq r3,r5 + l.bf 2f + l.lwz r6,0(r3) + l.sw 0(r4),r6 + l.addi r3,r3,4 + l.j 1b + l.addi r4,r4,4 # delay slot +2: + + # Copy .data section into RAM + load32i r3,__rom_data_start + load32i r4,__ram_data_start + load32i r5,__ram_data_end +1: l.sfeq r4,r5 + l.bf 2f + l.lwz r6,0(r3) + l.sw 0(r4),r6 + l.addi r3,r3,4 + l.j 1b + l.addi r4,r4,4 # delay slot +2: + +#endif + + # clear BSS + load32i r4,__bss_start + load32i r5,__bss_end +1: l.sfeq r4,r5 + l.bf 2f + l.nop + l.sw 0(r4),r0 + l.j 1b + l.addi r4,r4,4 +2: + + # Note: no SBSS section to clear with OpenRISC target + + # Platform-specific initialization + l.jal _hal_platform_init + l.nop # delay slot + + # call c++ constructors + l.jal _cyg_hal_invoke_constructors + l.nop # delay slot + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + l.jal _initialize_stub + l.nop # delay slot +#endif + +#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ + || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) + .extern _hal_ctrlc_isr_init + l.jal _hal_ctrlc_isr_init + l.nop # delay slot +#endif + + l.jal _cyg_start # call cyg_start() + l.nop # delay slot +9: + l.j 9b # if we return, loop + +FUNC_END(start) + +#--------------------------------------------------------------------------- +# This code handles the common part of all exception handlers. +# On entry, the machine state is already saved on the stack. +# +# R3 = pointer to HAL_SavedRegisters struct containing saved machine state +# R4 = Vector number +# +# It calls a C routine to do any work, which may result in +# thread switches and changes to the saved state. When we return +# here, the saved state is restored and execution is continued. + + .text + +FUNC_START(cyg_hal_default_exception_vsr) + + .extern _cyg_hal_exception_handler + + # Call C code + + # When cyg_hal_exception_handler() returns, it will jump + # directly to restore_state(), which will resume execution + # at the location of the exception. + l.movhi r9, hi(restore_state) + l.j _cyg_hal_exception_handler + l.ori r9,r9,lo(restore_state) #Delay slot + + # Control never reaches this point, + +FUNC_END(cyg_hal_default_exception_vsr) + +#--------------------------------------------------------------------------- +# This code handles all interrupts and dispatches to a C ISR function +# On entry, the machine state is already saved on the stack. +# +# R3 = pointer to HAL_SavedRegisters struct containing saved machine state +# R4 = Vector number +# +# After we return here, the saved state is restored and execution is continued. + +#ifdef CYGIMP_FORCE_INTERRUPT_HANDLING_CODE_IN_RAM + .section .text.ram,"ax" +#else + .section .text,"ax" +#endif + +FUNC_START(cyg_hal_default_interrupt_vsr) + + # Stash away pointer to saved regs for later + l.or r31,r3,r3 + + # Set scheduler lock to prevent thread rescheduling while the ISR runs +#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT + .extern _cyg_scheduler_sched_lock + load32i r5, _cyg_scheduler_sched_lock + l.lwz r6,0(r5) + l.addi r6,r6,1 + l.sw 0(r5),r6 +#endif + +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK + # Interrupts execute on their own dedicated stack. + # If we're on a thread stack, switch to the interrupt stack. + # If we're called inside a nested interrupt, do nothing. + l.or r6,sp,sp # Stash SP for later + load32i r7,__interrupt_stack # stack top (highest addr + 1) + load32i r8,__interrupt_stack_base # stack base (lowest addr) + l.sfltu sp,r8 # if (sp < __interrupt_stack_base) + l.bf 1f # switch to interrupt stack + l.sfltu sp,r7 # if (sp < __interrupt_stack_top) + l.bf 2f # already on interrupt stack + l.nop # delay slot +1: l.or sp,r7,r7 # Switch to interrupt stack +2: l.addi sp,sp,-8 # Make space to save old SP... + l.sw 0(sp),r6 # ...and save it on the stack +#endif + + # Call C code + +#if defined(CYGPKG_KERNEL_INSTRUMENT) && defined(CYGDBG_KERNEL_INSTRUMENT_INTR) + # Log the interrupt if kernel tracing is enabled + l.ori r3,r0,0x0301 # arg1 = type = INTR,RAISE + # arg2 = vector number + l.ori r5,r0,r0 # arg3 = 0 + l.jal _cyg_instrument # call instrument function + +#endif + +#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ + || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) + # If we are supporting Ctrl-C interrupts from GDB, we must squirrel + # away a pointer to the save interrupt state here so that we can + # plant a breakpoint at some later time. + + .extern _hal_saved_interrupt_state + load32i r8,_hal_saved_interrupt_state + l.sw 0(r8),r31 + +#endif + + # In the event of multiple pending interrupts, determine which + # one will be serviced first. By software convention, the lowest + # numbered external interrupt gets priority. + # + # The (internal) tick timer interrupt is serviced only if no + # external interrupts are pending. + + # Read the PIC interrupt controller's status register + l.mfspr r9,r0,SPR_PICSR + + # Any pending external interrupts ? + l.sfnei r9,0 + l.bf check_for_external_interrupts + + # Theoretically, the only way we could get here is if the tick timer + # interrupt fired, but we check to be sure that's what happened. + l.sfeqi r4,CYGNUM_HAL_VECTOR_TICK_TIMER + l.bf 3f + l.ori r3,r0,CYGNUM_HAL_INTERRUPT_RTC # delay slot + +#ifndef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS + l.jal _hal_spurious_IRQ + l.nop +#endif // CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS + l.j ignore_spurious_interrupt + + # Identify the lowest numbered interrupt bit in the PIC's PSR, + # numbering the MSB as 31 and the LSB as 0 +check_for_external_interrupts: + l.ori r3,r0,0 +2: l.andi r11,r9,1 # Test low bit + l.sfnei r11,0 + l.bf 3f + l.srli r9,r9,1 # Shift right 1 bit + l.j 2b + l.addi r3,r3,1 # Delay slot +3: + + # At this point, r3 contains the ISR number, from 0-32 + # which will be used to index the table of ISRs + l.slli r15,r3,2 + load32i r9, _hal_interrupt_handlers # get interrupt handler table + l.add r9,r9,r15 + l.lwz r11,0(r9) # load ISR pointer + load32i r9, _hal_interrupt_data # get interrupt data table + l.add r9,r9,r15 + l.lwz r4,0(r9) # load data arg to ISR + + # Call ISR + # arg0 = ISR # + # arg1 = data arg associated with interrupt + l.jalr r11 + l.nop + +ignore_spurious_interrupt: + +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK + + # If we are returning from the last nested interrupt, move back + # to the thread stack. interrupt_end() must be called on the + # thread stack since it potentially causes a context switch. + # Since we have arranged for the top of stack location to + # contain the sp we need to go back to here, just pop it off + # and put it in SP. + + l.lwz sp,0(sp) +#endif + +#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT + + # We only need to call _interrupt_end() when there is a kernel + # present to do any tidying up. + + # on return r11 bit 1 will indicate whether a DSR is + # to be posted. Pass this together with a pointer to + # the interrupt object we have just used to the + # interrupt tidy up routine. + l.or r3,r11,r11 + + # Get pointer to HAL_SavedRegisters struct, stashed earlier + l.or r5,r31,r31 + + # Get opaque object associated w/ interrupt vector + load32i r9, _hal_interrupt_objects # get interrupt data table + l.add r9,r9,r15 + l.lwz r4,0(r9) + + # Call interrupt_end() to execute any pending DSRs + # Arg 0 = return value from ISR + # Arg 1 = object associated with interrupt + # Arg 2 = HAL_SavedRegisters struct + + .extern _interrupt_end + l.jal _interrupt_end # call into C to finish off + l.nop +#endif + + # Fall through to restore_state... + +# Return from either an interrupt or an exception +# +# On entry: +# SP = pointer to (HAL_SavedRegisters struct) +# +restore_state: + + # Restore General Purpose Registers (GPRs). + # R0 is not restored because it is always zero-valued. + # R1, R3, and R4 are used as temps, so they are restored a little later + l.lwz r5, 5 * OR1K_GPRSIZE(sp) + l.lwz r6, 6 * OR1K_GPRSIZE(sp) + l.lwz r7, 7 * OR1K_GPRSIZE(sp) + l.lwz r8, 8 * OR1K_GPRSIZE(sp) + l.lwz r9, 9 * OR1K_GPRSIZE(sp) + l.lwz r11, 11 * OR1K_GPRSIZE(sp) + l.lwz r13, 13 * OR1K_GPRSIZE(sp) + l.lwz r15, 15 * OR1K_GPRSIZE(sp) + l.lwz r17, 17 * OR1K_GPRSIZE(sp) + l.lwz r19, 19 * OR1K_GPRSIZE(sp) + l.lwz r21, 21 * OR1K_GPRSIZE(sp) + l.lwz r23, 23 * OR1K_GPRSIZE(sp) + l.lwz r25, 25 * OR1K_GPRSIZE(sp) + l.lwz r27, 27 * OR1K_GPRSIZE(sp) + l.lwz r29, 29 * OR1K_GPRSIZE(sp) + l.lwz r31, 31 * OR1K_GPRSIZE(sp) + +#ifndef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT + # Callee-saved regs don't need to be preserved across a call into + # an ISR, but we can do so to make debugging easier. + + l.lwz r2, 2 * OR1K_GPRSIZE(sp) + l.lwz r10, 10 * OR1K_GPRSIZE(sp) + l.lwz r12, 12 * OR1K_GPRSIZE(sp) + l.lwz r14, 14 * OR1K_GPRSIZE(sp) + l.lwz r16, 16 * OR1K_GPRSIZE(sp) + l.lwz r18, 18 * OR1K_GPRSIZE(sp) + l.lwz r20, 20 * OR1K_GPRSIZE(sp) + l.lwz r22, 22 * OR1K_GPRSIZE(sp) + l.lwz r24, 24 * OR1K_GPRSIZE(sp) + l.lwz r26, 26 * OR1K_GPRSIZE(sp) + l.lwz r28, 28 * OR1K_GPRSIZE(sp) + l.lwz r30, 30 * OR1K_GPRSIZE(sp) + + # Restore MAC LO and HI regs + l.lwz r4, OR1KREG_MACLO(sp) + l.mtspr r0,r4,SPR_MACLO + l.lwz r4, OR1KREG_MACHI(sp) + l.mtspr r0,r4,SPR_MACHI +#endif + + # Must disable interrupts, since they could clobber ESR and EPC regs + l.mfspr r3, r0, SPR_SR + load32i r4,~(SPR_SR_TEE|SPR_SR_IEE) + l.and r3, r4, r3 + l.mtspr r0, r3, SPR_SR + + # At this point we've restored all the pre-interrupt GPRs except for the SP. + # Restore pre-interrupt SR, SP, and PC + l.lwz r4, OR1KREG_SR(sp) + l.mtspr r0, r4, SPR_ESR_BASE + + l.lwz r4, OR1KREG_PC(sp) + l.mtspr r0, r4, SPR_EPCR_BASE + + l.lwz r4, 4 * OR1K_GPRSIZE(sp) + l.lwz r3, 3 * OR1K_GPRSIZE(sp) + l.lwz sp, 1 * OR1K_GPRSIZE(sp) + + # All done, restore CPU state and continue + l.rfe + l.nop # Delay slot + + +##----------------------------------------------------------------------------- +## Execute pending DSRs on the interrupt stack with interrupts enabled. +## Note: this can only be called from code running on a thread stack + +#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK + .extern _cyg_interrupt_call_pending_DSRs + + .text +FUNC_START(hal_interrupt_stack_call_pending_DSRs) + # Switch to interrupt stack + l.or r3, sp, sp # Stash entry SP + load32i sp, __interrupt_stack + l.addi sp, sp, -16 + l.sw 0(sp), r3 # Save entry SP + l.mfspr r4,r0,SPR_SR + l.sw 4(sp), r4 # Save interrupt state + l.ori r4, r4, SPR_SR_IEE|SPR_SR_TEE + l.sw 8(sp),lr + + l.jal _cyg_interrupt_call_pending_DSRs + # Enable interrupts before calling DSRs + l.mtspr r0, r4, SPR_SR # Delay slot + + l.lwz r4, 4(sp) + l.lwz lr, 8(sp) + l.lwz sp, 0(sp) + + # Merge original interrupt state with (possibly altered) SR reg + l.andi r4, r4, SPR_SR_IEE|SPR_SR_TEE + l.mfspr r5, r0, SPR_SR + load32i r6, ~(SPR_SR_IEE|SPR_SR_TEE) + l.and r5, r5, r6 + l.or r4, r4, r5 + + l.jr r9 + l.mtspr r0, r4, SPR_SR # Delay slot + +FUNC_END(hal_interrupt_stack_call_pending_DSRs) +#endif + +##----------------------------------------------------------------------------- +## Switch to a new stack. +## This is used in RedBoot to allow code to execute in a different +## stack context. + +FUNC_START(hal_program_new_stack) + # Arguments are: + # r3 = function to call + # r4 = stack pointer to use + + # Dummy prologue, so that debugger is fooled into thinking there + # is a stack frame. The debugger will use the offsets in the prologue + # below to read the saved register values out of the *new* stack. + l.addi sp,sp,-8 + l.sw 0(sp),fp + l.addi fp,sp,8 + l.sw 4(sp),lr + + l.or r5,sp,sp # Remember original SP + l.addi r6,fp,-8 # Remember original FP + l.or sp,r4,r4 # Switch to new stack + + # "Real prologue" - Offsets here must match dummy prologue above + l.addi sp,sp,-16 + l.sw 0(sp),r6 # So debugger can know caller's FP + l.sw 4(sp),lr # So debugger can know caller's PC + l.sw 8(sp),r5 # Save old SP on stack + + # Call function + l.jalr r3 + l.nop + + l.lwz sp, 8(sp) # Restore original SP + l.lwz lr, 4(sp) + l.jr lr # Return to caller + l.addi sp,sp, 8 # Delay slot + +FUNC_END(hal_program_new_stack) + +#--------------------------------------------------------------------------- +## Temporary interrupt stack + + .section ".bss" + + .balign 16 + .global _cyg_interrupt_stack_base +_cyg_interrupt_stack_base: +__interrupt_stack_base: + .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE + .byte 0 + .endr + .balign 16 + .global _cyg_interrupt_stack +_cyg_interrupt_stack: +__interrupt_stack: + + .long 0,0,0,0,0,0,0,0 + +#-------------------------------------- + .data + .extern _hal_default_isr + + .globl _hal_interrupt_handlers +_hal_interrupt_handlers: + .rept CYGNUM_HAL_ISR_COUNT + .long _hal_default_isr + .endr + + .globl _hal_interrupt_data +_hal_interrupt_data: + .rept CYGNUM_HAL_ISR_COUNT + .long 0 + .endr + + .globl _hal_interrupt_objects +_hal_interrupt_objects: + .rept CYGNUM_HAL_ISR_COUNT + .long 0 + .endr + +#--------------------------------------------------------------------------- +# end of vectors.S

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.