2011-12-15 Konrad Eisele <konrad@gaisler.com>
* configure.in: Add SPARC LEON support.
        * configure: Regenerated.
        * sparc_leon/asm-leon/amba.h, sparc_leon/asm-leon/asmmacro.h,
        sparc_leon/asm-leon/clock.h, sparc_leon/asm-leon/contextswitch.h,
        sparc_leon/asm-leon/elfmacro.h, sparc_leon/asm-leon/head.h,
        sparc_leon/asm-leon/irq.h, sparc_leon/asm-leon/jiffies.h,
        sparc_leon/asm-leon/lambapp.h, sparc_leon/asm-leon/lambapp_devs.h,
        sparc_leon/asm-leon/leon.h, sparc_leon/asm-leon/leon3.h,
        sparc_leon/asm-leon/leonbare_debug.h, sparc_leon/asm-leon/leonbare_kernel.h,
        sparc_leon/asm-leon/leonbare_kernel_queue.h, sparc_leon/asm-leon/leoncompat.h,
        sparc_leon/asm-leon/leondbg.h, sparc_leon/asm-leon/leonstack.h,
        sparc_leon/asm-leon/liblocks.h, sparc_leon/asm-leon/linkage.h,
        sparc_leon/asm-leon/param.h, sparc_leon/asm-leon/queue.h,
        sparc_leon/asm-leon/spinlock.h, sparc_leon/asm-leon/stack.h,
        sparc_leon/asm-leon/time.h, sparc_leon/asm-leon/timer.h,
        sparc_leon/asm-leon/types.h, sparc_leon/asm-leon/winmacros.h:
        New file.
        * sparc_leon/Makefile.in, sparc_leon/_exit.c,
        sparc_leon/amba.c, sparc_leon/amba_dbg.c,
        sparc_leon/amba_driver.c, sparc_leon/amba_scan.c,
        sparc_leon/asm-leon, sparc_leon/bdinit.S,
        sparc_leon/busscan.S, sparc_leon/cacheA.S,
        sparc_leon/catch_interrupt.c, sparc_leon/catch_interrupt_mvt.c,
        sparc_leon/catch_interrupt_pending.c, sparc_leon/catch_interrupt_svt.c,
        sparc_leon/configure.in,
        sparc_leon/console.c, sparc_leon/console_dbg.c,
        sparc_leon/console_init.c, sparc_leon/contextswitch.c,
        sparc_leon/contextswitch_asm.S, sparc_leon/crt0.S,
        sparc_leon/crti.S, sparc_leon/crtn.S,
        sparc_leon/etrap.S, sparc_leon/etrap_fast.S,
        sparc_leon/fpu.S, sparc_leon/gettimeofday.c,
        sparc_leon/initcalls.c, sparc_leon/io.c,
        sparc_leon/irqinstall.S, sparc_leon/irqtrap.S,
        sparc_leon/irqtrap_fast.S, sparc_leon/jiffies.c,
        sparc_leon/kernel.c, sparc_leon/kernel_context.S,
        sparc_leon/kernel_debug.c, sparc_leon/kernel_debug_var.c,
        sparc_leon/kernel_mm.c, sparc_leon/kernel_mutex.c,
        sparc_leon/kernel_queue.c, sparc_leon/kernel_sched.c,
        sparc_leon/kernel_thread.c, sparc_leon/lcpuinit.S,
        sparc_leon/locore.S, sparc_leon/locore_atexit.c,
        sparc_leon/locore_clean.S, sparc_leon/locore_mvt.S,
        sparc_leon/locore_mvt_reset.S, sparc_leon/locore_svt.S,
        sparc_leon/locore_svt_reset.S, sparc_leon/locore_svtdisp.S,
        sparc_leon/locore_var.S, sparc_leon/locore_var_svt.S,
        sparc_leon/mmu_asm.S, sparc_leon/mutex.c,
        sparc_leon/nocache.S, sparc_leon/pnpinit.c,
        sparc_leon/pnpinit_malloc.c, sparc_leon/pnpinit_simple.c,
        sparc_leon/regwin.S, sparc_leon/regwin_patch.c,
        sparc_leon/regwin_slow.S, sparc_leon/regwinflush.S,
        sparc_leon/rtc.c, sparc_leon/rtrap.S,
        sparc_leon/rtrap_fast.S, sparc_leon/stop.S,
        sparc_leon/timer.c, sparc_leon/times.c:
        New file
        * sparc_leon/configure: Regenerate
			
			
This commit is contained in:
		| @@ -1,3 +1,60 @@ | ||||
| 2011-12-15  Konrad Eisele <konrad@gaisler.com> | ||||
|  | ||||
| 	* configure.in: Add SPARC LEON support. | ||||
| 	* configure: Regenerated. | ||||
| 	* sparc_leon/asm-leon/amba.h, sparc_leon/asm-leon/asmmacro.h, | ||||
| 	sparc_leon/asm-leon/clock.h, sparc_leon/asm-leon/contextswitch.h, | ||||
| 	sparc_leon/asm-leon/elfmacro.h, sparc_leon/asm-leon/head.h, | ||||
| 	sparc_leon/asm-leon/irq.h, sparc_leon/asm-leon/jiffies.h, | ||||
| 	sparc_leon/asm-leon/lambapp.h, sparc_leon/asm-leon/lambapp_devs.h, | ||||
| 	sparc_leon/asm-leon/leon.h, sparc_leon/asm-leon/leon3.h, | ||||
| 	sparc_leon/asm-leon/leonbare_debug.h, sparc_leon/asm-leon/leonbare_kernel.h, | ||||
| 	sparc_leon/asm-leon/leonbare_kernel_queue.h, sparc_leon/asm-leon/leoncompat.h, | ||||
| 	sparc_leon/asm-leon/leondbg.h, sparc_leon/asm-leon/leonstack.h, | ||||
| 	sparc_leon/asm-leon/liblocks.h, sparc_leon/asm-leon/linkage.h, | ||||
| 	sparc_leon/asm-leon/param.h, sparc_leon/asm-leon/queue.h, | ||||
| 	sparc_leon/asm-leon/spinlock.h, sparc_leon/asm-leon/stack.h, | ||||
| 	sparc_leon/asm-leon/time.h, sparc_leon/asm-leon/timer.h, | ||||
| 	sparc_leon/asm-leon/types.h, sparc_leon/asm-leon/winmacros.h: | ||||
| 	New file. | ||||
| 	* sparc_leon/Makefile.in, sparc_leon/_exit.c, | ||||
| 	sparc_leon/amba.c, sparc_leon/amba_dbg.c, | ||||
| 	sparc_leon/amba_driver.c, sparc_leon/amba_scan.c, | ||||
| 	sparc_leon/asm-leon, sparc_leon/bdinit.S, | ||||
| 	sparc_leon/busscan.S, sparc_leon/cacheA.S, | ||||
| 	sparc_leon/catch_interrupt.c, sparc_leon/catch_interrupt_mvt.c, | ||||
| 	sparc_leon/catch_interrupt_pending.c, sparc_leon/catch_interrupt_svt.c, | ||||
| 	sparc_leon/configure.in, | ||||
| 	sparc_leon/console.c, sparc_leon/console_dbg.c, | ||||
| 	sparc_leon/console_init.c, sparc_leon/contextswitch.c, | ||||
| 	sparc_leon/contextswitch_asm.S, sparc_leon/crt0.S, | ||||
| 	sparc_leon/crti.S, sparc_leon/crtn.S, | ||||
| 	sparc_leon/etrap.S, sparc_leon/etrap_fast.S, | ||||
| 	sparc_leon/fpu.S, sparc_leon/gettimeofday.c, | ||||
| 	sparc_leon/initcalls.c, sparc_leon/io.c, | ||||
| 	sparc_leon/irqinstall.S, sparc_leon/irqtrap.S, | ||||
| 	sparc_leon/irqtrap_fast.S, sparc_leon/jiffies.c, | ||||
| 	sparc_leon/kernel.c, sparc_leon/kernel_context.S, | ||||
| 	sparc_leon/kernel_debug.c, sparc_leon/kernel_debug_var.c, | ||||
| 	sparc_leon/kernel_mm.c, sparc_leon/kernel_mutex.c, | ||||
| 	sparc_leon/kernel_queue.c, sparc_leon/kernel_sched.c, | ||||
| 	sparc_leon/kernel_thread.c, sparc_leon/lcpuinit.S, | ||||
| 	sparc_leon/locore.S, sparc_leon/locore_atexit.c, | ||||
| 	sparc_leon/locore_clean.S, sparc_leon/locore_mvt.S, | ||||
| 	sparc_leon/locore_mvt_reset.S, sparc_leon/locore_svt.S, | ||||
| 	sparc_leon/locore_svt_reset.S, sparc_leon/locore_svtdisp.S, | ||||
| 	sparc_leon/locore_var.S, sparc_leon/locore_var_svt.S, | ||||
| 	sparc_leon/mmu_asm.S, sparc_leon/mutex.c, | ||||
| 	sparc_leon/nocache.S, sparc_leon/pnpinit.c, | ||||
| 	sparc_leon/pnpinit_malloc.c, sparc_leon/pnpinit_simple.c, | ||||
| 	sparc_leon/regwin.S, sparc_leon/regwin_patch.c, | ||||
| 	sparc_leon/regwin_slow.S, sparc_leon/regwinflush.S, | ||||
| 	sparc_leon/rtc.c, sparc_leon/rtrap.S, | ||||
| 	sparc_leon/rtrap_fast.S, sparc_leon/stop.S, | ||||
| 	sparc_leon/timer.c, sparc_leon/times.c: | ||||
| 	New file | ||||
| 	* sparc_leon/configure: Regenerate | ||||
|  | ||||
| 2011-12-13  Richard Earnshaw  <rearnsha@arm.com> | ||||
|             Thomas Klein  <th.r.klein@web.de> | ||||
|  | ||||
|   | ||||
							
								
								
									
										1936
									
								
								libgloss/configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1936
									
								
								libgloss/configure
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -52,6 +52,9 @@ case "${target}" in | ||||
|   i960-*-coff) | ||||
| 	AC_CONFIG_SUBDIRS([i960]) | ||||
| 	;; | ||||
|   sparc-*leon*-elf* | sparc-*leon*-none*) | ||||
| 	AC_CONFIG_SUBDIRS([sparc_leon]) | ||||
| 	;;  | ||||
|   sparclet-*-aout* | sparc-*-elf* | sparc64-*-elf* | sparc86x-*-* | sparclite-*-*) | ||||
| 	AC_CONFIG_SUBDIRS([sparc]) | ||||
| 	;; | ||||
|   | ||||
							
								
								
									
										161
									
								
								libgloss/sparc_leon/Makefile.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								libgloss/sparc_leon/Makefile.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | ||||
| # Makefile for libgloss/sparc_leon. This is the board support | ||||
| # code for the various sparc leon targets. | ||||
|  | ||||
| DESTDIR = | ||||
| VPATH = @srcdir@ | ||||
| srcdir = @srcdir@ | ||||
| objdir = . | ||||
| srcroot = $(srcdir)/../.. | ||||
| objroot = $(objdir)/../.. | ||||
|  | ||||
| prefix = @prefix@ | ||||
| exec_prefix = @exec_prefix@ | ||||
|  | ||||
| host_alias = @host_alias@ | ||||
| target_alias = @target_alias@ | ||||
|  | ||||
| bindir = @bindir@ | ||||
| libdir = @libdir@ | ||||
| tooldir = $(exec_prefix)/$(target_alias) | ||||
| mkinstalldirs = $(SHELL) $(srcroot)/mkinstalldirs | ||||
|  | ||||
| # Multilib support variables. | ||||
| # TOP is used instead of MULTI{BUILD,SRC}TOP. | ||||
| MULTIDIRS = | ||||
| MULTISUBDIR = | ||||
| MULTIDO = true | ||||
| MULTICLEAN = true | ||||
|  | ||||
| INSTALL = @INSTALL@ | ||||
| INSTALL_PROGRAM = @INSTALL_PROGRAM@ | ||||
| INSTALL_DATA = @INSTALL_DATA@ | ||||
|  | ||||
| SHELL = /bin/sh | ||||
|  | ||||
| CC = @CC@ | ||||
|  | ||||
| AS = @AS@ | ||||
| AR = @AR@ | ||||
| LD = @LD@ | ||||
| RANLIB = @RANLIB@ | ||||
| AR_FLAGS = qrv | ||||
|  | ||||
| OBJDUMP = `if [ -f ${objroot}/../binutils/objdump ] ; \ | ||||
| 	then echo ${objroot}/../binutils/objdump ; \ | ||||
| 	else t='$(program_transform_name)'; echo objdump | sed -e $$t ; fi` | ||||
| OBJCOPY = `if [ -f ${objroot}/../binutils/objcopy ] ; \ | ||||
| 	then echo ${objroot}/../binutils/objcopy ; \ | ||||
| 	else t='$(program_transform_name)'; echo objcopy | sed -e $$t ; fi` | ||||
|  | ||||
| LEON_BSP  = libleonbare.a | ||||
| LEON_OBJS = etrap.o rtrap.o etrap_fast.o rtrap_fast.o irqinstall.o regwin.o \ | ||||
| 	    regwinflush.o fpu.o bdinit.o contextswitch.o \ | ||||
|             busscan.o irqtrap_fast.o catch_interrupt.o catch_interrupt_svt.o \ | ||||
| 	    catch_interrupt_mvt.o catch_interrupt_pending.o gettimeofday.o \ | ||||
| 	    times.o rtc.o lcpuinit.o console_init.o console.o console_dbg.o \ | ||||
| 	    contextswitch.o contextswitch_asm.o _exit.o amba.o amba_dbg.o \ | ||||
| 	    amba_scan.o amba_driver.o timer.o mutex.o locore.o locore_clean.o \ | ||||
| 	    locore_var.o locore_var_svt.o jiffies.o \ | ||||
|             mmu_asm.o locore_svtdisp.o locore_mvt_reset.o locore_svt_reset.o stop.o initcalls.o \ | ||||
| 	    regwin_patch.o cacheA.o nocache.o   | ||||
|  | ||||
| LEONBARE_THREADS = liblbthread.a | ||||
| LEONBARE_THREADS_OBJS = kernel.o kernel_debug.o kernel_debug_var.o kernel_context.o \ | ||||
| 			kernel_mutex.o kernel_thread.o kernel_sched.o kernel_queue.o \ | ||||
| 			kernel_mm.o | ||||
|  | ||||
| LOCOREATEXIT = locore_atexit.o | ||||
| LEON_SMALLC = libsmall.a | ||||
|  | ||||
| PNP=pnpinit.o | ||||
| PNP_S=pnpinit_simple.o | ||||
| LEON_ALL = $(LEON_BSP) $(LEON_SMALLC) $(LEONBARE_THREADS) $(PNP) $(PNP_S) crti.o crtn.o  | ||||
|  | ||||
| LOCORESVT = locore_svt.o  | ||||
| LOCOREMVT = locore_mvt.o | ||||
| CRT0 = crt0.o | ||||
| OBJS = close.o fstat.o getpid.o isatty.o kill.o \ | ||||
| 	lseek.o open.o print.o putnum.o read.o sbrk.o stat.o \ | ||||
| 	unlink.o write.o io.o kernel.o kernel_debug.o kernel_debug_var.o kernel_context.o | ||||
| #link.o  | ||||
|  | ||||
| #### Host specific Makefile fragment comes in here. | ||||
| @host_makefile_frag@ | ||||
|  | ||||
| all: stmp-targ-include $(CRT0) $(LOCOREMVT) $(LOCORESVT) $(LEON_ALL) | ||||
|  | ||||
| $(CRT0): $(srcdir)/crt0.S  | ||||
| 	$(CC) $(CFLAGS_FOR_TARGET) $(CFLAGS) $(INCLUDES) -o $@ -c $(srcdir)/crt0.S | ||||
|  | ||||
| $(LEON_BSP): $(OBJS) $(LEON_OBJS) | ||||
| 	@rm -f $@ | ||||
| 	${AR} ${AR_FLAGS} $@ $(OBJS) $(LEON_OBJS)  | ||||
| 	${RANLIB} $@ | ||||
|  | ||||
| $(LEON_SMALLC): $(LOCOREATEXIT) | ||||
| 	@rm -f $@ | ||||
| 	${AR} ${AR_FLAGS} $@ $(LOCOREATEXIT) | ||||
| 	${RANLIB} $@ | ||||
|  | ||||
| $(LEONBARE_THREADS): $(LEONBARE_THREADS_OBJS) | ||||
| 	@rm -f $@ | ||||
| 	${AR} ${AR_FLAGS} $@ $(LEONBARE_THREADS_OBJS) | ||||
| 	${RANLIB} $@ | ||||
|  | ||||
| install:  | ||||
| 	$(INSTALL_DATA) $(CRT0)     $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(CRT0) | ||||
| 	$(INSTALL_DATA) $(LOCORESVT)  $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(LOCORESVT) | ||||
| 	$(INSTALL_DATA) $(LOCOREMVT)  $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(LOCOREMVT) | ||||
| 	$(INSTALL_DATA) $(PNP)  $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(PNP) | ||||
| 	$(INSTALL_DATA) $(PNP_S)  $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(PNP_S) | ||||
| 	$(INSTALL_DATA) $(LEON_BSP) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(LEON_BSP) | ||||
| 	$(INSTALL_DATA) $(LEON_SMALLC) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(LEON_SMALLC) | ||||
| 	$(INSTALL_DATA) $(LEONBARE_THREADS) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(LEONBARE_THREADS) | ||||
| 	if [ -z "$(MULTISUBDIR)" ]; then \ | ||||
| 	 $(mkinstalldirs) $(DESTDIR)$(tooldir)/include/asm-leon; \ | ||||
| 	 for i in $(srcdir)/asm-leon/*.h; do \ | ||||
| 	  if [ -f $$i ]; then \ | ||||
| 	   $(INSTALL_DATA) $$i $(DESTDIR)$(tooldir)/include/asm-leon/`basename $$i` || exit $$?; \ | ||||
| 	  else true; fi ; \ | ||||
| 	 done; \ | ||||
| 	else true; fi | ||||
|  | ||||
| stmp-targ-include: $(srcdir)/asm-leon/* | ||||
| 	if [ -d ${objroot}/newlib/targ-include/asm-leon ]; then \ | ||||
| 		rm -rf ${objroot}/newlib/targ-include/asm-leon; \ | ||||
| 	else true; fi ; \ | ||||
| 	if [ -d ${objroot}/newlib/targ-include ]; then \ | ||||
| 		cp -r $(srcdir)/asm-leon ${objroot}/newlib/targ-include/asm-leon; \ | ||||
| 	else true; fi ; \ | ||||
| 	touch $@ | ||||
|  | ||||
| all-recursive: stmp-targ-include | ||||
|  | ||||
| # Make a simple test case to test the linker script, startup code, and | ||||
| # I/O code | ||||
| # | ||||
| test:  | ||||
| 	@echo Done... | ||||
|  | ||||
| # target specific makefile fragment comes in here. | ||||
| # @target_makefile_frag@ | ||||
|  | ||||
| clean mostlyclean: | ||||
| 	rm -f *.o *.a *.map *.x | ||||
|  | ||||
| distclean maintainer-clean realclean: clean | ||||
| 	rm -f Makefile config.cache config.log config.status | ||||
|  | ||||
| .PHONY: info dvi doc install-info clean-info | ||||
| info doc dvi: | ||||
| install-info: | ||||
| clean-info: | ||||
|  | ||||
| # target specific makefile fragment comes in here. | ||||
| @target_makefile_frag@ | ||||
|  | ||||
| Makefile: Makefile.in config.status @host_makefile_frag_path@ @target_makefile_frag_path@ | ||||
| 	$(SHELL) config.status | ||||
|  | ||||
| config.status: configure | ||||
| 	$(SHELL) config.status --recheck | ||||
							
								
								
									
										30
									
								
								libgloss/sparc_leon/_exit.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								libgloss/sparc_leon/_exit.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| void | ||||
| _exit (int status) | ||||
| { | ||||
|   asm ("mov 1, %g1; ta 0;\n"); | ||||
| } | ||||
							
								
								
									
										404
									
								
								libgloss/sparc_leon/aclocal.m4
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										404
									
								
								libgloss/sparc_leon/aclocal.m4
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,404 @@ | ||||
| # generated automatically by aclocal 1.11.1 -*- Autoconf -*- | ||||
|  | ||||
| # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, | ||||
| # 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc. | ||||
| # This file is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| # with or without modifications, as long as this notice is preserved. | ||||
|  | ||||
| # This program is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY, to the extent permitted by law; without | ||||
| # even the implied warranty of MERCHANTABILITY or FITNESS FOR A | ||||
| # PARTICULAR PURPOSE. | ||||
|  | ||||
| # AM_CONDITIONAL                                            -*- Autoconf -*- | ||||
|  | ||||
| # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 | ||||
| # Free Software Foundation, Inc. | ||||
| # | ||||
| # This file is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| # with or without modifications, as long as this notice is preserved. | ||||
|  | ||||
| # serial 9 | ||||
|  | ||||
| # AM_CONDITIONAL(NAME, SHELL-CONDITION) | ||||
| # ------------------------------------- | ||||
| # Define a conditional. | ||||
| AC_DEFUN([AM_CONDITIONAL], | ||||
| [AC_PREREQ(2.52)dnl | ||||
|  ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])], | ||||
| 	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl | ||||
| AC_SUBST([$1_TRUE])dnl | ||||
| AC_SUBST([$1_FALSE])dnl | ||||
| _AM_SUBST_NOTMAKE([$1_TRUE])dnl | ||||
| _AM_SUBST_NOTMAKE([$1_FALSE])dnl | ||||
| m4_define([_AM_COND_VALUE_$1], [$2])dnl | ||||
| if $2; then | ||||
|   $1_TRUE= | ||||
|   $1_FALSE='#' | ||||
| else | ||||
|   $1_TRUE='#' | ||||
|   $1_FALSE= | ||||
| fi | ||||
| AC_CONFIG_COMMANDS_PRE( | ||||
| [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then | ||||
|   AC_MSG_ERROR([[conditional "$1" was never defined. | ||||
| Usually this means the macro was only invoked conditionally.]]) | ||||
| fi])]) | ||||
|  | ||||
| # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 | ||||
| # Free Software Foundation, Inc. | ||||
| # | ||||
| # This file is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| # with or without modifications, as long as this notice is preserved. | ||||
|  | ||||
| # serial 10 | ||||
|  | ||||
| # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be | ||||
| # written in clear, in which case automake, when reading aclocal.m4, | ||||
| # will think it sees a *use*, and therefore will trigger all it's | ||||
| # C support machinery.  Also note that it means that autoscan, seeing | ||||
| # CC etc. in the Makefile, will ask for an AC_PROG_CC use... | ||||
|  | ||||
|  | ||||
| # _AM_DEPENDENCIES(NAME) | ||||
| # ---------------------- | ||||
| # See how the compiler implements dependency checking. | ||||
| # NAME is "CC", "CXX", "GCJ", or "OBJC". | ||||
| # We try a few techniques and use that to set a single cache variable. | ||||
| # | ||||
| # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was | ||||
| # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular | ||||
| # dependency, and given that the user is not expected to run this macro, | ||||
| # just rely on AC_PROG_CC. | ||||
| AC_DEFUN([_AM_DEPENDENCIES], | ||||
| [AC_REQUIRE([AM_SET_DEPDIR])dnl | ||||
| AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl | ||||
| AC_REQUIRE([AM_MAKE_INCLUDE])dnl | ||||
| AC_REQUIRE([AM_DEP_TRACK])dnl | ||||
|  | ||||
| ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=], | ||||
|        [$1], CXX,  [depcc="$CXX"  am_compiler_list=], | ||||
|        [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], | ||||
|        [$1], UPC,  [depcc="$UPC"  am_compiler_list=], | ||||
|        [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'], | ||||
|                    [depcc="$$1"   am_compiler_list=]) | ||||
|  | ||||
| AC_CACHE_CHECK([dependency style of $depcc], | ||||
|                [am_cv_$1_dependencies_compiler_type], | ||||
| [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then | ||||
|   # We make a subdir and do the tests there.  Otherwise we can end up | ||||
|   # making bogus files that we don't know about and never remove.  For | ||||
|   # instance it was reported that on HP-UX the gcc test will end up | ||||
|   # making a dummy file named `D' -- because `-MD' means `put the output | ||||
|   # in D'. | ||||
|   mkdir conftest.dir | ||||
|   # Copy depcomp to subdir because otherwise we won't find it if we're | ||||
|   # using a relative directory. | ||||
|   cp "$am_depcomp" conftest.dir | ||||
|   cd conftest.dir | ||||
|   # We will build objects and dependencies in a subdirectory because | ||||
|   # it helps to detect inapplicable dependency modes.  For instance | ||||
|   # both Tru64's cc and ICC support -MD to output dependencies as a | ||||
|   # side effect of compilation, but ICC will put the dependencies in | ||||
|   # the current directory while Tru64 will put them in the object | ||||
|   # directory. | ||||
|   mkdir sub | ||||
|  | ||||
|   am_cv_$1_dependencies_compiler_type=none | ||||
|   if test "$am_compiler_list" = ""; then | ||||
|      am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` | ||||
|   fi | ||||
|   am__universal=false | ||||
|   m4_case([$1], [CC], | ||||
|     [case " $depcc " in #( | ||||
|      *\ -arch\ *\ -arch\ *) am__universal=true ;; | ||||
|      esac], | ||||
|     [CXX], | ||||
|     [case " $depcc " in #( | ||||
|      *\ -arch\ *\ -arch\ *) am__universal=true ;; | ||||
|      esac]) | ||||
|  | ||||
|   for depmode in $am_compiler_list; do | ||||
|     # Setup a source with many dependencies, because some compilers | ||||
|     # like to wrap large dependency lists on column 80 (with \), and | ||||
|     # we should not choose a depcomp mode which is confused by this. | ||||
|     # | ||||
|     # We need to recreate these files for each test, as the compiler may | ||||
|     # overwrite some of them when testing with obscure command lines. | ||||
|     # This happens at least with the AIX C compiler. | ||||
|     : > sub/conftest.c | ||||
|     for i in 1 2 3 4 5 6; do | ||||
|       echo '#include "conftst'$i'.h"' >> sub/conftest.c | ||||
|       # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with | ||||
|       # Solaris 8's {/usr,}/bin/sh. | ||||
|       touch sub/conftst$i.h | ||||
|     done | ||||
|     echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf | ||||
|  | ||||
|     # We check with `-c' and `-o' for the sake of the "dashmstdout" | ||||
|     # mode.  It turns out that the SunPro C++ compiler does not properly | ||||
|     # handle `-M -o', and we need to detect this.  Also, some Intel | ||||
|     # versions had trouble with output in subdirs | ||||
|     am__obj=sub/conftest.${OBJEXT-o} | ||||
|     am__minus_obj="-o $am__obj" | ||||
|     case $depmode in | ||||
|     gcc) | ||||
|       # This depmode causes a compiler race in universal mode. | ||||
|       test "$am__universal" = false || continue | ||||
|       ;; | ||||
|     nosideeffect) | ||||
|       # after this tag, mechanisms are not by side-effect, so they'll | ||||
|       # only be used when explicitly requested | ||||
|       if test "x$enable_dependency_tracking" = xyes; then | ||||
| 	continue | ||||
|       else | ||||
| 	break | ||||
|       fi | ||||
|       ;; | ||||
|     msvisualcpp | msvcmsys) | ||||
|       # This compiler won't grok `-c -o', but also, the minuso test has | ||||
|       # not run yet.  These depmodes are late enough in the game, and | ||||
|       # so weak that their functioning should not be impacted. | ||||
|       am__obj=conftest.${OBJEXT-o} | ||||
|       am__minus_obj= | ||||
|       ;; | ||||
|     none) break ;; | ||||
|     esac | ||||
|     if depmode=$depmode \ | ||||
|        source=sub/conftest.c object=$am__obj \ | ||||
|        depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ | ||||
|        $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ | ||||
|          >/dev/null 2>conftest.err && | ||||
|        grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && | ||||
|        grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && | ||||
|        grep $am__obj sub/conftest.Po > /dev/null 2>&1 && | ||||
|        ${MAKE-make} -s -f confmf > /dev/null 2>&1; then | ||||
|       # icc doesn't choke on unknown options, it will just issue warnings | ||||
|       # or remarks (even with -Werror).  So we grep stderr for any message | ||||
|       # that says an option was ignored or not supported. | ||||
|       # When given -MP, icc 7.0 and 7.1 complain thusly: | ||||
|       #   icc: Command line warning: ignoring option '-M'; no argument required | ||||
|       # The diagnosis changed in icc 8.0: | ||||
|       #   icc: Command line remark: option '-MP' not supported | ||||
|       if (grep 'ignoring option' conftest.err || | ||||
|           grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else | ||||
|         am_cv_$1_dependencies_compiler_type=$depmode | ||||
|         break | ||||
|       fi | ||||
|     fi | ||||
|   done | ||||
|  | ||||
|   cd .. | ||||
|   rm -rf conftest.dir | ||||
| else | ||||
|   am_cv_$1_dependencies_compiler_type=none | ||||
| fi | ||||
| ]) | ||||
| AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) | ||||
| AM_CONDITIONAL([am__fastdep$1], [ | ||||
|   test "x$enable_dependency_tracking" != xno \ | ||||
|   && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) | ||||
| ]) | ||||
|  | ||||
|  | ||||
| # AM_SET_DEPDIR | ||||
| # ------------- | ||||
| # Choose a directory name for dependency files. | ||||
| # This macro is AC_REQUIREd in _AM_DEPENDENCIES | ||||
| AC_DEFUN([AM_SET_DEPDIR], | ||||
| [AC_REQUIRE([AM_SET_LEADING_DOT])dnl | ||||
| AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl | ||||
| ]) | ||||
|  | ||||
|  | ||||
| # AM_DEP_TRACK | ||||
| # ------------ | ||||
| AC_DEFUN([AM_DEP_TRACK], | ||||
| [AC_ARG_ENABLE(dependency-tracking, | ||||
| [  --disable-dependency-tracking  speeds up one-time build | ||||
|   --enable-dependency-tracking   do not reject slow dependency extractors]) | ||||
| if test "x$enable_dependency_tracking" != xno; then | ||||
|   am_depcomp="$ac_aux_dir/depcomp" | ||||
|   AMDEPBACKSLASH='\' | ||||
| fi | ||||
| AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) | ||||
| AC_SUBST([AMDEPBACKSLASH])dnl | ||||
| _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl | ||||
| ]) | ||||
|  | ||||
| # Generate code to set up dependency tracking.              -*- Autoconf -*- | ||||
|  | ||||
| # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 | ||||
| # Free Software Foundation, Inc. | ||||
| # | ||||
| # This file is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| # with or without modifications, as long as this notice is preserved. | ||||
|  | ||||
| #serial 5 | ||||
|  | ||||
| # _AM_OUTPUT_DEPENDENCY_COMMANDS | ||||
| # ------------------------------ | ||||
| AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], | ||||
| [{ | ||||
|   # Autoconf 2.62 quotes --file arguments for eval, but not when files | ||||
|   # are listed without --file.  Let's play safe and only enable the eval | ||||
|   # if we detect the quoting. | ||||
|   case $CONFIG_FILES in | ||||
|   *\'*) eval set x "$CONFIG_FILES" ;; | ||||
|   *)   set x $CONFIG_FILES ;; | ||||
|   esac | ||||
|   shift | ||||
|   for mf | ||||
|   do | ||||
|     # Strip MF so we end up with the name of the file. | ||||
|     mf=`echo "$mf" | sed -e 's/:.*$//'` | ||||
|     # Check whether this is an Automake generated Makefile or not. | ||||
|     # We used to match only the files named `Makefile.in', but | ||||
|     # some people rename them; so instead we look at the file content. | ||||
|     # Grep'ing the first line is not enough: some people post-process | ||||
|     # each Makefile.in and add a new line on top of each file to say so. | ||||
|     # Grep'ing the whole file is not good either: AIX grep has a line | ||||
|     # limit of 2048, but all sed's we know have understand at least 4000. | ||||
|     if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then | ||||
|       dirpart=`AS_DIRNAME("$mf")` | ||||
|     else | ||||
|       continue | ||||
|     fi | ||||
|     # Extract the definition of DEPDIR, am__include, and am__quote | ||||
|     # from the Makefile without running `make'. | ||||
|     DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` | ||||
|     test -z "$DEPDIR" && continue | ||||
|     am__include=`sed -n 's/^am__include = //p' < "$mf"` | ||||
|     test -z "am__include" && continue | ||||
|     am__quote=`sed -n 's/^am__quote = //p' < "$mf"` | ||||
|     # When using ansi2knr, U may be empty or an underscore; expand it | ||||
|     U=`sed -n 's/^U = //p' < "$mf"` | ||||
|     # Find all dependency output files, they are included files with | ||||
|     # $(DEPDIR) in their names.  We invoke sed twice because it is the | ||||
|     # simplest approach to changing $(DEPDIR) to its actual value in the | ||||
|     # expansion. | ||||
|     for file in `sed -n " | ||||
|       s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ | ||||
| 	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do | ||||
|       # Make sure the directory exists. | ||||
|       test -f "$dirpart/$file" && continue | ||||
|       fdir=`AS_DIRNAME(["$file"])` | ||||
|       AS_MKDIR_P([$dirpart/$fdir]) | ||||
|       # echo "creating $dirpart/$file" | ||||
|       echo '# dummy' > "$dirpart/$file" | ||||
|     done | ||||
|   done | ||||
| } | ||||
| ])# _AM_OUTPUT_DEPENDENCY_COMMANDS | ||||
|  | ||||
|  | ||||
| # AM_OUTPUT_DEPENDENCY_COMMANDS | ||||
| # ----------------------------- | ||||
| # This macro should only be invoked once -- use via AC_REQUIRE. | ||||
| # | ||||
| # This code is only required when automatic dependency tracking | ||||
| # is enabled.  FIXME.  This creates each `.P' file that we will | ||||
| # need in order to bootstrap the dependency handling code. | ||||
| AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], | ||||
| [AC_CONFIG_COMMANDS([depfiles], | ||||
|      [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], | ||||
|      [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) | ||||
| ]) | ||||
|  | ||||
| # Copyright (C) 2003, 2005  Free Software Foundation, Inc. | ||||
| # | ||||
| # This file is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| # with or without modifications, as long as this notice is preserved. | ||||
|  | ||||
| # serial 2 | ||||
|  | ||||
| # Check whether the underlying file-system supports filenames | ||||
| # with a leading dot.  For instance MS-DOS doesn't. | ||||
| AC_DEFUN([AM_SET_LEADING_DOT], | ||||
| [rm -rf .tst 2>/dev/null | ||||
| mkdir .tst 2>/dev/null | ||||
| if test -d .tst; then | ||||
|   am__leading_dot=. | ||||
| else | ||||
|   am__leading_dot=_ | ||||
| fi | ||||
| rmdir .tst 2>/dev/null | ||||
| AC_SUBST([am__leading_dot])]) | ||||
|  | ||||
| # Check to see how 'make' treats includes.	            -*- Autoconf -*- | ||||
|  | ||||
| # Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc. | ||||
| # | ||||
| # This file is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| # with or without modifications, as long as this notice is preserved. | ||||
|  | ||||
| # serial 4 | ||||
|  | ||||
| # AM_MAKE_INCLUDE() | ||||
| # ----------------- | ||||
| # Check to see how make treats includes. | ||||
| AC_DEFUN([AM_MAKE_INCLUDE], | ||||
| [am_make=${MAKE-make} | ||||
| cat > confinc << 'END' | ||||
| am__doit: | ||||
| 	@echo this is the am__doit target | ||||
| .PHONY: am__doit | ||||
| END | ||||
| # If we don't find an include directive, just comment out the code. | ||||
| AC_MSG_CHECKING([for style of include used by $am_make]) | ||||
| am__include="#" | ||||
| am__quote= | ||||
| _am_result=none | ||||
| # First try GNU make style include. | ||||
| echo "include confinc" > confmf | ||||
| # Ignore all kinds of additional output from `make'. | ||||
| case `$am_make -s -f confmf 2> /dev/null` in #( | ||||
| *the\ am__doit\ target*) | ||||
|   am__include=include | ||||
|   am__quote= | ||||
|   _am_result=GNU | ||||
|   ;; | ||||
| esac | ||||
| # Now try BSD make style include. | ||||
| if test "$am__include" = "#"; then | ||||
|    echo '.include "confinc"' > confmf | ||||
|    case `$am_make -s -f confmf 2> /dev/null` in #( | ||||
|    *the\ am__doit\ target*) | ||||
|      am__include=.include | ||||
|      am__quote="\"" | ||||
|      _am_result=BSD | ||||
|      ;; | ||||
|    esac | ||||
| fi | ||||
| AC_SUBST([am__include]) | ||||
| AC_SUBST([am__quote]) | ||||
| AC_MSG_RESULT([$_am_result]) | ||||
| rm -f confinc confmf | ||||
| ]) | ||||
|  | ||||
| # Copyright (C) 2006, 2008  Free Software Foundation, Inc. | ||||
| # | ||||
| # This file is free software; the Free Software Foundation | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| # with or without modifications, as long as this notice is preserved. | ||||
|  | ||||
| # serial 2 | ||||
|  | ||||
| # _AM_SUBST_NOTMAKE(VARIABLE) | ||||
| # --------------------------- | ||||
| # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. | ||||
| # This macro is traced by Automake. | ||||
| AC_DEFUN([_AM_SUBST_NOTMAKE]) | ||||
|  | ||||
| # AM_SUBST_NOTMAKE(VARIABLE) | ||||
| # --------------------------- | ||||
| # Public sister of _AM_SUBST_NOTMAKE. | ||||
| AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) | ||||
|  | ||||
| m4_include([../acinclude.m4]) | ||||
							
								
								
									
										152
									
								
								libgloss/sparc_leon/amba.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								libgloss/sparc_leon/amba.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,152 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| /*#define DEBUG_CONFIG*/ | ||||
|  | ||||
| /* Structure containing address to devices found on the Amba Plug&Play bus */ | ||||
| amba_confarea_type amba_conf; | ||||
|  | ||||
| /* Pointers to Interrupt Controller configuration registers */ | ||||
| volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs = 0; | ||||
| volatile LEON3_GpTimer_Regs_Map *LEON3_GpTimer_Regs = 0; | ||||
| unsigned long LEON3_GpTimer_Irq = 0; | ||||
|  | ||||
| unsigned long | ||||
| amba_find_apbslv_addr (unsigned long vendor, unsigned long device, | ||||
| 		       unsigned long *irq) | ||||
| { | ||||
|   unsigned int i, conf, iobar; | ||||
|   for (i = 0; i < amba_conf.apbslv.devnr; i++) | ||||
|     { | ||||
|       conf = amba_get_confword (amba_conf.apbslv, i, 0); | ||||
|       if ((amba_vendor (conf) == vendor) && (amba_device (conf) == device)) | ||||
| 	{ | ||||
| 	  if (irq) | ||||
| 	    { | ||||
| 	      *irq = amba_irq (conf); | ||||
| 	    } | ||||
| 	  iobar = amba_apb_get_membar (amba_conf.apbslv, i); | ||||
| 	  return amba_iobar_start (amba_conf.apbslv.apbmst[i], iobar); | ||||
| 	} | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| #define amba_insert_device(tab, address) do {				\ | ||||
|     if (LEON3_BYPASS_LOAD_PA(address)) {				\ | ||||
|       (tab)->addr[(tab)->devnr] = (address);				\ | ||||
|       (tab)->devnr ++;							\ | ||||
|     }									\ | ||||
|   } while(0) | ||||
|  | ||||
| #define amba_insert_apb_device(tab, address, apbmst, idx) do {		\ | ||||
|     if (*(address)) {							\ | ||||
|       (tab)->addr[(tab)->devnr] = (address);				\ | ||||
|       (tab)->apbmst[(tab)->devnr] = (apbmst);				\ | ||||
|       (tab)->apbmstidx[(tab)->devnr] = (idx);				\ | ||||
|       (tab)->devnr ++;							\ | ||||
|     }									\ | ||||
|   } while(0) | ||||
|  | ||||
| /* | ||||
|  *  Used to scan system bus. Probes for AHB masters, AHB slaves and  | ||||
|  *  APB slaves. Addresses to configuration areas of the AHB masters, | ||||
|  *  AHB slaves, APB slaves and APB master are storeds in  | ||||
|  *  amba_ahb_masters, amba_ahb_slaves and amba. | ||||
|  */ | ||||
|  | ||||
| int amba_init_done = 0; | ||||
|  | ||||
| void | ||||
| amba_init (void) | ||||
| { | ||||
|   unsigned int *cfg_area;	/* address to configuration area */ | ||||
|   unsigned int mbar, conf, apbmst; | ||||
|   int i, j, idx = 0; | ||||
|  | ||||
|   if (amba_init_done) | ||||
|     { | ||||
|       return; | ||||
|     } | ||||
|   amba_init_done = 1; | ||||
|  | ||||
|   memset (&amba_conf, 0, sizeof (amba_conf)); | ||||
|   /*amba_conf.ahbmst.devnr = 0; amba_conf.ahbslv.devnr = 0; amba_conf.apbslv.devnr = 0; */ | ||||
|  | ||||
|   cfg_area = (unsigned int *) (LEON3_IO_AREA | LEON3_CONF_AREA); | ||||
|  | ||||
|   for (i = 0; i < LEON3_AHB_MASTERS; i++) | ||||
|     { | ||||
|       amba_insert_device (&amba_conf.ahbmst, cfg_area); | ||||
|       cfg_area += LEON3_AHB_CONF_WORDS; | ||||
|     } | ||||
|  | ||||
|   cfg_area = | ||||
|     (unsigned int *) (LEON3_IO_AREA | LEON3_CONF_AREA | | ||||
| 		      LEON3_AHB_SLAVE_CONF_AREA); | ||||
|   for (i = 0; i < LEON3_AHB_SLAVES; i++) | ||||
|     { | ||||
|       amba_insert_device (&amba_conf.ahbslv, cfg_area); | ||||
|       cfg_area += LEON3_AHB_CONF_WORDS; | ||||
|     } | ||||
|  | ||||
|   for (i = 0; i < amba_conf.ahbslv.devnr; i++) | ||||
|     { | ||||
|       conf = amba_get_confword (amba_conf.ahbslv, i, 0); | ||||
|       mbar = amba_ahb_get_membar (amba_conf.ahbslv, i, 0); | ||||
|       if ((amba_vendor (conf) == VENDOR_GAISLER) | ||||
| 	  && (amba_device (conf) == GAISLER_APBMST)) | ||||
| 	{ | ||||
| 	  int k; | ||||
| 	  /*amba_conf.apbmst = */ apbmst = amba_membar_start (mbar); | ||||
| 	  cfg_area = (unsigned int *) (apbmst | LEON3_CONF_AREA); | ||||
|  | ||||
| 	  for (j = amba_conf.apbslv.devnr, k = 0; | ||||
| 	       j < AMBA_MAXAPB_DEVS && k < AMBA_MAXAPB_DEVS_PERBUS; j++, k++) | ||||
| 	    { | ||||
| 	      amba_insert_apb_device (&amba_conf.apbslv, cfg_area, apbmst, | ||||
| 				      idx); | ||||
| 	      cfg_area += LEON3_APB_CONF_WORDS; | ||||
| 	    } | ||||
| 	  idx++; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   /* Find LEON3 Interrupt controler */ | ||||
|   LEON3_IrqCtrl_Regs = (volatile LEON3_IrqCtrl_Regs_Map *) | ||||
|     amba_find_apbslv_addr (VENDOR_GAISLER, GAISLER_IRQMP, 0); | ||||
|   LEON3_GpTimer_Regs = (volatile LEON3_GpTimer_Regs_Map *) | ||||
|     amba_find_apbslv_addr (VENDOR_GAISLER, GAISLER_GPTIMER, | ||||
| 			   &LEON3_GpTimer_Irq); | ||||
|   if (LEON3_IrqCtrl_Regs) | ||||
|     { | ||||
|       LEON3_BYPASS_STORE_PA (&(LEON3_IrqCtrl_Regs->mask[0]), 0); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										147
									
								
								libgloss/sparc_leon/amba_dbg.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								libgloss/sparc_leon/amba_dbg.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| /*#define DEBUG_CONFIG*/ | ||||
|  | ||||
| /* Structure containing address to devices found on the Amba Plug&Play bus */ | ||||
| extern amba_confarea_type amba_conf; | ||||
|  | ||||
| #ifdef DEBUG_CONFIG | ||||
| #define printk(fmt,arg...) \ | ||||
| { char c[1024]; \ | ||||
|   sprintf(c,fmt,##arg); \ | ||||
|   DEBUG_puts(c); \ | ||||
| } | ||||
| #else | ||||
| #define printk(fmt,arg...) | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| vendor_dev_string (unsigned long conf, char *vendorbuf, char *devbuf) | ||||
| { | ||||
|   int vendor = amba_vendor (conf); | ||||
|   int dev = amba_device (conf); | ||||
|   char *devstr; | ||||
|   char *vendorstr; | ||||
| #ifdef DEBUG_CONFIG | ||||
|   sprintf (vendorbuf, "Unknown vendor %2x", vendor); | ||||
|   sprintf (devbuf, "Unknown device %2x", dev); | ||||
|   vendorstr = vendor_id2str (vendor); | ||||
|   if (vendorstr) | ||||
|     { | ||||
|       sprintf (vendorbuf, "%s", vendorstr); | ||||
|     } | ||||
|   devstr = device_id2str (vendor, dev); | ||||
|   if (devstr) | ||||
|     { | ||||
|       sprintf (devbuf, "%s", devstr); | ||||
|     } | ||||
| #else | ||||
|   vendorbuf[0] = 0; | ||||
|   devbuf[0] = 0; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void | ||||
| amba_prinf_config (void) | ||||
| { | ||||
|   char devbuf[128]; | ||||
|   char vendorbuf[128]; | ||||
|   unsigned int conf; | ||||
|   int i = 0; | ||||
|   int j = 0; | ||||
|   unsigned int addr; | ||||
|   unsigned int m; | ||||
|   printk ("             Vendors         Slaves\n"); | ||||
|   printk ("Ahb masters:\n"); | ||||
|   i = 0; | ||||
|   while (i < amba_conf.ahbmst.devnr) | ||||
|     { | ||||
|       conf = amba_get_confword (amba_conf.ahbmst, i, 0); | ||||
|       vendor_dev_string (conf, vendorbuf, devbuf); | ||||
|       printk ("%2i(%2x:%3x|%2i): %16s %16s \n", i, amba_vendor (conf), | ||||
| 	      amba_device (conf), amba_irq (conf), vendorbuf, devbuf); | ||||
|       for (j = 0; j < 4; j++) | ||||
| 	{ | ||||
| 	  m = amba_ahb_get_membar (amba_conf.ahbmst, i, j); | ||||
| 	  if (m) | ||||
| 	    { | ||||
| 	      addr = amba_membar_start (m); | ||||
| 	      printk (" +%i: 0x%x \n", j, addr); | ||||
| 	    } | ||||
| 	} | ||||
|       i++; | ||||
|     } | ||||
|   printk ("Ahb slaves:\n"); | ||||
|   i = 0; | ||||
|   while (i < amba_conf.ahbslv.devnr) | ||||
|     { | ||||
|       conf = amba_get_confword (amba_conf.ahbslv, i, 0); | ||||
|       vendor_dev_string (conf, vendorbuf, devbuf); | ||||
|       printk ("%2i(%2x:%3x|%2i): %16s %16s \n", i, amba_vendor (conf), | ||||
| 	      amba_device (conf), amba_irq (conf), vendorbuf, devbuf); | ||||
|       for (j = 0; j < 4; j++) | ||||
| 	{ | ||||
| 	  m = amba_ahb_get_membar (amba_conf.ahbslv, i, j); | ||||
| 	  if (m) | ||||
| 	    { | ||||
| 	      addr = amba_membar_start (m); | ||||
| 	      if (amba_membar_type (m) == AMBA_TYPE_AHBIO) | ||||
| 		{ | ||||
| 		  addr = AMBA_TYPE_AHBIO_ADDR (addr); | ||||
| 		} | ||||
| 	      else if (amba_membar_type (m) == AMBA_TYPE_APBIO) | ||||
| 		{ | ||||
| 		  printk ("Warning: apbio membar\n"); | ||||
| 		} | ||||
| 	      printk (" +%i: 0x%x (raw:0x%x)\n", j, addr, m); | ||||
| 	    } | ||||
| 	} | ||||
|       i++; | ||||
|     } | ||||
|   printk ("Apb slaves:\n"); | ||||
|   i = 0; | ||||
|   while (i < amba_conf.apbslv.devnr) | ||||
|     { | ||||
|  | ||||
|       conf = amba_get_confword (amba_conf.apbslv, i, 0); | ||||
|       vendor_dev_string (conf, vendorbuf, devbuf); | ||||
|       printk ("%2i(%2x:%3x|%2i): %16s %16s \n", i, amba_vendor (conf), | ||||
| 	      amba_device (conf), amba_irq (conf), vendorbuf, devbuf); | ||||
|  | ||||
|       m = amba_apb_get_membar (amba_conf.apbslv, i); | ||||
|       addr = amba_iobar_start (amba_conf.apbslv.apbmst[i], m); | ||||
|       printk (" +%2i: 0x%x (raw:0x%x) \n", 0, addr, m); | ||||
|  | ||||
|       i++; | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										119
									
								
								libgloss/sparc_leon/amba_driver.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								libgloss/sparc_leon/amba_driver.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| /*#define DEBUG_CONFIG*/ | ||||
|  | ||||
| /* Structure containing address to devices found on the Amba Plug&Play bus */ | ||||
| extern amba_confarea_type amba_conf; | ||||
|  | ||||
| /*collect apb slaves*/ | ||||
| int | ||||
| amba_get_free_apbslv_devices (int vendor, int device, amba_apb_device * dev, | ||||
| 			      int nr) | ||||
| { | ||||
|   unsigned int i, conf, iobar, j = 0; | ||||
| #ifdef DEBUG_CONFIG | ||||
|   printf ("Apbslv: search for apdslv devices\n"); | ||||
| #endif | ||||
|   for (i = 0; i < amba_conf.apbslv.devnr && j < nr; i++) | ||||
|     { | ||||
|       conf = amba_get_confword (amba_conf.apbslv, i, 0); | ||||
| #ifdef DEBUG_CONFIG | ||||
|       printf ("Apbslv: check(%x:%x)==(%x:%x)\n", vendor, device, | ||||
| 	      amba_vendor (conf), amba_device (conf)); | ||||
| #endif | ||||
|       if ((amba_vendor (conf) == vendor) && (amba_device (conf) == device)) | ||||
| 	{ | ||||
| 	  if (!(amba_conf.apbslv.allocbits[i / 32] & (1 << (i & (32 - 1))))) | ||||
| 	    { | ||||
| #ifdef DEBUG_CONFIG | ||||
| 	      printf ("Apbslv: alloc device idx %i (%x:%x)\n", | ||||
| 		      j, vendor, device); | ||||
| #endif | ||||
| 	      amba_conf.apbslv.allocbits[i / 32] |= (1 << (i & (32 - 1))); | ||||
| 	      dev[j].irq = amba_irq (conf); | ||||
| 	      iobar = amba_apb_get_membar (amba_conf.apbslv, i); | ||||
| 	      dev[j].start = | ||||
| 		amba_iobar_start (amba_conf.apbslv.apbmst[i], iobar); | ||||
| #ifdef DEBUG_CONFIG | ||||
| 	      printf (" +bar: 0x%x \n", k, dev[j].start); | ||||
| #endif | ||||
| 	      j++; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|   return j; | ||||
| } | ||||
|  | ||||
| /*collect ahb slaves*/ | ||||
| int | ||||
| amba_get_free_ahbslv_devices (int vendor, int device, amba_ahb_device * dev, | ||||
| 			      int nr) | ||||
| { | ||||
|   unsigned int addr, i, conf, iobar, j = 0, k; | ||||
| #ifdef DEBUG_CONFIG | ||||
|   printf ("Ahbslv: search for ahdslv devices\n"); | ||||
| #endif | ||||
|   for (i = 0; i < amba_conf.ahbslv.devnr && j < nr; i++) | ||||
|     { | ||||
|       conf = amba_get_confword (amba_conf.ahbslv, i, 0); | ||||
| #ifdef DEBUG_CONFIG | ||||
|       printf ("Ahbslv: check(%x:%x)==(%x:%x)\n", vendor, device, | ||||
| 	      amba_vendor (conf), amba_device (conf)); | ||||
| #endif | ||||
|       if ((amba_vendor (conf) == vendor) && (amba_device (conf) == device)) | ||||
| 	{ | ||||
| 	  if (!(amba_conf.ahbslv.allocbits[i / 32] & (1 << (i & (32 - 1))))) | ||||
| 	    { | ||||
| #ifdef DEBUG_CONFIG | ||||
| 	      printf ("Ahbslv: alloc device idx %i (%x:%x)\n", | ||||
| 		      j, vendor, device); | ||||
| #endif | ||||
| 	      amba_conf.ahbslv.allocbits[i / 32] |= (1 << (i & (32 - 1))); | ||||
| 	      dev[j].irq = amba_irq (conf); | ||||
| 	      for (k = 0; k < 4; k++) | ||||
| 		{ | ||||
| 		  iobar = amba_ahb_get_membar (amba_conf.ahbslv, i, k); | ||||
| 		  addr = amba_membar_start (iobar); | ||||
| 		  if (amba_membar_type (iobar) == AMBA_TYPE_AHBIO) | ||||
| 		    { | ||||
| 		      addr = AMBA_TYPE_AHBIO_ADDR (addr); | ||||
| 		    } | ||||
| 		  dev[j].start[k] = addr; | ||||
| #ifdef DEBUG_CONFIG | ||||
| 		  printf (" +%i: 0x%x \n", k, dev[j].start[k]); | ||||
| #endif | ||||
| 		} | ||||
| 	      j++; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|   return j; | ||||
| } | ||||
							
								
								
									
										96
									
								
								libgloss/sparc_leon/amba_scan.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								libgloss/sparc_leon/amba_scan.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| unsigned int | ||||
| leon3_ahbslv_scan (register unsigned int vendor, register unsigned int driver) | ||||
| { | ||||
|   register unsigned int conf, i, *confp; | ||||
|   register unsigned int cfg_area = | ||||
|     (unsigned int) (LEON3_IO_AREA | LEON3_CONF_AREA | | ||||
| 		    LEON3_AHB_SLAVE_CONF_AREA); | ||||
|   for (i = 0; i < LEON3_AHB_SLAVES; i++) | ||||
|     { | ||||
|       confp = (unsigned int *) (cfg_area + (i * LEON3_AHB_CONF_WORDS * 4)); | ||||
|       conf = *confp; | ||||
|       if ((amba_vendor (conf) == vendor) && (amba_device (conf) == driver)) | ||||
| 	{ | ||||
| 	  return (unsigned int) confp; | ||||
| 	} | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| unsigned int | ||||
| leon3_getbase (register unsigned int *mbar, register unsigned int iobase, | ||||
| 	       int *irq) | ||||
| { | ||||
|   register unsigned int conf = mbar[1]; | ||||
|   return (unsigned int) (((iobase & 0xfff00000) | | ||||
| 			  ((conf & 0xfff00000) >> 12)) & (((conf & 0x0000fff0) | ||||
| 							   << 4) | | ||||
| 							  0xfff00000)); | ||||
| } | ||||
|  | ||||
| unsigned int | ||||
| leon3_apbslv_scan (register unsigned int base, | ||||
| 		   register unsigned int vendor, | ||||
| 		   register unsigned int driver, | ||||
| 		   amba_apb_device * apbdevs, int c) | ||||
| { | ||||
|   register unsigned int conf, i, *confp; | ||||
|   int j = 0; | ||||
|   for (i = 0; i < LEON3_APB_SLAVES; i++) | ||||
|     { | ||||
|       confp = (unsigned int *) (base + (i * LEON3_APB_CONF_WORDS * 4)); | ||||
|       conf = *confp; | ||||
|       if ((amba_vendor (conf) == vendor) && (amba_device (conf) == driver)) | ||||
| 	{ | ||||
| 	  if (j < c) | ||||
| 	    { | ||||
| 	      apbdevs[j].start = leon3_getbase (confp, base, 0); | ||||
| 	      apbdevs[j].irq = amba_irq (conf); | ||||
| 	      j++; | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|   return j; | ||||
| } | ||||
|  | ||||
|  | ||||
| unsigned int | ||||
| leon3_getapbbase (register unsigned int vendor, | ||||
| 		  register unsigned int driver, | ||||
| 		  amba_apb_device * apbdevs, int c) | ||||
| { | ||||
|   unsigned int apb = leon3_ahbslv_scan (VENDOR_GAISLER, GAISLER_APBMST); | ||||
|   apb = (*(unsigned int *) (apb + 16)) & LEON3_IO_AREA; | ||||
|   apb |= LEON3_CONF_AREA; | ||||
|   return leon3_apbslv_scan (apb, vendor, driver, apbdevs, c); | ||||
| } | ||||
							
								
								
									
										429
									
								
								libgloss/sparc_leon/asm-leon/amba.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										429
									
								
								libgloss/sparc_leon/asm-leon/amba.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,429 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _LEON3_AMBA_H__ | ||||
| #define _LEON3_AMBA_H__ | ||||
|  | ||||
| #define LEON3_IO_AREA 0xfff00000 | ||||
| #define LEON3_CONF_AREA 0xff000 | ||||
| #define LEON3_AHB_SLAVE_CONF_AREA (1 << 11) | ||||
|  | ||||
| #define LEON3_AHB_CONF_WORDS 8 | ||||
| #define LEON3_APB_CONF_WORDS 2 | ||||
| #define LEON3_AHB_MASTERS 8 | ||||
| #define LEON3_AHB_SLAVES 8 | ||||
| #define LEON3_APB_SLAVES 16 | ||||
| #define LEON3_APBUARTS 8 | ||||
|  | ||||
| /* Vendor codes */ | ||||
| #define VENDOR_GAISLER   1 | ||||
| #define VENDOR_PENDER    2 | ||||
| #define VENDOR_ESA       4 | ||||
| #define VENDOR_OPENCORES 8 | ||||
|  | ||||
| /* Gaisler Research device id's */ | ||||
| #define GAISLER_LEON3    0x003 | ||||
| #define GAISLER_LEON3DSU 0x004 | ||||
| #define GAISLER_ETHAHB   0x005 | ||||
| #define GAISLER_APBMST   0x006 | ||||
| #define GAISLER_AHBUART  0x007 | ||||
| #define GAISLER_SRCTRL   0x008 | ||||
| #define GAISLER_SDCTRL   0x009 | ||||
| #define GAISLER_APBUART  0x00c | ||||
| #define GAISLER_IRQMP    0x00d | ||||
| #define GAISLER_AHBRAM   0x00e | ||||
| #define GAISLER_GPTIMER  0x011 | ||||
| #define GAISLER_PCITRG   0x012 | ||||
| #define GAISLER_PCISBRG  0x013 | ||||
| #define GAISLER_PCIFBRG  0x014 | ||||
| #define GAISLER_PCITRACE 0x015 | ||||
| #define GAISLER_PCIDMA   0x016 | ||||
| #define GAISLER_AHBTRACE 0x017 | ||||
| #define GAISLER_ETHDSU   0x018 | ||||
| #define GAISLER_PIOPORT  0x01A | ||||
| #define GAISLER_SPACEWIRE 0x01f | ||||
|  | ||||
| #define GAISLER_ETHMAC       0x01d | ||||
| #define GAISLER_EHCI         0x026 | ||||
| #define GAISLER_UHCI         0x027 | ||||
|  | ||||
| #define GAISLER_L2TIME   0xffd	/* internal device: leon2 timer */ | ||||
| #define GAISLER_L2C      0xffe	/* internal device: leon2compat */ | ||||
| #define GAISLER_PLUGPLAY 0xfff	/* internal device: plug & play configarea */ | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| extern inline char * | ||||
| gaisler_device_str (int id) | ||||
| { | ||||
|   switch (id) | ||||
|     { | ||||
|     case GAISLER_LEON3: | ||||
|       return "GAISLER_LEON3"; | ||||
|     case GAISLER_LEON3DSU: | ||||
|       return "GAISLER_LEON3DSU"; | ||||
|     case GAISLER_ETHAHB: | ||||
|       return "GAISLER_ETHAHB"; | ||||
|     case GAISLER_APBMST: | ||||
|       return "GAISLER_APBMST"; | ||||
|     case GAISLER_AHBUART: | ||||
|       return "GAISLER_AHBUART"; | ||||
|     case GAISLER_SRCTRL: | ||||
|       return "GAISLER_SRCTRL"; | ||||
|     case GAISLER_SDCTRL: | ||||
|       return "GAISLER_SDCTRL"; | ||||
|     case GAISLER_APBUART: | ||||
|       return "GAISLER_APBUART"; | ||||
|     case GAISLER_IRQMP: | ||||
|       return "GAISLER_IRQMP"; | ||||
|     case GAISLER_AHBRAM: | ||||
|       return "GAISLER_AHBRAM"; | ||||
|     case GAISLER_GPTIMER: | ||||
|       return "GAISLER_GPTIMER"; | ||||
|     case GAISLER_PCITRG: | ||||
|       return "GAISLER_PCITRG"; | ||||
|     case GAISLER_PCISBRG: | ||||
|       return "GAISLER_PCISBRG"; | ||||
|     case GAISLER_PCIFBRG: | ||||
|       return "GAISLER_PCIFBRG"; | ||||
|     case GAISLER_PCITRACE: | ||||
|       return "GAISLER_PCITRACE"; | ||||
|     case GAISLER_AHBTRACE: | ||||
|       return "GAISLER_AHBTRACE"; | ||||
|     case GAISLER_ETHDSU: | ||||
|       return "GAISLER_ETHDSU"; | ||||
|     case GAISLER_PIOPORT: | ||||
|       return "GAISLER_PIOPORT"; | ||||
|     case GAISLER_SPACEWIRE: | ||||
|       return "GAISLER_SPACEWIRE"; | ||||
|  | ||||
|  | ||||
|     case GAISLER_L2TIME: | ||||
|       return "GAISLER_L2TIME"; | ||||
|     case GAISLER_L2C: | ||||
|       return "GAISLER_L2C"; | ||||
|     case GAISLER_PLUGPLAY: | ||||
|       return "GAISLER_PLUGPLAY"; | ||||
|  | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* European Space Agency device id's */ | ||||
| #define ESA_LEON2        0x002 | ||||
| #define ESA_MCTRL        0x00f | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| extern inline char * | ||||
| esa_device_str (int id) | ||||
| { | ||||
|   switch (id) | ||||
|     { | ||||
|     case ESA_LEON2: | ||||
|       return "ESA_LEON2"; | ||||
|     case ESA_MCTRL: | ||||
|       return "ESA_MCTRL"; | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* Opencores device id's */ | ||||
| #define OPENCORES_PCIBR  0x4 | ||||
| #define OPENCORES_ETHMAC 0x5 | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| extern inline char * | ||||
| opencores_device_str (int id) | ||||
| { | ||||
|   switch (id) | ||||
|     { | ||||
|     case OPENCORES_PCIBR: | ||||
|       return "OPENCORES_PCIBR"; | ||||
|     case OPENCORES_ETHMAC: | ||||
|       return "OPENCORES_ETHMAC"; | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| extern inline char * | ||||
| device_id2str (int vendor, int id) | ||||
| { | ||||
|   switch (vendor) | ||||
|     { | ||||
|     case VENDOR_GAISLER: | ||||
|       return gaisler_device_str (id); | ||||
|     case VENDOR_ESA: | ||||
|       return esa_device_str (id); | ||||
|     case VENDOR_OPENCORES: | ||||
|       return opencores_device_str (id); | ||||
|     case VENDOR_PENDER: | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| extern inline char * | ||||
| vendor_id2str (int vendor) | ||||
| { | ||||
|   switch (vendor) | ||||
|     { | ||||
|     case VENDOR_GAISLER: | ||||
|       return "VENDOR_GAISLER"; | ||||
|     case VENDOR_ESA: | ||||
|       return "VENDOR_ESA"; | ||||
|     case VENDOR_OPENCORES: | ||||
|       return "VENDOR_OPENCORES"; | ||||
|     case VENDOR_PENDER: | ||||
|       return "VENDOR_PENDER"; | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* Vendor codes */ | ||||
|  | ||||
| /*  | ||||
|  * | ||||
|  * Macros for manipulating Configuration registers   | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #define LEON3_BYPASS_LOAD_PA(x) (*((unsigned long*)x)) | ||||
| #define LEON3_BYPASS_STORE_PA(x,v) (*((unsigned long*)x) = (v)) | ||||
|  | ||||
| #define amba_get_confword(tab, index, word) (*((tab).addr[(index)]+(word))) | ||||
|  | ||||
| #define amba_vendor(x) (((x) >> 24) & 0xff) | ||||
|  | ||||
| #define amba_device(x) (((x) >> 12) & 0xfff) | ||||
|  | ||||
| #define amba_ahb_get_membar(tab, index, nr) (*((tab).addr[(index)]+4+(nr))) | ||||
|  | ||||
| #define amba_apb_get_membar(tab, index) (*((tab).addr[(index)]+1)) | ||||
|  | ||||
| #define amba_membar_start(mbar) (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16)) | ||||
|  | ||||
| #define amba_iobar_start(base, iobar) ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4)) ) | ||||
|  | ||||
| #define amba_irq(conf) ((conf) & 0xf) | ||||
|  | ||||
| #define amba_membar_type(mbar) ((mbar) & 0xf) | ||||
|  | ||||
| #define AMBA_TYPE_APBIO 0x1 | ||||
| #define AMBA_TYPE_MEM   0x2 | ||||
| #define AMBA_TYPE_AHBIO 0x3 | ||||
|  | ||||
| #define AMBA_TYPE_AHBIO_ADDR(addr) (LEON3_IO_AREA | ((addr) >> 12)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in the LEON UART Status Registers. | ||||
|  */ | ||||
|  | ||||
| #define LEON_REG_UART_STATUS_DR   0x00000001	/* Data Ready */ | ||||
| #define LEON_REG_UART_STATUS_TSE  0x00000002	/* TX Send Register Empty */ | ||||
| #define LEON_REG_UART_STATUS_THE  0x00000004	/* TX Hold Register Empty */ | ||||
| #define LEON_REG_UART_STATUS_BR   0x00000008	/* Break Error */ | ||||
| #define LEON_REG_UART_STATUS_OE   0x00000010	/* RX Overrun Error */ | ||||
| #define LEON_REG_UART_STATUS_PE   0x00000020	/* RX Parity Error */ | ||||
| #define LEON_REG_UART_STATUS_FE   0x00000040	/* RX Framing Error */ | ||||
| #define LEON_REG_UART_STATUS_ERR  0x00000078	/* Error Mask */ | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in the LEON UART Ctrl Registers. | ||||
|  */ | ||||
|  | ||||
| #define LEON_REG_UART_CTRL_RE     0x00000001	/* Receiver enable */ | ||||
| #define LEON_REG_UART_CTRL_TE     0x00000002	/* Transmitter enable */ | ||||
| #define LEON_REG_UART_CTRL_RI     0x00000004	/* Receiver interrupt enable */ | ||||
| #define LEON_REG_UART_CTRL_TI     0x00000008	/* Transmitter interrupt enable */ | ||||
| #define LEON_REG_UART_CTRL_PS     0x00000010	/* Parity select */ | ||||
| #define LEON_REG_UART_CTRL_PE     0x00000020	/* Parity enable */ | ||||
| #define LEON_REG_UART_CTRL_FL     0x00000040	/* Flow control enable */ | ||||
| #define LEON_REG_UART_CTRL_LB     0x00000080	/* Loop Back enable */ | ||||
|  | ||||
| #define LEON3_GPTIMER_EN 1 | ||||
| #define LEON3_GPTIMER_RL 2 | ||||
| #define LEON3_GPTIMER_LD 4 | ||||
| #define LEON3_GPTIMER_IRQEN 8 | ||||
| #define LEON3_GPTIMER_IP 0x10 | ||||
|  | ||||
| #define LEON3_GPTIMER_CONFIG_TIMERMASK 0x7 | ||||
| #define LEON3_GPTIMER_CONFIG_SEPERATE (1<<8) | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   volatile unsigned int ilevel; | ||||
|   volatile unsigned int ipend; | ||||
|   volatile unsigned int iforce; | ||||
|   volatile unsigned int iclear; | ||||
|   volatile unsigned int notused00; | ||||
|   volatile unsigned int notused01; | ||||
|   volatile unsigned int notused02; | ||||
|   volatile unsigned int notused03; | ||||
|   volatile unsigned int notused10; | ||||
|   volatile unsigned int notused11; | ||||
|   volatile unsigned int notused12; | ||||
|   volatile unsigned int notused13; | ||||
|   volatile unsigned int notused20; | ||||
|   volatile unsigned int notused21; | ||||
|   volatile unsigned int notused22; | ||||
|   volatile unsigned int notused23; | ||||
|   volatile unsigned int mask[16]; | ||||
| } LEON3_IrqCtrl_Regs_Map; | ||||
| extern volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs;	/* in amba.c */ | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   volatile unsigned int data; | ||||
|   volatile unsigned int status; | ||||
|   volatile unsigned int ctrl; | ||||
|   volatile unsigned int scaler; | ||||
| } LEON23_APBUART_Regs_Map; | ||||
| extern volatile LEON23_APBUART_Regs_Map *leon23_uarts[2];	/* in console.c */ | ||||
| extern unsigned int leon23_irqs[2];	/* in console.c */ | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   volatile unsigned int val; | ||||
|   volatile unsigned int rld; | ||||
|   volatile unsigned int ctrl; | ||||
|   volatile unsigned int unused; | ||||
| } LEON3_GpTimerElem_Regs_Map; | ||||
|  | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   volatile unsigned int scalar; | ||||
|   volatile unsigned int scalar_reload; | ||||
|   volatile unsigned int config; | ||||
|   volatile unsigned int unused; | ||||
|   volatile LEON3_GpTimerElem_Regs_Map e[8]; | ||||
| } LEON3_GpTimer_Regs_Map; | ||||
| #define LEON3_GPTIMER_CONFIG_NRTIMERS(c) ((c)->config & 0x7) | ||||
| int Timer_getTimer1 (unsigned int **count, unsigned int **reload, unsigned int **ctrl);	/* in timer.c */ | ||||
| int Timer_getTimer2 (unsigned int **count, unsigned int **reload, unsigned int **ctrl);	/* in timer.c */ | ||||
| extern volatile LEON3_GpTimer_Regs_Map *LEON3_GpTimer_Regs; | ||||
| extern unsigned long LEON3_GpTimer_Irq; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   volatile unsigned int iodata; | ||||
|   volatile unsigned int ioout; | ||||
|   volatile unsigned int iodir; | ||||
|   volatile unsigned int irqmask; | ||||
|   volatile unsigned int irqpol; | ||||
|   volatile unsigned int irqedge; | ||||
| } LEON3_IOPORT_Regs_Map; | ||||
|  | ||||
|  | ||||
| /* | ||||
|  *  Types and structure used for AMBA Plug & Play bus scanning  | ||||
|  */ | ||||
| extern int amba_init_done; | ||||
|  | ||||
| #define AMBA_MAXAPB_DEVS 64 | ||||
| #define AMBA_MAXAPB_DEVS_PERBUS 16 | ||||
|  | ||||
| typedef struct amba_device_table | ||||
| { | ||||
|   int devnr;			/* numbrer of devices on AHB or APB bus */ | ||||
|   unsigned int *addr[16];	/* addresses to the devices configuration tables */ | ||||
|   unsigned int allocbits[1];	/* 0=unallocated, 1=allocated driver */ | ||||
| } amba_device_table; | ||||
|  | ||||
| typedef struct amba_apbslv_device_table | ||||
| { | ||||
|   int devnr;			/* number of devices on AHB or APB bus */ | ||||
|   unsigned int *addr[AMBA_MAXAPB_DEVS];	/* addresses to the devices configuration tables */ | ||||
|   unsigned int apbmst[AMBA_MAXAPB_DEVS];	/* apb master if a entry is a apb slave */ | ||||
|   unsigned int apbmstidx[AMBA_MAXAPB_DEVS];	/* apb master idx if a entry is a apb slave */ | ||||
|   unsigned int allocbits[4];	/* 0=unallocated, 1=allocated driver */ | ||||
| } amba_apbslv_device_table; | ||||
|  | ||||
| typedef struct amba_confarea_type | ||||
| { | ||||
|   amba_device_table ahbmst; | ||||
|   amba_device_table ahbslv; | ||||
|   amba_apbslv_device_table apbslv; | ||||
|   /*unsigned int apbmst; */ | ||||
| } amba_confarea_type; | ||||
|  | ||||
|  | ||||
| extern unsigned long amba_find_apbslv_addr (unsigned long vendor, | ||||
| 					    unsigned long device, | ||||
| 					    unsigned long *irq); | ||||
|  | ||||
| // collect apb slaves | ||||
| typedef struct amba_apb_device | ||||
| { | ||||
|   unsigned int start, irq; | ||||
| } amba_apb_device; | ||||
| extern int amba_get_free_apbslv_devices (int vendor, int device, | ||||
| 					 amba_apb_device * dev, int nr); | ||||
|  | ||||
| // collect ahb slaves | ||||
| typedef struct amba_ahb_device | ||||
| { | ||||
|   unsigned int start[4], irq; | ||||
| } amba_ahb_device; | ||||
| extern int amba_get_free_ahbslv_devices (int vendor, int device, | ||||
| 					 amba_ahb_device * dev, int nr); | ||||
|  | ||||
|  | ||||
| /*amba_scan.c*/ | ||||
| unsigned int leon3_getapbbase (register unsigned int vendor, | ||||
| 			       register unsigned int driver, | ||||
| 			       amba_apb_device * apbdevs, int c); | ||||
|  | ||||
| #endif //!__ASSEMBLER__ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										54
									
								
								libgloss/sparc_leon/asm-leon/asmmacro.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								libgloss/sparc_leon/asm-leon/asmmacro.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _INCLUDE_LEON_ASMMACRO_h | ||||
| #define _INCLUDE_LEON_ASMMACRO_h | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
|  | ||||
| /* All trap entry points _must_ begin with this macro or else you | ||||
|  * lose.  It makes sure the kernel has a proper window so that | ||||
|  * c-code can be called. | ||||
|  */ | ||||
| #define SAVE_ALL_HEAD \ | ||||
| 	sethi	%hi(leonbare_trapsetup), %l4; \ | ||||
| 	jmpl	%l4 + %lo(leonbare_trapsetup), %l6; | ||||
| #define SAVE_ALL \ | ||||
| 	SAVE_ALL_HEAD \ | ||||
| 	 nop; | ||||
|  | ||||
| #define SAVE_ALL_FAST(l) \ | ||||
|         set     l-8, %l6; \ | ||||
| 	sethi	%hi(leonbare_trapsetup_fast), %l4; \ | ||||
| 	jmpl	%l4 + %lo(leonbare_trapsetup_fast), %g0; \ | ||||
| 	 nop; | ||||
|  | ||||
| /* All traps low-level code here must end with this macro. */ | ||||
| #define RESTORE_ALL b leonbare_trapreturn; clr %l6; | ||||
| #define RESTORE_ALL_FAST b leonbare_trapreturn_fast; clr %l6; | ||||
|  | ||||
| #define WRITE_PAUSE nop; nop; nop; | ||||
|  | ||||
| #endif /* !_INCLUDE_LEON_STACK_h */ | ||||
							
								
								
									
										45
									
								
								libgloss/sparc_leon/asm-leon/clock.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								libgloss/sparc_leon/asm-leon/clock.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _ASMSPARC_CLOCK_PARAM_H | ||||
| #define _ASMSPARC_CLOCK_PARAM_H | ||||
|  | ||||
| #include <_ansi.h> | ||||
| #include <asm-leon/param.h> | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
| int _EXFUN (gettimeofday, (struct timeval * __p, void *__tz)); | ||||
| int _EXFUN (settimeofday, (const struct timeval *, const struct timezone *)); | ||||
| void do_gettimeofday (struct timeval *tv); | ||||
| #endif | ||||
|  | ||||
| #define USEC_PER_SEC (1000000L) | ||||
| #define NSEC_PER_SEC (1000000000L) | ||||
| #define NSEC_PER_USEC (1000L) | ||||
|  | ||||
| extern unsigned long tick_nsec; | ||||
| extern unsigned long tick_usec; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										58
									
								
								libgloss/sparc_leon/asm-leon/contextswitch.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								libgloss/sparc_leon/asm-leon/contextswitch.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef H_LEONBARE_CONTEXTSWITCH_H | ||||
| #define H_LEONBARE_CONTEXTSWITCH_H | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * for this version, the index of THREAD_JB_SP must be even !!! | ||||
|  * This way, we can speed up the context switch (using std). | ||||
|  */ | ||||
| #define THREAD_JB_SP     0	/* aligned */ | ||||
| #define THREAD_JB_PC     1 | ||||
| #define THREAD_JB_SVMASK 3 | ||||
| #define THREAD_JB_MASK   4 | ||||
| #define THREAD_JB_FP     5 | ||||
| #define THREAD_JB_I7     6 | ||||
|  | ||||
| #define THREAD_JB_PSR    8	/* aligned */ | ||||
| #define THREAD_JB_WIM    9 | ||||
|  | ||||
| #define THREAD_JB_FPUCTX 10 | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| extern unsigned long fpustate_current; | ||||
|  | ||||
| typedef int threadctx_t[14 + 2] __attribute__ ((aligned (8))); | ||||
|  | ||||
| int thread_setjmp (threadctx_t env, int val); | ||||
| void thread_longjmp (threadctx_t env, int val); | ||||
| void _switch_to (threadctx_t env, int val); | ||||
|  | ||||
| #endif /* __ASSEMBLER__ */ | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										79
									
								
								libgloss/sparc_leon/asm-leon/elfmacro.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								libgloss/sparc_leon/asm-leon/elfmacro.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _INCLUDE_LEON_ELFMACRO_h | ||||
| #define _INCLUDE_LEON_ELFMACRO_h | ||||
|  | ||||
| #ifdef __ASSEMBLER__ | ||||
| #define _TEXT_SEG_ALIGN 4 | ||||
| #define _LIBLEONBARE_TEXT_SEG_START \ | ||||
|         .text ; .balign _TEXT_SEG_ALIGN | ||||
| #define	FUNC_BEGIN(func)	func: | ||||
| #define	FUNC_END(func)		.size	func, . - func | ||||
|  | ||||
| #define GTEXT(sym) sym  ;  .type   sym,@function | ||||
| #define GDATA(sym) sym  ;  .type   sym,@object | ||||
|  | ||||
| #define	FUNC_EXPORT(func)	.globl	GTEXT(func) | ||||
| #define	DATA_EXPORT(var)	.globl	GDATA(var) | ||||
|  | ||||
| #define	FUNC_IMPORT(func)	.extern	FUNC(func) | ||||
| #define	DATA_IMPORT(var)	.extern	var | ||||
| #endif | ||||
|  | ||||
| #ifndef weak_alias | ||||
| /* Define ALIASNAME as a weak alias for NAME. */ | ||||
| #  define weak_alias(name, aliasname) _weak_alias (name, aliasname) | ||||
| #  define _weak_alias(name, aliasname) \ | ||||
|       extern __typeof (name) aliasname __attribute__ ((weak, alias (#name))); | ||||
| #endif | ||||
|  | ||||
| #ifndef strong_alias | ||||
| /* Define ALIASNAME as a strong alias for NAME.  */ | ||||
| # define strong_alias(name, aliasname) _strong_alias(name, aliasname) | ||||
| # define _strong_alias(name, aliasname) \ | ||||
|   extern __typeof (name) aliasname __attribute__ ((alias (#name))); | ||||
| #endif | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
| typedef int (*initcall_t) (void); | ||||
| extern initcall_t __leonbare_initcall_start; | ||||
| extern initcall_t __leonbare_initcall_end; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #if __GNUC_MINOR__ >= 3 | ||||
| # define __attribute_used__	__attribute__((__used__)) | ||||
| #else | ||||
| # define __attribute_used__	__attribute__((__unused__)) | ||||
| #endif | ||||
|  | ||||
| #define __define_initcall(level,fn) \ | ||||
| 	static initcall_t __initcall_##fn __attribute_used__ \ | ||||
| 	__attribute__((__section__(".initcall" level ".init"))) = fn | ||||
|  | ||||
| #define libc_initcall(fn)		__define_initcall("1",fn) | ||||
|  | ||||
| #endif /* !_INCLUDE_LEON_STACK_h */ | ||||
							
								
								
									
										39
									
								
								libgloss/sparc_leon/asm-leon/head.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								libgloss/sparc_leon/asm-leon/head.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __LEONBARE_HEAD_H | ||||
| #define __LEONBARE_HEAD_H | ||||
|  | ||||
| /* This is for hard interrupts from level 1-14, 15 is non-maskable (nmi) and | ||||
|  * gets handled with another macro. | ||||
|  */ | ||||
| #define TRAP_ENTRY_INTERRUPT(int_level) \ | ||||
|         mov int_level, %l7; rd %psr, %l0; b leonbare_irq_entry; rd %wim, %l3; | ||||
|  | ||||
| #define TRAP_ENTRY(H) \ | ||||
|         rd %psr, %l0; b H; rd %wim, %l3; nop; | ||||
|  | ||||
|  | ||||
| #endif /* __SPARC_HEAD_H */ | ||||
							
								
								
									
										101
									
								
								libgloss/sparc_leon/asm-leon/irq.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								libgloss/sparc_leon/asm-leon/irq.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _LEON_CATCHIRQ_HANDLER_H_ | ||||
| #define _LEON_CATCHIRQ_HANDLER_H_ | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_queue.h>*/ | ||||
| #include <asm-leon/leoncompat.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| struct pt_regs; | ||||
| typedef int (*irqhandler) (int, void *, struct leonbare_pt_regs *); | ||||
|  | ||||
| struct irqaction | ||||
| { | ||||
|   irqhandler handler; | ||||
|   unsigned long flags; | ||||
|   void *dev_id; | ||||
|   struct irqaction *next; | ||||
| }; | ||||
| #define INIT_IRQACTION { 0,0,0,0 } | ||||
|  | ||||
| struct irqmp_type | ||||
| { | ||||
|   int *addr; | ||||
|   int eirq; | ||||
| }; | ||||
|  | ||||
| extern void chained_catch_interrupt (int irq, struct irqaction *a); | ||||
| extern int catch_interrupt (int func, int irq); | ||||
|  | ||||
| typedef int (*schedulehandler) (struct leonbare_pt_regs *); | ||||
| extern schedulehandler schedule_callback; | ||||
| typedef int (*tickerhandler) (struct leonbare_pt_regs *); | ||||
| extern tickerhandler ticker_callback; | ||||
| extern int leonbare_hz; | ||||
| extern int nestcount; | ||||
| extern int no_inirq_check; | ||||
| extern unsigned long force_noalarm; | ||||
|  | ||||
| extern void (*handler_irq_pre) (void); | ||||
| extern void (*handler_irq_post) (void); | ||||
|  | ||||
| extern void leonbare_enable_traps (unsigned long old_flags); | ||||
| extern unsigned long leonbare_disable_traps (); | ||||
| extern void leonbare_flush_windows (); | ||||
|  | ||||
| static inline void | ||||
| leonbare_enable_irq (int irq) | ||||
| { | ||||
|   unsigned int old, irqmask = 1 << irq; | ||||
|   old = leonbare_disable_traps (); | ||||
|   //--------------------- | ||||
|   switch (LEONCOMPAT_VERSION) | ||||
|     { | ||||
|     case 3: | ||||
|     default: | ||||
|       LEON3_IrqCtrl_Regs->mask[0] = LEON3_IrqCtrl_Regs->mask[0] | irqmask; | ||||
|       break; | ||||
|     } | ||||
|   //--------------------- | ||||
|   leonbare_enable_traps (old); | ||||
| } | ||||
|  | ||||
| typedef int (*pendinghandler) (void *); | ||||
| struct pendingaction | ||||
| { | ||||
|   TAILQ_ENTRY (pendingaction) next; | ||||
|   pendinghandler handler; | ||||
|   void *arg; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										104
									
								
								libgloss/sparc_leon/asm-leon/jiffies.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								libgloss/sparc_leon/asm-leon/jiffies.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _LINUX_JIFFIES_H | ||||
| #define _LINUX_JIFFIES_H | ||||
|  | ||||
| #include <asm-leon/types.h> | ||||
| #include <asm-leon/clock.h> | ||||
| #include <asm-leon/linkage.h> | ||||
|  | ||||
| /* Suppose we want to devide two numbers NOM and DEN: NOM/DEN, the we can | ||||
|  * improve accuracy by shifting LSH bits, hence calculating: | ||||
|  *     (NOM << LSH) / DEN | ||||
|  * This however means trouble for large NOM, because (NOM << LSH) may no | ||||
|  * longer fit in 32 bits. The following way of calculating this gives us | ||||
|  * some slack, under the following conditions: | ||||
|  *   - (NOM / DEN) fits in (32 - LSH) bits. | ||||
|  *   - (NOM % DEN) fits in (32 - LSH) bits. | ||||
|  */ | ||||
| #define SH_DIV(NOM,DEN,LSH) (   ((NOM / DEN) << LSH)                    \ | ||||
|                              + (((NOM % DEN) << LSH) + DEN / 2) / DEN) | ||||
|  | ||||
| /* TICK_NSEC is the time between ticks in nsec assuming real ACTHZ */ | ||||
| #define TICK_NSEC (SH_DIV (1000000UL * 1000, (HZ<<8), 8)) | ||||
|  | ||||
| /* | ||||
|  * The 64-bit value is not volatile - you MUST NOT read it | ||||
|  * without sampling the sequence number in xtime_lock. | ||||
|  */ | ||||
| extern u64 jiffies_64; | ||||
| extern struct timespec xtime __attribute__ ((aligned (16))); | ||||
| #define jiffies (*((unsigned long *)(((unsigned long)(&jiffies_64))+4))) | ||||
|  | ||||
| /* | ||||
|  *	These inlines deal with timer wrapping correctly. You are  | ||||
|  *	strongly encouraged to use them | ||||
|  *	1. Because people otherwise forget | ||||
|  *	2. Because if the timer wrap changes in future you won't have to | ||||
|  *	   alter your driver code. | ||||
|  * | ||||
|  * time_after(a,b) returns true if the time a is after time b. | ||||
|  * | ||||
|  * Do this with "<0" and ">=0" to only test the sign of the result. A | ||||
|  * good compiler would generate better code (and a really good compiler | ||||
|  * wouldn't care). Gcc is currently neither. | ||||
|  */ | ||||
| #define time_after(a,b)		\ | ||||
| 	(typecheck(unsigned long, a) && \ | ||||
| 	 typecheck(unsigned long, b) && \ | ||||
| 	 ((long)(b) - (long)(a) < 0)) | ||||
| #define time_before(a,b)	time_after(b,a) | ||||
|  | ||||
| #define time_after_eq(a,b)	\ | ||||
| 	(typecheck(unsigned long, a) && \ | ||||
| 	 typecheck(unsigned long, b) && \ | ||||
| 	 ((long)(a) - (long)(b) >= 0)) | ||||
| #define time_before_eq(a,b)	time_after_eq(b,a) | ||||
|  | ||||
| /* | ||||
|  * Have the 32 bit jiffies value wrap 5 minutes after boot | ||||
|  * so jiffies wrap bugs show up earlier. | ||||
|  */ | ||||
| #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ)) | ||||
|  | ||||
| static inline void | ||||
| set_normalized_timespec (struct timespec *ts, time_t sec, long nsec) | ||||
| { | ||||
|   while (nsec > NSEC_PER_SEC) | ||||
|     { | ||||
|       nsec -= NSEC_PER_SEC; | ||||
|       ++sec; | ||||
|     } | ||||
|   while (nsec < 0) | ||||
|     { | ||||
|       nsec += NSEC_PER_SEC; | ||||
|       --sec; | ||||
|     } | ||||
|   ts->tv_sec = sec; | ||||
|   ts->tv_nsec = nsec; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										177
									
								
								libgloss/sparc_leon/asm-leon/lambapp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								libgloss/sparc_leon/asm-leon/lambapp.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _LAMBAPP_H | ||||
| #define _LAMBAPP_H | ||||
|  | ||||
|  | ||||
| /* Include VENDOR and DEVICE definitions */ | ||||
| #include "lambapp_devs.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
|   struct ambapp_dev_hdr; | ||||
|   struct ambapp_apb_info; | ||||
|   struct ambapp_ahb_info; | ||||
|  | ||||
|   struct ambapp_dev_hdr | ||||
|   { | ||||
|     struct ambapp_dev_hdr *next;	/* Next */ | ||||
|     struct ambapp_dev_hdr *prev;	/* Previous Device. If (this == prev->child) prev is bus bridge */ | ||||
|     struct ambapp_dev_hdr *children;	/* Points to first device on sub-bus */ | ||||
|     void *owner;		/* Owner of this AMBA device */ | ||||
|     unsigned char dev_type;	/* AHB MST, AHB SLV or APB SLV */ | ||||
|     unsigned char vendor;	/* Vendor ID */ | ||||
|     unsigned short device;	/* Device ID */ | ||||
|     void *devinfo;		/* Device info (APB or AHB depending on type) */ | ||||
|   }; | ||||
|  | ||||
| #define AMBAPP_FLAG_FFACT_DIR	0x100	/* Frequency factor direction, 0=down, 1=up */ | ||||
| #define AMBAPP_FLAG_FFACT	0x0f0	/* Frequency factor against top bus */ | ||||
| #define AMBAPP_FLAG_MBUS	0x00c | ||||
| #define AMBAPP_FLAG_SBUS	0x003 | ||||
|  | ||||
|   struct ambapp_apb_info | ||||
|   { | ||||
|     /* COMMON */ | ||||
|     unsigned char irq; | ||||
|     unsigned char ver; | ||||
|  | ||||
|     /* APB SPECIFIC */ | ||||
|     unsigned int start; | ||||
|     unsigned int mask; | ||||
|   }; | ||||
|  | ||||
|   struct ambapp_ahb_info | ||||
|   { | ||||
|     /* COMMON */ | ||||
|     unsigned char irq; | ||||
|     unsigned char ver; | ||||
|  | ||||
|     /* AHB SPECIFIC */ | ||||
|     unsigned int start[4]; | ||||
|     unsigned int mask[4]; | ||||
|     char type[4];		/* type[N] Determine type of start[N]-mask[N], 2=AHB Memory Space, 3=AHB I/O Space */ | ||||
|     unsigned int custom[3]; | ||||
|   }; | ||||
|  | ||||
| /* Describes a complete AMBA Core. Each device may consist of 3 interfaces */ | ||||
|   struct ambapp_dev_info | ||||
|   { | ||||
|     char irq;			/* irq=-1 indicate no IRQ */ | ||||
|     unsigned char vendor; | ||||
|     unsigned short device; | ||||
|     int index;			/* Core index if multiple "subcores" in one */ | ||||
|     struct ambapp_ahb_info *ahb_mst; | ||||
|     struct ambapp_ahb_info *ahb_slv; | ||||
|     struct ambapp_apb_info *apb_slv; | ||||
|   }; | ||||
|  | ||||
|   struct ambapp_mmap | ||||
|   { | ||||
|     unsigned int size; | ||||
|     unsigned int local_adr; | ||||
|     unsigned int remote_adr; | ||||
|   }; | ||||
|  | ||||
| /* Complete AMBA PnP information */ | ||||
|   struct ambapp_bus | ||||
|   { | ||||
|     struct ambapp_mmap *mmaps; | ||||
|     struct ambapp_dev_hdr *root; | ||||
|   }; | ||||
|  | ||||
| /*  | ||||
|  * Return values | ||||
|  *  0 - continue | ||||
|  *  1 - stop scanning | ||||
|  */ | ||||
|   typedef int (*ambapp_func_t) (struct ambapp_dev_hdr * dev, int index, | ||||
| 				int maxdepth, void *arg); | ||||
|  | ||||
| #define DEV_IS_FREE(dev) (dev->owner == NULL) | ||||
| #define DEV_IS_ALLOCATED(dev) (dev->owner != NULL) | ||||
|  | ||||
| /* Options to ambapp_for_each */ | ||||
| #define OPTIONS_AHB_MSTS	0x00000001 | ||||
| #define OPTIONS_AHB_SLVS	0x00000002 | ||||
| #define OPTIONS_APB_SLVS	0x00000004 | ||||
| #define OPTIONS_ALL_DEVS	(OPTIONS_AHB_MSTS|OPTIONS_AHB_SLVS|OPTIONS_APB_SLVS) | ||||
|  | ||||
| #define OPTIONS_FREE		0x00000010 | ||||
| #define OPTIONS_ALLOCATED	0x00000020 | ||||
| #define OPTIONS_ALL		(OPTIONS_FREE|OPTIONS_ALLOCATED) | ||||
|  | ||||
| /* Depth first search, Defualt is breth first search. */ | ||||
| #define OPTIONS_DEPTH_FIRST	0x00000100 | ||||
|  | ||||
| #define DEV_AHB_NONE 0 | ||||
| #define DEV_AHB_MST  1 | ||||
| #define DEV_AHB_SLV  2 | ||||
| #define DEV_APB_SLV 3 | ||||
|  | ||||
| /* Structures used to access Plug&Play information directly */ | ||||
|   struct ambapp_pnp_ahb | ||||
|   { | ||||
|     const unsigned int id;	/* VENDOR, DEVICE, VER, IRQ, */ | ||||
|     const unsigned int custom[3]; | ||||
|     const unsigned int mbar[4];	/* MASK, ADDRESS, TYPE, CACHABLE/PREFETCHABLE */ | ||||
|   }; | ||||
|  | ||||
|   struct ambapp_pnp_apb | ||||
|   { | ||||
|     const unsigned int id;	/* VENDOR, DEVICE, VER, IRQ, */ | ||||
|     const unsigned int iobar;	/* MASK, ADDRESS, TYPE, CACHABLE/PREFETCHABLE */ | ||||
|   }; | ||||
|  | ||||
| #define ambapp_pnp_vendor(id) (((id) >> 24) & 0xff) | ||||
| #define ambapp_pnp_device(id) (((id) >> 12) & 0xfff) | ||||
| #define ambapp_pnp_ver(id) (((id)>>5) & 0x1f) | ||||
| #define ambapp_pnp_irq(id) ((id) & 0x1f) | ||||
|  | ||||
| #define ambapp_pnp_start(mbar)  (((mbar) & 0xfff00000) & (((mbar) & 0xfff0) << 16)) | ||||
| #define ambapp_pnp_mbar_mask(mbar) (((mbar)>>4) & 0xfff) | ||||
| #define ambapp_pnp_mbar_type(mbar) ((mbar) & 0xf) | ||||
|  | ||||
| #define ambapp_pnp_apb_start(iobar, base) ((base) | ((((iobar) & 0xfff00000)>>12) & (((iobar) & 0xfff0)<<4)) ) | ||||
| #define ambapp_pnp_apb_mask(iobar) ((~(ambapp_pnp_mbar_mask(iobar)<<8) & 0x000fffff) + 1) | ||||
|  | ||||
| #define AMBA_TYPE_AHBIO_ADDR(addr,base_ioarea) ((unsigned int)(base_ioarea) | ((addr) >> 12)) | ||||
|  | ||||
| #define AMBA_TYPE_APBIO 0x1 | ||||
| #define AMBA_TYPE_MEM   0x2 | ||||
| #define AMBA_TYPE_AHBIO 0x3 | ||||
|  | ||||
|   extern int find_apbslv (int vendor, int device, | ||||
| 			  struct ambapp_apb_info *dev); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										242
									
								
								libgloss/sparc_leon/asm-leon/lambapp_devs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								libgloss/sparc_leon/asm-leon/lambapp_devs.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,242 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __AMBAPP_DEVS_H__ | ||||
| #define __AMBAPP_DEVS_H__ | ||||
|  | ||||
| /* Vendor codes */ | ||||
| #define VENDOR_GAISLER       1 | ||||
| #define VENDOR_PENDER        2 | ||||
| #define VENDOR_ESA           4 | ||||
| #define VENDOR_ASTRIUM       6 | ||||
| #define VENDOR_OPENCHIP      7 | ||||
| #define VENDOR_OPENCORES     8 | ||||
| #define VENDOR_CONTRIB       9 | ||||
| #define VENDOR_EONIC         11 | ||||
| #define VENDOR_RADIONOR      15 | ||||
| #define VENDOR_GLEICHMANN    16 | ||||
| #define VENDOR_MENTA         17 | ||||
| #define VENDOR_SUN           19 | ||||
| #define VENDOR_MOVIDIA       20 | ||||
| #define VENDOR_ORBITA        23 | ||||
| #define VENDOR_SYNOPSYS      33 | ||||
| #define VENDOR_NASA          34 | ||||
| #define VENDOR_ACTEL         172 | ||||
| #define VENDOR_CAL           202 | ||||
| #define VENDOR_EMBEDDIT      234 | ||||
| #define VENDOR_CETON         203 | ||||
|  | ||||
| /* Gaisler Research device id's */ | ||||
| #define GAISLER_LEON2DSU     0x002 | ||||
| #define GAISLER_LEON3        0x003 | ||||
| #define GAISLER_LEON3DSU     0x004 | ||||
| #define GAISLER_ETHAHB       0x005 | ||||
| #define GAISLER_APBMST       0x006 | ||||
| #define GAISLER_AHBUART      0x007 | ||||
| #define GAISLER_SRCTRL       0x008 | ||||
| #define GAISLER_SDCTRL       0x009 | ||||
| #define GAISLER_SSRCTRL      0x00a | ||||
| #define GAISLER_APBUART      0x00c | ||||
| #define GAISLER_IRQMP        0x00d | ||||
| #define GAISLER_AHBRAM       0x00e | ||||
| #define GAISLER_AHBDPRAM     0x00f | ||||
| #define GAISLER_GPTIMER      0x011 | ||||
| #define GAISLER_PCITRG       0x012 | ||||
| #define GAISLER_PCISBRG      0x013 | ||||
| #define GAISLER_PCIFBRG      0x014 | ||||
| #define GAISLER_PCITRACE     0x015 | ||||
| #define GAISLER_DMACTRL      0x016 | ||||
| #define GAISLER_AHBTRACE     0x017 | ||||
| #define GAISLER_DSUCTRL      0x018 | ||||
| #define GAISLER_CANAHB       0x019 | ||||
| #define GAISLER_GPIO         0x01a | ||||
| #define GAISLER_AHBROM       0x01b | ||||
| #define GAISLER_AHBJTAG      0x01c | ||||
| #define GAISLER_ETHMAC       0x01d | ||||
| #define GAISLER_SWNODE       0x01e | ||||
| #define GAISLER_SPW          0x01f | ||||
| #define GAISLER_AHB2AHB      0x020 | ||||
| #define GAISLER_USBDC        0x021 | ||||
| #define GAISLER_USB_DCL      0x022 | ||||
| #define GAISLER_DDRMP        0x023 | ||||
| #define GAISLER_ATACTRL      0x024 | ||||
| #define GAISLER_DDRSP        0x025 | ||||
| #define GAISLER_EHCI         0x026 | ||||
| #define GAISLER_UHCI         0x027 | ||||
| #define GAISLER_I2CMST       0x028 | ||||
| #define GAISLER_SPW2         0x029 | ||||
| #define GAISLER_AHBDMA       0x02a | ||||
| #define GAISLER_NUHOSP3      0x02b | ||||
| #define GAISLER_CLKGATE      0x02c | ||||
| #define GAISLER_SPICTRL      0x02d | ||||
| #define GAISLER_DDR2SP       0x02e | ||||
| #define GAISLER_SLINK        0x02f | ||||
| #define GAISLER_GRTM         0x030 | ||||
| #define GAISLER_GRTC         0x031 | ||||
| #define GAISLER_GRPW         0x032 | ||||
| #define GAISLER_GRCTM        0x033 | ||||
| #define GAISLER_GRHCAN       0x034 | ||||
| #define GAISLER_GRFIFO       0x035 | ||||
| #define GAISLER_GRADCDAC     0x036 | ||||
| #define GAISLER_GRPULSE      0x037 | ||||
| #define GAISLER_GRTIMER      0x038 | ||||
| #define GAISLER_AHB2PP       0x039 | ||||
| #define GAISLER_GRVERSION    0x03a | ||||
| #define GAISLER_APB2PW       0x03b | ||||
| #define GAISLER_PW2APB       0x03c | ||||
| #define GAISLER_GRCAN        0x03d | ||||
| #define GAISLER_I2CSLV       0x03e | ||||
| #define GAISLER_U16550       0x03f | ||||
| #define GAISLER_AHBMST_EM    0x040 | ||||
| #define GAISLER_AHBSLV_EM    0x041 | ||||
| #define GAISLER_GRTESTMOD    0x042 | ||||
| #define GAISLER_ASCS         0x043 | ||||
| #define GAISLER_IPMVBCTRL    0x044 | ||||
| #define GAISLER_SPIMCTRL     0x045 | ||||
| #define GAISLER_LEON4        0x048 | ||||
| #define GAISLER_LEON4DSU     0x049 | ||||
| #define GAISLER_GRPWM        0x04A | ||||
| #define GAISLER_FTAHBRAM     0x050 | ||||
| #define GAISLER_FTSRCTRL     0x051 | ||||
| #define GAISLER_AHBSTAT      0x052 | ||||
| #define GAISLER_LEON3FT      0x053 | ||||
| #define GAISLER_FTMCTRL      0x054 | ||||
| #define GAISLER_FTSDCTRL     0x055 | ||||
| #define GAISLER_FTSRCTRL8    0x056 | ||||
| #define GAISLER_APBPS2       0x060 | ||||
| #define GAISLER_VGACTRL      0x061 | ||||
| #define GAISLER_LOGAN        0x062 | ||||
| #define GAISLER_SVGACTRL     0x063 | ||||
| #define GAISLER_T1AHB        0x064 | ||||
| #define GAISLER_MP7WRAP      0x065 | ||||
| #define GAISLER_GRSYSMON     0x066 | ||||
| #define GAISLER_GRACECTRL    0x067 | ||||
| #define GAISLER_B1553BC      0x070 | ||||
| #define GAISLER_B1553RT      0x071 | ||||
| #define GAISLER_B1553BRM     0x072 | ||||
| #define GAISLER_SATCAN       0x080 | ||||
| #define GAISLER_CANMUX       0x081 | ||||
| #define GAISLER_GRTMRX       0x082 | ||||
| #define GAISLER_GRTCTX       0x083 | ||||
| #define GAISLER_GRTMDESC     0x084 | ||||
| #define GAISLER_GRTMVC       0x085 | ||||
| #define GAISLER_GEFFE        0x086 | ||||
| #define GAISLER_AES          0x073 | ||||
| #define GAISLER_ECC          0x074 | ||||
| #define GAISLER_PCIF         0x075 | ||||
| #define GAISLER_CLKMOD       0x076 | ||||
| #define GAISLER_HAPSTRAK     0x077 | ||||
| #define GAISLER_TEST_1X2     0x078 | ||||
| #define GAISLER_WILD2AHB     0x079 | ||||
| #define GAISLER_BIO1         0x07a | ||||
|  | ||||
| #define GAISLER_PIPEWRAPPER  0xffa | ||||
| #define GAISLER_L2TIME       0xffd	/* internal device: leon2 timer */ | ||||
| #define GAISLER_L2C          0xffe	/* internal device: leon2compat */ | ||||
| #define GAISLER_PLUGPLAY     0xfff	/* internal device: plug & play configarea */ | ||||
|  | ||||
| /* European Space Agency device id's */ | ||||
| #define ESA_LEON2            0x002 | ||||
| #define ESA_LEON2APB         0x003 | ||||
| #define ESA_IRQ              0x005 | ||||
| #define ESA_TIMER            0x006 | ||||
| #define ESA_UART             0x007 | ||||
| #define ESA_CFG              0x008 | ||||
| #define ESA_IO               0x009 | ||||
| #define ESA_MCTRL            0x00f | ||||
| #define ESA_PCIARB           0x010 | ||||
| #define ESA_HURRICANE        0x011 | ||||
| #define ESA_SPW_RMAP         0x012 | ||||
| #define ESA_SPW2             0x012 | ||||
| #define ESA_AHBUART          0x013 | ||||
| #define ESA_SPWA             0x014 | ||||
| #define ESA_BOSCHCAN         0x015 | ||||
| #define ESA_IRQ2             0x016 | ||||
| #define ESA_AHBSTAT          0x017 | ||||
| #define ESA_WPROT            0x018 | ||||
| #define ESA_WPROT2           0x019 | ||||
| #define ESA_PDEC3AMBA        0x020 | ||||
| #define ESA_PTME3AMBA        0x021 | ||||
|  | ||||
| #define OPENCHIP_APBGPIO     0x001 | ||||
| #define OPENCHIP_APBI2C      0x002 | ||||
| #define OPENCHIP_APBSPI      0x003 | ||||
| #define OPENCHIP_APBCHARLCD  0x004 | ||||
| #define OPENCHIP_APBPWM      0x005 | ||||
| #define OPENCHIP_APBPS2      0x006 | ||||
| #define OPENCHIP_APBMMCSD    0x007 | ||||
| #define OPENCHIP_APBNAND     0x008 | ||||
| #define OPENCHIP_APBLPC      0x009 | ||||
| #define OPENCHIP_APBCF       0x00a | ||||
| #define OPENCHIP_APBSYSACE   0x00b | ||||
| #define OPENCHIP_APB1WIRE    0x00c | ||||
| #define OPENCHIP_APBJTAG     0x00d | ||||
| #define OPENCHIP_APBSUI      0x00e | ||||
|  | ||||
|  | ||||
| #define CONTRIB_CORE1        0x001 | ||||
| #define CONTRIB_CORE2        0x002 | ||||
|  | ||||
| #define GLEICHMANN_CUSTOM    0x001 | ||||
| #define GLEICHMANN_GEOLCD01  0x002 | ||||
| #define GLEICHMANN_DAC       0x003 | ||||
| #define GLEICHMANN_HPI       0x004 | ||||
| #define GLEICHMANN_SPI       0x005 | ||||
| #define GLEICHMANN_HIFC      0x006 | ||||
| #define GLEICHMANN_ADCDAC    0x007 | ||||
| #define GLEICHMANN_SPIOC     0x008 | ||||
| #define GLEICHMANN_AC97      0x009 | ||||
|  | ||||
| #define SUN_T1               0x001 | ||||
| #define SUN_S1               0x011 | ||||
|  | ||||
| #define ORBITA_1553B         0x001 | ||||
| #define ORBITA_429           0x002 | ||||
| #define ORBITA_SPI           0x003 | ||||
| #define ORBITA_I2C           0x004 | ||||
| #define ORBITA_SMARTCARD     0x064 | ||||
| #define ORBITA_SDCARD        0x065 | ||||
| #define ORBITA_UART16550     0x066 | ||||
| #define ORBITA_CRYPTO        0x067 | ||||
| #define ORBITA_SYSIF         0x068 | ||||
| #define ORBITA_PIO           0x069 | ||||
| #define ORBITA_RTC           0x0c8 | ||||
| #define ORBITA_COLORLCD      0x12c | ||||
| #define ORBITA_PCI           0x190 | ||||
| #define ORBITA_DSP           0x1f4 | ||||
| #define ORBITA_USBHOST       0x258 | ||||
| #define ORBITA_USBDEV        0x2bc | ||||
|  | ||||
| #define NASA_EP32            0x001 | ||||
|  | ||||
| #define CAL_DDRCTRL          0x188 | ||||
|  | ||||
| #define ACTEL_COREMP7        0x001 | ||||
|  | ||||
| /* Opencores device id's */ | ||||
| #define OPENCORES_PCIBR  0x4 | ||||
| #define OPENCORES_ETHMAC 0x5 | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										370
									
								
								libgloss/sparc_leon/asm-leon/leon.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										370
									
								
								libgloss/sparc_leon/asm-leon/leon.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,370 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _INCLUDE_LEON_h | ||||
| #define _INCLUDE_LEON_h | ||||
|  | ||||
| #include <asm-leon/leon3.h> | ||||
| #include <asm-leon/amba.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
| /* psr defines */ | ||||
| #define SPARC_PSR_WIN_MASK  0x0000001f	/* bit   0-4 */ | ||||
| #define SPARC_PSR_ET_MASK   0x00000020	/* bit   5 */ | ||||
| #define SPARC_PSR_PS_MASK   0x00000040	/* bit   6 */ | ||||
| #define SPARC_PSR_S_MASK    0x00000080	/* bit   7 */ | ||||
| #define SPARC_PSR_PIL_MASK  0x00000F00	/* bits  8 - 11 */ | ||||
| #define SPARC_PSR_EF_MASK   0x00001000	/* bit  12 */ | ||||
| #define SPARC_PSR_EC_MASK   0x00002000	/* bit  13 */ | ||||
| #define SPARC_PSR_ICC_MASK  0x00F00000	/* bits 20 - 23 */ | ||||
| #define SPARC_PSR_VER_MASK  0x0F000000	/* bits 24 - 27 */ | ||||
| #define SPARC_PSR_IMPL_MASK 0xF0000000	/* bits 28 - 31 */ | ||||
| #define SPARC_PSR_PIL_SHIFT 8 | ||||
|  | ||||
| #define SPARC_NUM_REGWIN    _nwindows | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|   extern int _nwindows; | ||||
|   extern int _leon_version; | ||||
| #endif | ||||
|  | ||||
| #define LEON_VERSION _leon_version | ||||
|  | ||||
| /* | ||||
|  *  Interrupt Sources | ||||
|  * | ||||
|  *  The interrupt source numbers directly map to the trap type and to  | ||||
|  *  the bits used in the Interrupt Clear, Interrupt Force, Interrupt Mask, | ||||
|  *  and the Interrupt Pending Registers. | ||||
|  */ | ||||
|  | ||||
| #define LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR  1 | ||||
| #define LEON2_INTERRUPT_UART_2_RX_TX             2 | ||||
| #define LEON2_INTERRUPT_UART_1_RX_TX             3 | ||||
| #define LEON23_INTERRUPT_UART_2_RX_TX            leon23_irqs[1]	/*console.c */ | ||||
| #define LEON23_INTERRUPT_UART_1_RX_TX            leon23_irqs[0]	/*console.c */ | ||||
| #define LEON_INTERRUPT_EXTERNAL_0                4 | ||||
| #define LEON_INTERRUPT_EXTERNAL_1                5 | ||||
| #define LEON_INTERRUPT_EXTERNAL_2                6 | ||||
| #define LEON_INTERRUPT_EXTERNAL_3                7 | ||||
| #define LEON2_INTERRUPT_TIMER1                   8 | ||||
| #define LEON2_INTERRUPT_TIMER2                   9 | ||||
| #define LEON23_INTERRUPT_TIMER1                  leon23_timerirqs[0]	/* timer.c */ | ||||
| #define LEON23_INTERRUPT_TIMER2                  leon23_timerirqs[1]	/* timer.c */ | ||||
| #define LEON_INTERRUPT_EMPTY1                    10 | ||||
| #define LEON_INTERRUPT_EMPTY2                    11 | ||||
| #define LEON_INTERRUPT_EMPTY3                    12 | ||||
| #define LEON_INTERRUPT_EMPTY4                    13 | ||||
| #define LEON_INTERRUPT_EMPTY5                    14 | ||||
| #define LEON_INTERRUPT_EMPTY6                    15 | ||||
|  | ||||
| #ifndef  __ASSEMBLER__ | ||||
|  | ||||
| /* | ||||
|  *  Trap Types for on-chip peripherals | ||||
|  * | ||||
|  *  Source: Table 8 - Interrupt Trap Type and Default Priority Assignments | ||||
|  * | ||||
|  *  NOTE: The priority level for each source corresponds to the least  | ||||
|  *        significant nibble of the trap type. | ||||
|  */ | ||||
|  | ||||
| #define LEON_TRAP_TYPE( _source ) SPARC_ASYNCHRONOUS_TRAP((_source) + 0x10) | ||||
|  | ||||
| #define LEON_TRAP_SOURCE( _trap ) ((_trap) - 0x10) | ||||
|  | ||||
| #define LEON_INT_TRAP( _trap ) \ | ||||
|   ( (_trap) >= LEON_TRAP_TYPE( LEON_INTERRUPT_CORRECTABLE_MEMORY_ERROR ) && \ | ||||
|     (_trap) <= LEON_TRAP_TYPE( LEON_INTERRUPT_EMPTY6 ) ) | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in Memory Configuration Register 1. | ||||
|  */ | ||||
|  | ||||
| #define LEON_MEMORY_CONFIGURATION_PROM_SIZE_MASK  0x0003C000 | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in Memory Configuration Register 1. | ||||
|  */ | ||||
|  | ||||
| #define LEON_MEMORY_CONFIGURATION_RAM_SIZE_MASK  0x00001E00 | ||||
|  | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in the Timer Control Register. | ||||
|  */ | ||||
|  | ||||
| #define LEON_REG_TIMER_CONTROL_EN    0x00000001	/* 1 = enable counting */ | ||||
|   /* 0 = hold scalar and counter */ | ||||
| #define LEON_REG_TIMER_CONTROL_RL    0x00000002	/* 1 = reload at 0 */ | ||||
|   /* 0 = stop at 0 */ | ||||
| #define LEON_REG_TIMER_CONTROL_LD    0x00000004	/* 1 = load counter */ | ||||
|   /* 0 = no function */ | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in the UART Control Registers. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #define LEON_REG_UART_CONTROL_RTD  0x000000FF	/* RX/TX data */ | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in the LEON UART Status Registers. | ||||
|  */ | ||||
|  | ||||
| #define LEON_REG_UART_STATUS_DR   0x00000001	/* Data Ready */ | ||||
| #define LEON_REG_UART_STATUS_TSE  0x00000002	/* TX Send Register Empty */ | ||||
| #define LEON_REG_UART_STATUS_THE  0x00000004	/* TX Hold Register Empty */ | ||||
| #define LEON_REG_UART_STATUS_BR   0x00000008	/* Break Error */ | ||||
| #define LEON_REG_UART_STATUS_OE   0x00000010	/* RX Overrun Error */ | ||||
| #define LEON_REG_UART_STATUS_PE   0x00000020	/* RX Parity Error */ | ||||
| #define LEON_REG_UART_STATUS_FE   0x00000040	/* RX Framing Error */ | ||||
| #define LEON_REG_UART_STATUS_ERR  0x00000078	/* Error Mask */ | ||||
|  | ||||
|  | ||||
| /* | ||||
|  *  The following defines the bits in the LEON UART Status Registers. | ||||
|  */ | ||||
|  | ||||
| #define LEON_REG_UART_CTRL_RE     0x00000001	/* Receiver enable */ | ||||
| #define LEON_REG_UART_CTRL_TE     0x00000002	/* Transmitter enable */ | ||||
| #define LEON_REG_UART_CTRL_RI     0x00000004	/* Receiver interrupt enable */ | ||||
| #define LEON_REG_UART_CTRL_TI     0x00000008	/* Transmitter interrupt enable */ | ||||
| #define LEON_REG_UART_CTRL_PS     0x00000010	/* Parity select */ | ||||
| #define LEON_REG_UART_CTRL_PE     0x00000020	/* Parity enable */ | ||||
| #define LEON_REG_UART_CTRL_FL     0x00000040	/* Flow control enable */ | ||||
| #define LEON_REG_UART_CTRL_LB     0x00000080	/* Loop Back enable */ | ||||
|  | ||||
| /* leon2 asis */ | ||||
| #define ASI_LEON2_IFLUSH		0x05 | ||||
| #define ASI_LEON2_DFLUSH		0x06 | ||||
| #define ASI_LEON2_CACHEMISS             1 | ||||
|  | ||||
| /* leon3 asis */ | ||||
| #define ASI_LEON3_IFLUSH		0x10 | ||||
| #define ASI_LEON3_DFLUSH		0x11 | ||||
| #define ASI_LEON3_CACHEMISS             1 | ||||
| #define ASI_LEON3_SYSCTRL               0x02 | ||||
|  | ||||
| #define ASI_LEON23_ITAG		0x0c | ||||
| #define ASI_LEON23_DTAG		0x0e | ||||
|  | ||||
|  | ||||
| #ifndef  __ASSEMBLER__ | ||||
|  | ||||
|   unsigned int leonbare_leon23_loadnocache (unsigned int addr); | ||||
|   unsigned int leonbare_leon23_loadnocache16 (unsigned int addr); | ||||
|   unsigned int leonbare_leon23_loadnocache8 (unsigned int addr); | ||||
|   unsigned int leonbare_leon23_storenocache (unsigned int addr, | ||||
| 					     unsigned int value); | ||||
|   unsigned int leonbare_leon23_storenocache16 (unsigned int addr, | ||||
| 					       unsigned int value); | ||||
|   unsigned int leonbare_leon23_storenocache8 (unsigned int addr, | ||||
| 					      unsigned int value); | ||||
|  | ||||
|   unsigned int leonbare_leon3_loadnocache (unsigned int addr); | ||||
|   unsigned int leonbare_leon3_loadnocache16 (unsigned int addr); | ||||
|   unsigned int leonbare_leon3_loadnocache8 (unsigned int addr); | ||||
|  | ||||
|  | ||||
| /* | ||||
|  *  This is used to manipulate the on-chip registers. | ||||
|  * | ||||
|  *  The following symbol must be defined in the linkcmds file and point | ||||
|  *  to the correct location. | ||||
|  */ | ||||
|  | ||||
|   extern unsigned long *LEON23_IRQ_mask_addr;	/* in peripherals.h */ | ||||
|   extern unsigned long *LEON23_IRQ_force_addr;	/* in peripherals.h */ | ||||
|   extern unsigned long *LEON23_IRQ_pending_addr;	/* in peripherals.h */ | ||||
|   extern unsigned long *LEON23_IRQ_clear_addr;	/* in peripherals.h */ | ||||
|  | ||||
| /* | ||||
|  *  Macros to manipulate the Interrupt Clear, Interrupt Force, Interrupt Mask, | ||||
|  *  and the Interrupt Pending Registers. | ||||
|  * | ||||
|  *  NOTE: For operations which are not atomic, this code disables interrupts | ||||
|  *        to guarantee there are no intervening accesses to the same register. | ||||
|  *        The operations which read the register, modify the value and then | ||||
|  *        store the result back are vulnerable. | ||||
|  */ | ||||
|  | ||||
| #define LEON_Clear_interrupt( _source ) \ | ||||
|   do { \ | ||||
|     (*LEON23_IRQ_clear_addr) = (1 << (_source)); \ | ||||
|   } while (0) | ||||
|  | ||||
| #define LEON_Force_interrupt( _source ) \ | ||||
|   do { \ | ||||
|     (*LEON23_IRQ_force_addr) = (1 << (_source)); \ | ||||
|   } while (0) | ||||
|  | ||||
| #define LEON_Is_interrupt_masked( _source ) \ | ||||
|   ((*LEON23_IRQ_mask_addr) & (1 << (_source))) | ||||
|  | ||||
| #define LEON_Mask_interrupt( _source ) \ | ||||
|   do { \ | ||||
|     unsigned32 _level; \ | ||||
|     \ | ||||
|     _level = sparc_disable_interrupts(); \ | ||||
|       (*LEON23_IRQ_mask_addr) &= ~(1 << (_source)); \ | ||||
|     sparc_enable_interrupts( _level ); \ | ||||
|   } while (0) | ||||
|  | ||||
| #define LEON_Unmask_interrupt( _source ) \ | ||||
|   do { \ | ||||
|     unsigned32 _level; \ | ||||
|     \ | ||||
|     _level = sparc_disable_interrupts(); \ | ||||
|       (*LEON23_IRQ_mask_addr) |= (1 << (_source)); \ | ||||
|     sparc_enable_interrupts( _level ); \ | ||||
|   } while (0) | ||||
|  | ||||
| #define LEON_Disable_interrupt( _source, _previous ) \ | ||||
|   do { \ | ||||
|     unsigned32 _level; \ | ||||
|     unsigned32 _mask = 1 << (_source); \ | ||||
|     \ | ||||
|     _level = sparc_disable_interrupts(); \ | ||||
|       (_previous) = (*LEON23_IRQ_mask_addr); \ | ||||
|       (*LEON23_IRQ_mask_addr) = _previous & ~_mask; \ | ||||
|     sparc_enable_interrupts( _level ); \ | ||||
|     (_previous) &= _mask; \ | ||||
|   } while (0) | ||||
|  | ||||
| #define LEON_Restore_interrupt( _source, _previous ) \ | ||||
|   do { \ | ||||
|     unsigned32 _level; \ | ||||
|     unsigned32 _mask = 1 << (_source); \ | ||||
|     \ | ||||
|     _level = sparc_disable_interrupts(); \ | ||||
|       (*LEON23_IRQ_mask_addr) = \ | ||||
|         ((*LEON23_IRQ_mask_addr) & ~_mask) | (_previous); \ | ||||
|     sparc_enable_interrupts( _level ); \ | ||||
|   } while (0) | ||||
|  | ||||
| /* | ||||
|  *  Each timer control register is organized as follows: | ||||
|  * | ||||
|  *    D0 - Enable | ||||
|  *          1 = enable counting | ||||
|  *          0 = hold scaler and counter | ||||
|  * | ||||
|  *    D1 - Counter Reload | ||||
|  *          1 = reload counter at zero and restart | ||||
|  *          0 = stop counter at zero | ||||
|  * | ||||
|  *    D2 - Counter Load | ||||
|  *          1 = load counter with preset value  | ||||
|  *          0 = no function | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #define LEON_REG_TIMER_COUNTER_IRQEN              0x00000008 | ||||
|  | ||||
| #define LEON_REG_TIMER_COUNTER_RELOAD_AT_ZERO     0x00000002 | ||||
| #define LEON_REG_TIMER_COUNTER_STOP_AT_ZERO       0x00000000 | ||||
|  | ||||
| #define LEON_REG_TIMER_COUNTER_LOAD_COUNTER       0x00000004 | ||||
|  | ||||
| #define LEON_REG_TIMER_COUNTER_ENABLE_COUNTING    0x00000001 | ||||
| #define LEON_REG_TIMER_COUNTER_DISABLE_COUNTING   0x00000000 | ||||
|  | ||||
| #define LEON_REG_TIMER_COUNTER_RELOAD_MASK        0x00000002 | ||||
| #define LEON_REG_TIMER_COUNTER_ENABLE_MASK        0x00000001 | ||||
|  | ||||
| #define LEON_REG_TIMER_COUNTER_DEFINED_MASK       0x00000003 | ||||
| #define LEON_REG_TIMER_COUNTER_CURRENT_MODE_MASK  0x00000003 | ||||
|  | ||||
| /* console.c */ | ||||
|   int lo_sprintf (char *buf, const char *fmt, ...); | ||||
|  | ||||
| /* do a virtual address read without cache */ | ||||
|   static __inline__ unsigned long leon23_getpsr () | ||||
|   { | ||||
|     unsigned long retval; | ||||
|     __asm__ __volatile__ ("mov %%psr, %0\n\t":"=r" (retval):); | ||||
|       return retval; | ||||
|   } | ||||
|  | ||||
|   extern __inline__ void sparc_leon2_dcache_flush (void) | ||||
|   { | ||||
|     __asm__ | ||||
|       __volatile__ ("sta %%g0, [%%g0] %0\n\t"::"i" | ||||
| 		    (ASI_LEON2_IFLUSH):"memory"); | ||||
|     __asm__ | ||||
|       __volatile__ ("sta %%g0, [%%g0] %0\n\t"::"i" | ||||
| 		    (ASI_LEON2_DFLUSH):"memory"); | ||||
|   }; | ||||
|  | ||||
|  | ||||
|   extern __inline__ void sparc_leon_dcache_flush (void) | ||||
|   { | ||||
|     switch (sparc_leon23_get_psr_version ()) | ||||
|       { | ||||
|       case 0: | ||||
|       case 2: | ||||
| 	sparc_leon2_dcache_flush (); | ||||
| 	break; | ||||
|       default: | ||||
| 	sparc_leon3_dcache_flush (); | ||||
| 	break; | ||||
|       } | ||||
|   } | ||||
|  | ||||
|   extern int lolevelirqinstall (int irqnr, void (*handler) ()); | ||||
|   extern unsigned long locore_readtbr (); | ||||
|   extern void _leonbase_Stop (); | ||||
|  | ||||
|   extern void uninstall_winoverflow_hook (); | ||||
|   extern int install_winoverflow_hook (void (*func) (void)); | ||||
|  | ||||
|   extern void sparc_leon23_icache_flush (); | ||||
|   extern void sparc_leon23_dcache_flush (); | ||||
|  | ||||
| #endif /* ! __ASSEMBLER__ */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #define TACODE_IRQCALL    2 | ||||
| #define TACODE_IRQCALL_FLUSH 6 | ||||
|  | ||||
| #define TACODE_FLUSH      3 | ||||
| #define TACODE_IRQCALLDIS 5 | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif /* !_INCLUDE_LEON_h */ | ||||
| /* end of include file */ | ||||
							
								
								
									
										107
									
								
								libgloss/sparc_leon/asm-leon/leon3.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								libgloss/sparc_leon/asm-leon/leon3.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _INCLUDE_LEON3_h | ||||
| #define _INCLUDE_LEON3_h | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
| #define ASI_LEON3_CACHEMISS 1 | ||||
| #define ASI_LEON3_SYSCTRL   0x02 | ||||
| #define ASI_LEON3_DFLUSH    0x11 | ||||
|  | ||||
| #define ASI_LEON3_SYSCTRL_ICFG		0x08 | ||||
| #define ASI_LEON3_SYSCTRL_DCFG		0x0c | ||||
| #define ASI_LEON3_SYSCTRL_CFG_SNOOPING (1<<27) | ||||
| #define ASI_LEON3_SYSCTRL_CFG_SSIZE(c) (1<<((c>>20)&0xf)) | ||||
|  | ||||
|  | ||||
|   extern __inline__ unsigned long sparc_leon23_get_psr (void) | ||||
|   { | ||||
|     unsigned int retval; | ||||
|     __asm__ __volatile__ ("rd %%psr, %0\n\t":"=r" (retval):); | ||||
|       return (retval); | ||||
|   } | ||||
|  | ||||
|   extern __inline__ unsigned long sparc_leon23_get_psr_version (void) | ||||
|   { | ||||
|     unsigned int psr = sparc_leon23_get_psr (); | ||||
|     return (psr >> 24) & 0xf; | ||||
|   } | ||||
| #define LEON_ISLEON2 (sparc_leon23_get_psr_version() == 2 || sparc_leon23_get_psr_version() == 0) | ||||
| #define LEON_ISLEON3 (sparc_leon23_get_psr_version() == 3) | ||||
|  | ||||
|   extern __inline__ unsigned long sparc_leon3_get_dcachecfg (void) | ||||
|   { | ||||
|     unsigned int retval; | ||||
|     __asm__ | ||||
|       __volatile__ ("lda [%1] %2, %0\n\t":"=r" (retval):"r" | ||||
| 		    (ASI_LEON3_SYSCTRL_DCFG), "i" (ASI_LEON3_SYSCTRL)); | ||||
|     return (retval); | ||||
|   } | ||||
|  | ||||
|   extern __inline__ void sparc_leon3_enable_snooping (void) | ||||
|   { | ||||
|     /*enable snooping */ | ||||
|     __asm__ volatile ("lda [%%g0] 2, %%l1\n\t" | ||||
| 		      "set 0x800000, %%l2\n\t" | ||||
| 		      "or  %%l2, %%l1, %%l2\n\t" | ||||
| 		      "sta %%l2, [%%g0] 2\n\t":::"l1", "l2"); | ||||
|   }; | ||||
|  | ||||
|   extern __inline__ void sparc_leon3_disable_cache (void) | ||||
|   { | ||||
|     /*asi 2 */ | ||||
|     __asm__ volatile ("lda [%%g0] 2, %%l1\n\t" | ||||
| 		      "set 0x00000f, %%l2\n\t" | ||||
| 		      "andn  %%l2, %%l1, %%l2\n\t" | ||||
| 		      "sta %%l2, [%%g0] 2\n\t":::"l1", "l2"); | ||||
|   }; | ||||
|  | ||||
|  | ||||
|  | ||||
|   extern __inline__ void sparc_leon3_dcache_flush (void) | ||||
|   { | ||||
|     __asm__ __volatile__ (" flush ");	//iflush  | ||||
|     __asm__ | ||||
|       __volatile__ ("sta %%g0, [%%g0] %0\n\t"::"i" | ||||
| 		    (ASI_LEON3_DFLUSH):"memory"); | ||||
|   }; | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* !ASM */ | ||||
|  | ||||
|  | ||||
| #endif /* !_INCLUDE_LEON3_h */ | ||||
| /* end of include file */ | ||||
							
								
								
									
										125
									
								
								libgloss/sparc_leon/asm-leon/leonbare_debug.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								libgloss/sparc_leon/asm-leon/leonbare_debug.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __LEONBARE_KERNEL_DEBUG_H__ | ||||
| #define __LEONBARE_KERNEL_DEBUG_H__ | ||||
|  | ||||
| #include <asm-leon/leondbg.h> | ||||
|  | ||||
| /* | ||||
|   #define LBDEBUG_DO_DEBUG | ||||
|   #define LBDEBUG_DO_ASSERT | ||||
| */ | ||||
|  | ||||
| #define LBDEBUG_ALWAYS_NR  (1<<0) | ||||
| #define LBDEBUG_ASSERT_NR  (1<<1) | ||||
| #define LBDEBUG_FNCALL_NR  (1<<2) | ||||
| #define LBDEBUG_FNEXIT_NR  (1<<3) | ||||
| #define LBDEBUG_SCHED_NR   (1<<4) | ||||
| #define LBDEBUG_QUEUE_NR   (1<<5) | ||||
| #define LBDEBUG_THREAD_NR  (1<<6) | ||||
|  | ||||
| #define LBDEBUG_PRINTF dbgleon_printf	/*leonbare_debug_printf */ | ||||
|  | ||||
| #ifdef LBDEBUG_DO_DEBUG | ||||
| #ifndef __ASSEMBLER__ | ||||
| extern int leonbare_debug; | ||||
| #endif | ||||
| # define PDEBUG_FLAGS_CHECK(c) ((c)&leonbare_debug) | ||||
| # define PDEBUG_FLAGS_SET(c) leonbare_debug |= c | ||||
| #else | ||||
| # define PDEBUG_FLAGS_CHECK(c) 0 | ||||
| # define PDEBUG_FLAGS_SET(c) | ||||
| #endif | ||||
|  | ||||
| #ifdef LBDEBUG_DO_DEBUG | ||||
| # define LBDEBUG(x, fmt, args...) do { if (PDEBUG_FLAGS_CHECK(x)) { LBDEBUG_PRINTF(fmt,args); } } while(0) | ||||
| #else | ||||
| # define LBDEBUG(x, fmt, args...) | ||||
| #endif | ||||
|  | ||||
| #ifdef LBDEBUG_DO_ASSERT | ||||
| # define LBPASSERT(x, fmt, args...) if (!(x)) { LBDEBUG_PRINTF(fmt,args); while(1); } | ||||
| #else | ||||
| # define LBPASSERT(x, fmt, args...) | ||||
| #endif | ||||
|  | ||||
| #ifndef LBDEBUG___FUNCTION__ | ||||
| #define LBDEBUG___FUNCTION__ __FUNCTION__ | ||||
| #endif | ||||
|  | ||||
| #ifndef LBDEBUG___FUNCTION_WIDTH__ | ||||
| #define LBDEBUG___FUNCTION_WIDTH__ "28" | ||||
| #endif | ||||
|  | ||||
| #ifdef LBDEBUG_DO_FILE | ||||
| #ifndef LBDEBUG___FILE__ | ||||
| #define LBDEBUG___FILE__ __FILE__ | ||||
| #endif | ||||
| #ifndef LBDEBUG___FILE_WIDTH__ | ||||
| #define LBDEBUG___FILE_WIDTH__ "28" | ||||
| #endif | ||||
| #define LBDEBUG___FILE_APPEND     ,__FILE__ | ||||
| #define LBDEBUG___FILE_FMT_APPEND ":%" LBDEBUG___FILE_WIDTH__ "s" | ||||
| #else | ||||
| #define LBDEBUG___FILE_APPEND | ||||
| #define LBDEBUG___FILE_FMT_APPEND | ||||
| #endif | ||||
|  | ||||
| #ifdef LBDEBUG_DO_DEBUG | ||||
| # define LBDEBUG_HEADER(code)                                                   \ | ||||
|   if (PDEBUG_FLAGS_CHECK(code)) {                                               \ | ||||
|     register unsigned int _GETSP asm("sp");                                     \ | ||||
|     LBDEBUG_PRINTF("[sp:%08x self(%08x):", _GETSP, LEONBARE_KR_CURRENT);        \ | ||||
|     LBDEBUG_PRINTF("%10s",LEONBARE_TH_NAME_DBG(LEONBARE_KR_CURRENT));           \ | ||||
|     LBDEBUG_PRINTF(" %03d @ %" LBDEBUG___FUNCTION_WIDTH__ "s()" LBDEBUG___FILE_FMT_APPEND "]:" , __LINE__,LBDEBUG___FUNCTION__ LBDEBUG___FILE_APPEND); \ | ||||
|   } | ||||
|  | ||||
| # define LBDEBUG_HEADER_PRINTF(code,fmt,args...)                                \ | ||||
|   if (PDEBUG_FLAGS_CHECK(code)) {                                               \ | ||||
|     LBDEBUG_HEADER(code);                                                       \ | ||||
|     LBDEBUG_PRINTF(fmt,args);                                                   \ | ||||
|   } | ||||
|  | ||||
| # define LBDEBUG_CODE_PRINTF(code,fmt,args...)                                  \ | ||||
|   if (PDEBUG_FLAGS_CHECK(code)) {                                               \ | ||||
|     LBDEBUG_PRINTF(fmt,args);                                                   \ | ||||
|   } | ||||
| #else | ||||
| # define LBDEBUG_HEADER(code) | ||||
| # define LBDEBUG_HEADER_PRINTF(code,fmt,args...) | ||||
| # define LBDEBUG_CODE_PRINTF(code,fmt,args...) | ||||
| #endif | ||||
|  | ||||
| #define LBDEBUG_FNCALL LBDEBUG_HEADER_PRINTF(LBDEBUG_FNCALL_NR,"enter\n",0) | ||||
| #define LBDEBUG_FNEXIT LBDEBUG_HEADER_PRINTF(LBDEBUG_FNEXIT_NR,"exit\n",0) | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| int leonbare_debug_printf (const char *fmt, ...); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										438
									
								
								libgloss/sparc_leon/asm-leon/leonbare_kernel.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										438
									
								
								libgloss/sparc_leon/asm-leon/leonbare_kernel.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,438 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __LEONBARE_KERNEL_H__ | ||||
| #define __LEONBARE_KERNEL_H__ | ||||
|  | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/leon.h> | ||||
| #ifndef __ASSEMBLER__ | ||||
| #include <asm-leon/leonbare_kernel_queue.h> | ||||
| #include <reent.h> | ||||
| #endif | ||||
| #include "irq.h" | ||||
|  | ||||
| #define LEONBARE_RUNQ_READY_NR      (2)	/* queue 0-1 for ready */ | ||||
| #define LEONBARE_RUNQ_SUSPENDED_IDX (2)	/* queue 2   for suspended */ | ||||
| #define LEONBARE_RUNQ_PREPARE_IDX   (3)	/* LEONBARE_RUNQ_READY_NR times queues */ | ||||
| #define LEONBARE_RUNQ_KILLED_IDX    (LEONBARE_RUNQ_PREPARE_IDX+LEONBARE_RUNQ_READY_NR)	/* queue 2   for killed threads */ | ||||
| #define LEONBARE_RUNQ_NR            (LEONBARE_RUNQ_KILLED_IDX+1) | ||||
|  | ||||
| #define LEONBARE_RUNQ_ISREADY(idx)   ((idx) >= 0 && (idx) < LEONBARE_RUNQ_READY_NR) | ||||
| #define LEONBARE_RUNQ_ISPREPARE(idx) ((idx) >= LEONBARE_RUNQ_PREPARE_IDX && (idx) < LEONBARE_RUNQ_PREPARE_IDX+LEONBARE_RUNQ_READY_NR) | ||||
| #define LEONBARE_RUNQ_ISSUSPEND(idx) ((idx) == LEONBARE_RUNQ_SUSPENDED_IDX) | ||||
| #define LEONBARE_RUNQ_ISKILLED(idx)  ((idx) == LEONBARE_RUNQ_KILLED_IDX) | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| #ifndef NULL | ||||
| #define NULL ((void *)0) | ||||
| #endif | ||||
|  | ||||
| #define MACRO_BEGIN     do { | ||||
| #define MACRO_END       } while (0) | ||||
|  | ||||
| #define optbarrier() __asm__ __volatile__("": : :"memory") | ||||
|  | ||||
| typedef struct leonbare_thread_ctx | ||||
| { | ||||
|   unsigned long sf_locals[8]; | ||||
|   unsigned long sf_ins[8]; | ||||
|   unsigned long outs[8]; | ||||
|   unsigned long globals[8]; | ||||
|   unsigned long psr; | ||||
|   unsigned long wim; | ||||
|   unsigned long magic; | ||||
|   unsigned long fpu; | ||||
|   /* size aligned to 8 */ | ||||
| } leonbare_thread_ctx_t; | ||||
| #define LEONBARE_THREAD_CTX_SZ sizeof(struct leonbare_thread_ctx) | ||||
|  | ||||
| typedef | ||||
| LBTAILQ_HEAD (leonbare_mutex_queue, leonbare_mutex) * | ||||
|   leonbare_mutex_queue_t; | ||||
|  | ||||
| #endif | ||||
| #define LEONBARE_THREAD_OFFSET_CTX 0 | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
|      struct leonbare_thread_protect | ||||
|      { | ||||
|        unsigned int runq; | ||||
|        unsigned int krp_runq_depth; | ||||
|        unsigned int krp_k_depth; | ||||
|        struct leonbare_mutex *krp_m; | ||||
|        unsigned int krp_m_depth; | ||||
|        unsigned int krp_flags;; | ||||
|        unsigned int krp_flags_depth; | ||||
|      }; | ||||
|  | ||||
| #define LEONBARE_INT_DISABLE_DECL  unsigned long _irq_flags = leonbare_disable_traps(); | ||||
| #define LEONBARE_INT_ENABLE_DECL  leonbare_enable_traps(_irq_flags); | ||||
|  | ||||
| #define leonbare_setu32p(a,v) leonbare_leon23_storenocache(a,v) | ||||
| #define leonbare_setu32(a,v)  leonbare_leon23_storenocache(a,v) | ||||
| #define leonbare_getu32(a)    leonbare_leon23_loadnocache(a) | ||||
|  | ||||
| #define LEONBARE_KERNEL_UNCACHED | ||||
| #ifndef LEONBARE_KERNEL_UNCACHED | ||||
| #define LEONBARE_KERNEL_SETU32P(a,v) (a=v) | ||||
| #define LEONBARE_KERNEL_SETU32(a,v)  (a=v)	/* uncached version should return v */ | ||||
| #define LEONBARE_KERNEL_GETU32(a)    (a) | ||||
| #define LEONBARE_KERNEL_GETU32P(a)   (a) | ||||
| #define LEONBARE_KERNEL_GETI32(a)    (a) | ||||
| #define LEONBARE_KERNEL_GETU32P_CAST(a,typ) ((typ)(a)) | ||||
| #define LEONBARE_KERNEL_GETU32P_BARE(a) (*(a))	/* uncached: no & */ | ||||
| #define LEONBARE_KERNEL_SETU32P_BARE(a,v) (*(a) = v)	/* uncached: no & */ | ||||
| #else | ||||
| #define LEONBARE_KERNEL_SETU32P(a,v) (leonbare_setu32p(&a,v)) | ||||
| #define LEONBARE_KERNEL_SETU32(a,v)  (leonbare_setu32p(&a,v))	/* uncached version should return v */ | ||||
| #define LEONBARE_KERNEL_GETU32(a)    (leonbare_getu32(&a)) | ||||
| #define LEONBARE_KERNEL_GETU32P(a)   ((void *)leonbare_getu32(&a)) | ||||
| #define LEONBARE_KERNEL_GETI32(a)    (leonbare_getu32(&a)) | ||||
| #define LEONBARE_KERNEL_GETU32P_CAST(a,typ) ((typ)(LEONBARE_KERNEL_GETU32P(a))) | ||||
| #define LEONBARE_KERNEL_GETU32P_BARE(a) ((void *)leonbare_getu32(a))	/* uncached: no & */ | ||||
| #define LEONBARE_KERNEL_SETU32P_BARE(a,v) (leonbare_setu32p(a,v))	/* uncached: no & */ | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #define LEONBARE_SMP_SPINLOCK_AQUIRE(l) | ||||
| #define LEONBARE_SMP_SPINLOCK_RELEASE(l) | ||||
|  | ||||
| #define LEONBARE_ISQ_ISDISABLED ((leon23_getpsr() & SPARC_PSR_PIL_MASK) == SPARC_PSR_PIL_MASK) | ||||
|  | ||||
| #define _LEONBARE_PROTECT_IRQ_START					\ | ||||
|     if (LEONBARE_KR_CURRENT->th_prot.krp_flags_depth++) {			\ | ||||
|         LBPASSERT((LEONBARE_ISQ_ISDISABLED),"Internal error: Recursiv IRQ protection with irq's enabled",0); \ | ||||
|     } else {								\ | ||||
| 	LEONBARE_KR_CURRENT->th_prot.krp_flags = leonbare_disable_traps(); \ | ||||
|     } | ||||
|  | ||||
| #define _LEONBARE_PROTECT_IRQ_END					\ | ||||
|     if (--LEONBARE_KR_CURRENT->th_prot.krp_flags_depth) {			\ | ||||
|         LBPASSERT((LEONBARE_ISQ_ISDISABLED),"Internal error: Recursiv IRQ protection with irq's enabled",0); \ | ||||
|     } else {								\ | ||||
| 	leonbare_enable_traps(LEONBARE_KR_CURRENT->th_prot.krp_flags);	\ | ||||
|     } | ||||
|  | ||||
| #define _LEONBARE_PROTECT_MUTEXSTRUCT_START(m)				\ | ||||
|     if (LEONBARE_KR_CURRENT->th_prot.krp_m_depth++) {			\ | ||||
|         LBPASSERT((LEONBARE_KR_CURRENT->th_prot.krp_m == m),"Mutex protection only allowed for one mutex at a time",0);	\ | ||||
|     } else {								\ | ||||
|         LEONBARE_SMP_SPINLOCK_AQUIRE(m->smp_lock);			\ | ||||
| 	LEONBARE_KR_CURRENT->th_prot.krp_m = m;				\ | ||||
|     } | ||||
|  | ||||
| #define _LEONBARE_PROTECT_MUTEXSTRUCT_END(m)				\ | ||||
|     LBPASSERT((LEONBARE_KR_CURRENT->th_prot.krp_m == m),"Mutex protection only allowed for one mutex at a time",0); \ | ||||
|     if ((--LEONBARE_KR_CURRENT->th_prot.krp_m_depth) == 0) {		\ | ||||
|         LEONBARE_SMP_SPINLOCK_RELEASE(m->smp_lock);			\ | ||||
|     } | ||||
|  | ||||
| #define _LEONBARE_PROTECT_KERNEL_START				\ | ||||
|     if (LEONBARE_KR_CURRENT->th_prot.krp_k_depth++ == 0) {			\ | ||||
|         LEONBARE_SMP_SPINLOCK_AQUIRE(LEONBARE_KR_LOCK);			\ | ||||
|     } | ||||
|  | ||||
| #define _LEONBARE_PROTECT_KERNEL_END				\ | ||||
|     if ((--LEONBARE_KR_CURRENT->th_prot.krp_k_depth) == 0) {		\ | ||||
|         LEONBARE_SMP_SPINLOCK_RELEASE(LEONBARE_KR_LOCK);			\ | ||||
|     } | ||||
|  | ||||
|  | ||||
| #define LEONBARE_PROTECT_MUTEXSTRUCT_START(m)	\ | ||||
|     _LEONBARE_PROTECT_IRQ_START;		\ | ||||
|     _LEONBARE_PROTECT_MUTEXSTRUCT_START(m) | ||||
|  | ||||
| #define LEONBARE_PROTECT_MUTEXSTRUCT_END(m)	\ | ||||
|     _LEONBARE_PROTECT_MUTEXSTRUCT_END(m)	\ | ||||
|     _LEONBARE_PROTECT_IRQ_END; | ||||
|  | ||||
|  | ||||
| #define LEONBARE_PROTECT_KERNEL_START()		\ | ||||
|     _LEONBARE_PROTECT_IRQ_START;		\ | ||||
|     _LEONBARE_PROTECT_KERNEL_START; | ||||
|  | ||||
| #define LEONBARE_PROTECT_KERNEL_END()		\ | ||||
|     _LEONBARE_PROTECT_KERNEL_END;		\ | ||||
|     _LEONBARE_PROTECT_IRQ_END; | ||||
|  | ||||
|      typedef struct leonbare_thread | ||||
|      { | ||||
|        struct leonbare_thread_ctx th_ctx; | ||||
|        unsigned int th_flags; | ||||
|  | ||||
|        int th_account;		/* how many ticks the thread stays in the readyqueue for one round */ | ||||
|        int th_caccount;		/* current value of th_account, updated on reinsertion */ | ||||
|        unsigned int th_pri_idx;	/* ready queue index */ | ||||
|        unsigned int th_runq_idx;	/* ready queue index index */ | ||||
|        unsigned int th_runq_which;	/* 0: ready queue, 1: ready prepare queue */ | ||||
|  | ||||
|        char *th_name; | ||||
|        int th_result; | ||||
|        int (*th_func) (void *); | ||||
|        void *th_arg; | ||||
|        char *th_stack_base; | ||||
|        unsigned int th_stack_size; | ||||
|        struct _reent th_reent;	/* reentrant structure for newlib */ | ||||
|        struct _reent *th_reentp;	/* pointer to eather pt_reent or global reent */ | ||||
|  | ||||
|        struct leonbare_thread_protect th_prot; | ||||
|  | ||||
|          LBTAILQ_ENTRY (leonbare_thread) th_runq; | ||||
|          LBTAILQ_ENTRY (leonbare_thread) th_allq; | ||||
|          LBTAILQ_ENTRY (leonbare_thread) th_mutex; | ||||
|        struct leonbare_mutex_queue th_mutex_locked; | ||||
|  | ||||
|      } *leonbare_thread_t __attribute__ ((aligned (8))); | ||||
|  | ||||
| #define LEONBARE_TH_FLAGS_get(c)      LEONBARE_KERNEL_GETU32((c)->th_flags) | ||||
| #define LEONBARE_TH_ACCOUNT_get(c)    LEONBARE_KERNEL_GETI32((c)->th_account) | ||||
| #define LEONBARE_TH_CACCOUNT_get(c)   LEONBARE_KERNEL_GETI32((c)->th_caccount) | ||||
|  | ||||
| #define LEONBARE_TH_PRI_IDX_get(c)    LEONBARE_KERNEL_GETU32((c)->th_pri_idx) | ||||
| #define LEONBARE_TH_RUNQ_IDX_get(c)   LEONBARE_KERNEL_GETU32((c)->th_runq_idx) | ||||
| #define LEONBARE_TH_RUNQ_WHICH_get(c) LEONBARE_KERNEL_GETU32((c)->th_runq_which) | ||||
|  | ||||
| #define LEONBARE_TH_NAME_get(c)       LEONBARE_KERNEL_GETU32P((c)->th_name) | ||||
| #define LEONBARE_TH_RESULT_get(c)     LEONBARE_KERNEL_GETI32((c)->th_result) | ||||
| #define LEONBARE_TH_FUNC_get(c)       LEONBARE_KERNEL_GETU32((c)->th_func) | ||||
| #define LEONBARE_TH_ARG_get(c)        LEONBARE_KERNEL_GETU32((c)->th_arg) | ||||
| #define LEONBARE_TH_STACK_BASE_get(c) LEONBARE_KERNEL_GETU32P((c)->th_stack_base) | ||||
| #define LEONBARE_TH_STACK_SIZE_get(c) LEONBARE_KERNEL_GETU32((c)->th_stack_size) | ||||
| #define LEONBARE_TH_REENTP_get(c)     LEONBARE_KERNEL_GETU32P((c)->th_reentp) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| #define LEONBARE_TH_NAME(c) (c->th_name) | ||||
| #define LEONBARE_TH_NAME_DBG(c) (LEONBARE_TH_NAME(c) ? LEONBARE_TH_NAME(c) : "<unknown>") | ||||
|  | ||||
| #define LEONBARE_REENT_SET(p) ((_impure_ptr=(p)->th_reentp)==_impure_ptr) | ||||
|  | ||||
| #define LEONBARE_TH_READY        (1<<0) | ||||
| #define LEONBARE_TH_SUSPENDED    (1<<1) | ||||
| #define LEONBARE_TH_TERMINATED   (1<<2) | ||||
| #define LEONBARE_TH_FINISHED     (1<<3) | ||||
|  | ||||
| #define LEONBARE_TH_SATEMASK     (LEONBARE_TH_READY | \ | ||||
| 				  LEONBARE_TH_SUSPENDED | \ | ||||
| 				  LEONBARE_TH_TERMINATED | \ | ||||
| 				  LEONBARE_TH_FINISHED) | ||||
|  | ||||
| #define LEONBARE_TH_SETSTATE(c,f) c->th_flags = ((c->th_flags & ~LEONBARE_TH_SATEMASK) | (f & LEONBARE_TH_SATEMASK)) | ||||
| #define LEONBARE_TH_ORSTATE(c,f) c->th_flags |= (f & LEONBARE_TH_SATEMASK) | ||||
|  | ||||
|      typedef LBTAILQ_HEAD (leonbare_thread_queue, | ||||
| 			   leonbare_thread) * leonbare_thread_queue_t; | ||||
|  | ||||
|      extern struct leonbare_kernel leonbare_kernel; | ||||
| #define KERNEL_GLOBAL leonbare_kernel | ||||
|      typedef struct leonbare_kernel | ||||
|      { | ||||
|        leonbare_thread_t kr_cur, kr_next; | ||||
|        struct leonbare_thread_queue kr_runq[LEONBARE_RUNQ_NR]; | ||||
|        struct leonbare_thread_queue kr_allq; | ||||
|        struct leonbare_mutex_queue kr_allm; | ||||
|        int kr_is_inkernel, kr_need_schedule, kr_is_preemption, kr_runq_which; | ||||
|        int kr_protect_flags; | ||||
|      } leonbare_kernel_t __attribute__ ((aligned (8))); | ||||
| #define LEONBARE_KR_CURRENT       (KERNEL_GLOBAL.kr_cur) | ||||
| #define LEONBARE_KR_NEXT          (KERNEL_GLOBAL.kr_next) | ||||
| #define LEONBARE_KR_RUNQ(i)     (&(KERNEL_GLOBAL.kr_runq[i])) | ||||
| #define LEONBARE_KR_RUNQ_WHICH    (KERNEL_GLOBAL.kr_runq_which) | ||||
| #define LEONBARE_KR_ALLQ        (&(KERNEL_GLOBAL.kr_allq)) | ||||
| #define LEONBARE_KR_ALLM        (&(KERNEL_GLOBAL.kr_allm)) | ||||
| #define LEONBARE_KR_IS_IN_KERNEL  (KERNEL_GLOBAL.kr_is_inkernel) | ||||
| #define LEONBARE_KR_IS_PREEMPTION (KERNEL_GLOBAL.kr_is_preemption) | ||||
|  | ||||
| #define LEONBARE_KR_NEED_SCHEDULE (LEONBARE_KR_CURRENT != LEONBARE_KR_NEXT) | ||||
|  | ||||
| #define LEONBARE_STACKALIGN(sp) ((((unsigned int)sp) + 7) & ~7) | ||||
|  | ||||
| /* context switching macros, implemented via setjmp/longjmp plus saving errno */ | ||||
| #define SAVE_CONTEXT(t) ( _leonbare_kernel_savecontext((t), 0) ) | ||||
| #define RESTORE_CONTEXT(t) _leonbare_kernel_switchto((t), 1) | ||||
|  | ||||
| #define KERNEL_SCHEDULE(f,retval) \ | ||||
|   MACRO_BEGIN \ | ||||
|     LEONBARE_KR_IS_IN_KERNEL--; \ | ||||
|     if (LEONBARE_KR_IS_IN_KERNEL == 0 && LEONBARE_KR_NEED_SCHEDULE) {	\ | ||||
|       LEONBARE_KR_IS_IN_KERNEL++; \ | ||||
|       if ((f) && (SAVE_CONTEXT(LEONBARE_KR_CURRENT) == 0)) {	\ | ||||
|         leonbare_sched(); \ | ||||
|       } \ | ||||
|       optbarrier(); \ | ||||
|       LEONBARE_KR_IS_IN_KERNEL--; \ | ||||
|     } \ | ||||
|   MACRO_END | ||||
|  | ||||
| #define KERNEL_ENTER LEONBARE_KR_IS_IN_KERNEL++; | ||||
| #define KERNEL_EXIT(f,ret) KERNEL_SCHEDULE(f,ret) | ||||
|  | ||||
|      int leonbare_thread_init (); | ||||
|      int leonbare_thread_create (struct leonbare_thread *thread, char *stack, | ||||
| 				 int stacksize); | ||||
|      int leonbare_sched_update (); | ||||
|      leonbare_thread_t leonbare_sched_paytime (); | ||||
|      void leonbare_sched_insert (struct leonbare_thread *thread, int head, | ||||
| 				 int prepare); | ||||
|      unsigned int leonbare_sched (); | ||||
|      unsigned int reschedule (); | ||||
|      unsigned int _leonbare_kernel_switchto (struct leonbare_thread *old, | ||||
| 					     struct leonbare_thread *new); | ||||
|  | ||||
| #define LEONBARE_STACK_DEFINE(n,size) unsigned char n[size] __attribute__((aligned(8))); | ||||
| #define LEONBARE_STACK_SIZE_DEFAULT 1024*20 | ||||
|  | ||||
|      typedef struct leonbare_mutex | ||||
|      { | ||||
|        unsigned int mx_owner_cnt; | ||||
|        leonbare_thread_t mx_owner; | ||||
|        struct leonbare_thread_queue mx_threads; | ||||
|          LBTAILQ_ENTRY (leonbare_mutex) mx_allm; | ||||
|          LBTAILQ_ENTRY (leonbare_mutex) mx_locked; | ||||
|  | ||||
|      } *leonbare_mutex_t; | ||||
|  | ||||
| #define LEONBARE_MUTEX_OWNER_GET(m) LEONBARE_KERNEL_GETU32(m->mx_owner) | ||||
| #define LEONBARE_MUTEX_OWNER_SET(m,o) LEONBARE_KERNEL_SETU32(m->mx_owner,o) | ||||
| #define LEONBARE_MUTEX_OWNER_CNT_GET(m) LEONBARE_KERNEL_GETU32(m->mx_owner_cnt) | ||||
| #define LEONBARE_MUTEX_OWNER_CNT_SET(m,o) LEONBARE_KERNEL_SETU32(m->mx_owner_cnt,o) | ||||
|  | ||||
| #define LEONBARE_MUTEX_LOCK_TIMEOUT -1 | ||||
| #define LEONBARE_MUTEX_LOCK_OK       0 | ||||
| #define LEONBARE_MUTEX_LOCK_ERROR    1 | ||||
|  | ||||
| #define LEONBARE_MUTEX_UNLOCK_OK     0 | ||||
| #define LEONBARE_MUTEX_UNLOCK_ERROR  1 | ||||
|  | ||||
|  | ||||
| #define LEONBARE_PROTECT_DECL(flags)    unsigned long flags; | ||||
| #define LEONBARE_PROTECT_KERNEL(flags)    flags = leonbare_disable_traps(); | ||||
| #define LEONBARE_UNPROTECT_KERNEL(flags)  leonbare_enable_traps(flags); | ||||
|  | ||||
| #define LEONBARE_PROTECT_MUTEX(flags,m)    flags = leonbare_disable_traps(); | ||||
| #define LEONBARE_UNPROTECT_MUTEX(flags,m)  leonbare_enable_traps(flags); | ||||
|  | ||||
| #else | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STORE_LOCALS(base_reg) \ | ||||
|         std     %l0, [%base_reg + LEONBARE_THREAD_CTX_STACK_L0]; \ | ||||
|         std     %l2, [%base_reg + LEONBARE_THREAD_CTX_STACK_L2]; \ | ||||
|         std     %l4, [%base_reg + LEONBARE_THREAD_CTX_STACK_L4]; \ | ||||
|         std     %l6, [%base_reg + LEONBARE_THREAD_CTX_STACK_L6]; | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STORE_INS(base_reg) \ | ||||
|         std     %i0, [%base_reg + LEONBARE_THREAD_CTX_STACK_I0]; \ | ||||
|         std     %i2, [%base_reg + LEONBARE_THREAD_CTX_STACK_I2]; \ | ||||
|         std     %i4, [%base_reg + LEONBARE_THREAD_CTX_STACK_I4]; \ | ||||
|         std     %i6, [%base_reg + LEONBARE_THREAD_CTX_STACK_I6]; | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STORE_OUTS(base_reg) \ | ||||
|         std     %o0, [%base_reg + LEONBARE_THREAD_CTX_STACK_O0]; \ | ||||
|         std     %o2, [%base_reg + LEONBARE_THREAD_CTX_STACK_O2]; \ | ||||
|         std     %o4, [%base_reg + LEONBARE_THREAD_CTX_STACK_O4]; \ | ||||
|         std     %o6, [%base_reg + LEONBARE_THREAD_CTX_STACK_O6]; | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STORE_GLOBALS(base_reg) \ | ||||
|         st      %g1, [%base_reg + LEONBARE_THREAD_CTX_STACK_G1]; \ | ||||
|         std     %g2, [%base_reg + LEONBARE_THREAD_CTX_STACK_G2]; \ | ||||
|         std     %g4, [%base_reg + LEONBARE_THREAD_CTX_STACK_G4]; \ | ||||
|         std     %g6, [%base_reg + LEONBARE_THREAD_CTX_STACK_G6]; | ||||
|  | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_LOAD_LOCALS(base_reg) \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_L0], %l0; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_L2], %l2; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_L4], %l4; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_L6], %l6; | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_LOAD_INS(base_reg) \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_I0], %i0; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_I2], %i2; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_I4], %i4; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_I6], %i6; | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_LOAD_OUTS(base_reg) \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_O0], %o0; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_O2], %o2; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_O4], %o4; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_O6], %o6; | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_LOAD_GLOBALS(base_reg) \ | ||||
|         ld      [%base_reg + LEONBARE_THREAD_CTX_STACK_G1], %g1; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_G2], %g2; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_G4], %g4; \ | ||||
|         ldd     [%base_reg + LEONBARE_THREAD_CTX_STACK_G6], %g6; | ||||
|  | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STACK_L0 (0*8*4) | ||||
| #define LEONBARE_THREAD_CTX_STACK_L2 (LEONBARE_THREAD_CTX_STACK_L0+(2*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_L4 (LEONBARE_THREAD_CTX_STACK_L0+(4*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_L6 (LEONBARE_THREAD_CTX_STACK_L0+(6*4)) | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STACK_I0 (1*8*4) | ||||
| #define LEONBARE_THREAD_CTX_STACK_I2 (LEONBARE_THREAD_CTX_STACK_I0+(2*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_I4 (LEONBARE_THREAD_CTX_STACK_I0+(4*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_I6 (LEONBARE_THREAD_CTX_STACK_I0+(6*4)) | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STACK_O0 (2*8*4) | ||||
| #define LEONBARE_THREAD_CTX_STACK_O2 (LEONBARE_THREAD_CTX_STACK_O0+(2*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_O4 (LEONBARE_THREAD_CTX_STACK_O0+(4*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_O6 (LEONBARE_THREAD_CTX_STACK_O0+(6*4)) | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STACK_G0 (3*8*4) | ||||
| #define LEONBARE_THREAD_CTX_STACK_G1 (LEONBARE_THREAD_CTX_STACK_G0+(1*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_G2 (LEONBARE_THREAD_CTX_STACK_G0+(2*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_G4 (LEONBARE_THREAD_CTX_STACK_G0+(4*4)) | ||||
| #define LEONBARE_THREAD_CTX_STACK_G6 (LEONBARE_THREAD_CTX_STACK_G0+(6*4)) | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_STACK_PSR    (4*8*4) | ||||
| #define LEONBARE_THREAD_CTX_STACK_WIM    (LEONBARE_THREAD_CTX_STACK_PSR+4) | ||||
| #define LEONBARE_THREAD_CTX_STACK_MAGIC  (LEONBARE_THREAD_CTX_STACK_PSR+8) | ||||
| #define LEONBARE_THREAD_CTX_STACK_FPU  (LEONBARE_THREAD_CTX_STACK_PSR+12) | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_SZ (LEONBARE_THREAD_CTX_STACK_PSR+16) | ||||
|  | ||||
| #endif /* __ASSEMBLER__ */ | ||||
|  | ||||
| # define LEONBARE_STOPALL													\ | ||||
|     LBDEBUG_HEADER_PRINTF(LBDEBUG_ALWAYS_NR,"Stopped at %s(%d), possibly not implemented yet\n",__FUNCTION__,__LINE__);	\ | ||||
|     _leonbare_Stop(); | ||||
|  | ||||
| #define LEONBARE_THREAD_CTX_MAGIC 0x1234 | ||||
|  | ||||
| #ifdef LBDEBUG_DO_ASSERT | ||||
| #define LEONBARE_VERIFYIRQDISABLED() LBPASSERT(((leon23_getpsr() & SPARC_PSR_PIL_MASK) == SPARC_PSR_PIL_MASK),"Irq must be disabled (pil==0xf)\n",0) | ||||
| #define LEONBARE_VERIFYSCHED() leonbare_sched_verify() | ||||
| #else | ||||
| #define LEONBARE_VERIFYIRQDISABLED() | ||||
| #define LEONBARE_VERIFYSCHED() | ||||
| #endif | ||||
| #define LEONBARE_PRINTQUEUES() if (PDEBUG_FLAGS_CHECK(LBDEBUG_QUEUE_NR)) { leonbare_sched_printqueue(); } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										148
									
								
								libgloss/sparc_leon/asm-leon/leonbare_kernel_queue.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								libgloss/sparc_leon/asm-leon/leonbare_kernel_queue.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| //####BSDCOPYRIGHTBEGIN#### | ||||
| // | ||||
| // ------------------------------------------- | ||||
| // | ||||
| // Portions of this software may have been derived from OpenBSD,  | ||||
| // FreeBSD or other sources, and are covered by the appropriate | ||||
| // copyright disclaimers included herein. | ||||
| // | ||||
| // Portions created by Red Hat are | ||||
| // Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. | ||||
| // | ||||
| // ------------------------------------------- | ||||
| // | ||||
| //####BSDCOPYRIGHTEND#### | ||||
| //========================================================================== | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 1991, 1993 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *	This product includes software developed by the University of | ||||
|  *	California, Berkeley and its contributors. | ||||
|  * 4. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  *	@(#)queue.h	8.5 (Berkeley) 8/20/94 | ||||
|  * $FreeBSD: src/sys/sys/queue.h,v 1.32.2.4 2001/03/31 03:33:39 hsu Exp $ | ||||
|  */ | ||||
|  | ||||
| #ifndef _SYS_LEONBARE_QUEUE_H_ | ||||
| #define	_SYS_LEONBARE_QUEUE_H_ | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Tail queue definitions. | ||||
|  */ | ||||
| #define LBTAILQ_HEAD(name, type)						\ | ||||
| struct name {								\ | ||||
| 	struct type *tqh_first;	/* first element */			\ | ||||
| 	struct type **tqh_last;	/* addr of last next element */		\ | ||||
|         char *tqh_name;                                                 \ | ||||
| } | ||||
|  | ||||
| #define LBTAILQ_HEAD_INITIALIZER(head)					\ | ||||
| 	{ NULL, &(head).tqh_first, 0 } | ||||
|  | ||||
| #define LBTAILQ_ENTRY(type)						\ | ||||
| struct {								\ | ||||
| 	struct type *tqe_next;	/* next element */			\ | ||||
| 	struct type **tqe_prev;	/* address of previous next element */	\ | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Tail queue functions. | ||||
|  */ | ||||
| #define	LBTAILQ_EMPTY(head) (LEONBARE_KERNEL_GETU32P((head)->tqh_first) == NULL) | ||||
|  | ||||
| #define	LBTAILQ_HASTWO(head, field) ((!LBTAILQ_EMPTY(head)) && LBTAILQ_NEXT(LBTAILQ_FIRST(head),field)) | ||||
|  | ||||
| #define LBTAILQ_FOREACH(var, head, field)					\ | ||||
| 	for (var = LBTAILQ_FIRST(head); var; var = LBTAILQ_NEXT(var, field)) | ||||
|  | ||||
| #define	LBTAILQ_FIRST(head) LEONBARE_KERNEL_GETU32P_CAST((head)->tqh_first,__typeof((head)->tqh_first)) | ||||
|  | ||||
| #define	LBTAILQ_LAST(head, headname) \ | ||||
|         LEONBARE_KERNEL_GETU32P_BARE(LEONBARE_KERNEL_GETU32P(((struct headname *)(LEONBARE_KERNEL_GETU32P((head)->tqh_last)))->tqh_last)) | ||||
|  | ||||
| #define	LBTAILQ_NEXT(elm, field) LEONBARE_KERNEL_GETU32P_CAST((elm)->field.tqe_next,__typeof((elm)->field.tqe_next)) | ||||
|  | ||||
| #define LBTAILQ_PREV(elm, headname, field) \ | ||||
|         LEONBARE_KERNEL_GETU32P_BARE(LEONBARE_KERNEL_GETU32P(((struct headname *)(LEONBARE_KERNEL_GETU32P((elm)->field.tqe_prev)))->tqh_last)) | ||||
|  | ||||
| /* #define	LBTAILQ_INIT(head) do {						\ */ | ||||
| /* 	(head)->tqh_first = NULL;					\ */ | ||||
| /* 	(head)->tqh_last = &(head)->tqh_first;				\ */ | ||||
| /*         (head)->tqh_name = 0;                                           \ */ | ||||
| /* } while (0) */ | ||||
|  | ||||
| #define	LBTAILQ_INIT(head) do {						\ | ||||
| 	LEONBARE_KERNEL_SETU32P((head)->tqh_first,NULL);		\ | ||||
| 	LEONBARE_KERNEL_SETU32P((head)->tqh_last,&(head)->tqh_first);	\ | ||||
|         LEONBARE_KERNEL_SETU32P((head)->tqh_name,0);			\ | ||||
| } while (0) | ||||
|  | ||||
| /* #define LBTAILQ_INSERT_HEAD(head, elm, field) do {			\ */ | ||||
| /* 	if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\ */ | ||||
| /* 		(head)->tqh_first->field.tqe_prev =			\ */ | ||||
| /* 		    &(elm)->field.tqe_next;				\ */ | ||||
| /* 	else								\ */ | ||||
| /* 		(head)->tqh_last = &(elm)->field.tqe_next;		\ */ | ||||
| /* 	(head)->tqh_first = (elm);					\ */ | ||||
| /* 	(elm)->field.tqe_prev = &(head)->tqh_first;			\ */ | ||||
| /* } while (0) */ | ||||
|  | ||||
| #define LBTAILQ_INSERT_HEAD(head, elm, field) do {			\ | ||||
| 	if ((LEONBARE_KERNEL_SETU32P((elm)->field.tqe_next,LEONBARE_KERNEL_GETU32P((head)->tqh_first))) != NULL) \ | ||||
| 	    LEONBARE_KERNEL_SETU32P(LEONBARE_KERNEL_GETU32P_CAST((head)->tqh_first,__typeof ((head)->tqh_first))->field.tqe_prev,&(elm)->field.tqe_next); \ | ||||
| 	else								\ | ||||
| 	    LEONBARE_KERNEL_SETU32P((head)->tqh_last,&(elm)->field.tqe_next); \ | ||||
| 	LEONBARE_KERNEL_SETU32P((head)->tqh_first,(elm));		\ | ||||
| 	LEONBARE_KERNEL_SETU32P((elm)->field.tqe_prev,&(head)->tqh_first); \ | ||||
| } while (0) | ||||
|  | ||||
| #define LBTAILQ_INSERT_TAIL(head, elm, field) do {			\ | ||||
| 	LEONBARE_KERNEL_SETU32P((elm)->field.tqe_next,NULL);		\ | ||||
| 	LEONBARE_KERNEL_SETU32P((elm)->field.tqe_prev,LEONBARE_KERNEL_GETU32P((head)->tqh_last)); \ | ||||
| 	LEONBARE_KERNEL_SETU32P_BARE(LEONBARE_KERNEL_GETU32P((head)->tqh_last),(elm)); \ | ||||
| 	LEONBARE_KERNEL_SETU32P((head)->tqh_last,&(elm)->field.tqe_next); \ | ||||
| } while (0) | ||||
|  | ||||
| #define LBTAILQ_REMOVE(head, elm, field) do {				\ | ||||
| 	if (LEONBARE_KERNEL_GETU32P((elm)->field.tqe_next) != NULL)	\ | ||||
| 	    LEONBARE_KERNEL_SETU32P(LEONBARE_KERNEL_GETU32P_CAST((elm)->field.tqe_next, __typeof((elm)->field.tqe_next))->field.tqe_prev, LEONBARE_KERNEL_GETU32P((elm)->field.tqe_prev)); \ | ||||
| 	else								\ | ||||
| 	    LEONBARE_KERNEL_SETU32P((head)->tqh_last, LEONBARE_KERNEL_GETU32P((elm)->field.tqe_prev)); \ | ||||
| 	LEONBARE_KERNEL_SETU32P_BARE(LEONBARE_KERNEL_GETU32P((elm)->field.tqe_prev),LEONBARE_KERNEL_GETU32P((elm)->field.tqe_next)); \ | ||||
|         LEONBARE_KERNEL_SETU32P((elm)->field.tqe_next, 0);		\ | ||||
|         LEONBARE_KERNEL_SETU32P((elm)->field.tqe_prev, 0);     /* mark removed */ \ | ||||
| } while (0) | ||||
|  | ||||
| #define	LBTAILQ_REMOVED(elm, field) (LEONBARE_KERNEL_GETU32P((elm)->field.tqe_next) == NULL && LEONBARE_KERNEL_GETU32P((elm)->field.tqe_prev) == NULL) | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif /* !_SYS_QUEUE_H_ */ | ||||
							
								
								
									
										39
									
								
								libgloss/sparc_leon/asm-leon/leoncompat.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								libgloss/sparc_leon/asm-leon/leoncompat.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _INCLUDE_LEONCOMPAT_h | ||||
| #define _INCLUDE_LEONCOMPAT_h | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| #define LEONCOMPAT_VERSION _leon_version | ||||
| #define LEONCOMPAT_VERSION_ISLEON3 (LEONCOMPAT_VERSION == 3) | ||||
| extern int _leon_version; | ||||
|  | ||||
| #endif /* __ASSEMBLER__ */ | ||||
|  | ||||
| #endif /* !_INCLUDE_LEONCOMPAT_h */ | ||||
							
								
								
									
										33
									
								
								libgloss/sparc_leon/asm-leon/leondbg.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								libgloss/sparc_leon/asm-leon/leondbg.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _ASMSPARC_LEONDBG_H | ||||
| #define _ASMSPARC_LEONDBG_H | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
| extern int dbgleon_printf (const char *fmt, ...); | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										177
									
								
								libgloss/sparc_leon/asm-leon/leonstack.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								libgloss/sparc_leon/asm-leon/leonstack.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _INCLUDE_LEON_STACK_h | ||||
| #define _INCLUDE_LEON_STACK_h | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
| /* process trap regs */ | ||||
|   struct leonbare_pt_regs | ||||
|   { | ||||
|     unsigned long psr; | ||||
|     unsigned long pc; | ||||
|     unsigned long npc; | ||||
|     unsigned long y; | ||||
|     unsigned long u_regs[16];	/* globals and ins */ | ||||
|   }; | ||||
| #define PT_REGS_SZ   sizeof(struct leonbare_pt_regs) | ||||
|  | ||||
| /* A Sparc stack frame */ | ||||
|   struct sparc_stackframe_regs | ||||
|   { | ||||
|     unsigned long sf_locals[8]; | ||||
|     unsigned long sf_ins[6]; | ||||
|     struct sparc_stackframe_regs *sf_fp; | ||||
|     unsigned long sf_callers_pc; | ||||
|     char *sf_structptr; | ||||
|     unsigned long sf_xargs[6]; | ||||
|     unsigned long sf_xxargs[1]; | ||||
|   }; | ||||
| #define SF_REGS_SZ sizeof(struct sparc_stackframe_regs) | ||||
|  | ||||
| /* A register window */ | ||||
|   struct sparc_regwindow_regs | ||||
|   { | ||||
|     unsigned long locals[8]; | ||||
|     unsigned long ins[8]; | ||||
|   }; | ||||
| #define RW_REGS_SZ sizeof(struct sparc_regwindow_regs) | ||||
|  | ||||
| /* A fpu window */ | ||||
|   struct sparc_fpuwindow_regs | ||||
|   { | ||||
|     unsigned long locals[32]; | ||||
|     unsigned long fsr; | ||||
|     unsigned long dummy; | ||||
|     unsigned long irqpsr; | ||||
|     unsigned long lastctx; | ||||
|   }; | ||||
| #define FW_REGS_SZ sizeof(struct sparc_fpuwindow_regs) | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #else | ||||
| #define PT_REGS_SZ     0x50	/* 20*4 */ | ||||
| #define SF_REGS_SZ     0x60	/* 24*4 */ | ||||
| #define RW_REGS_SZ     0x20	/* 16*4 */ | ||||
| #define FW_REGS_SZ     0x90	/* 36*4 */ | ||||
| #endif /* !ASM */ | ||||
|  | ||||
| /* These are for pt_regs. */ | ||||
| #define PT_PSR    0x0 | ||||
| #define PT_PC     0x4 | ||||
| #define PT_NPC    0x8 | ||||
| #define PT_Y      0xc | ||||
| #define PT_G0     0x10 | ||||
| #define PT_WIM    PT_G0 | ||||
| #define PT_G1     0x14 | ||||
| #define PT_G2     0x18 | ||||
| #define PT_G3     0x1c | ||||
| #define PT_G4     0x20 | ||||
| #define PT_G5     0x24 | ||||
| #define PT_G6     0x28 | ||||
| #define PT_G7     0x2c | ||||
| #define PT_I0     0x30 | ||||
| #define PT_I1     0x34 | ||||
| #define PT_I2     0x38 | ||||
| #define PT_I3     0x3c | ||||
| #define PT_I4     0x40 | ||||
| #define PT_I5     0x44 | ||||
| #define PT_I6     0x48 | ||||
| #define PT_FP     PT_I6 | ||||
| #define PT_I7     0x4c | ||||
|  | ||||
| /* Stack_frame offsets */ | ||||
| #define SF_L0     0x00 | ||||
| #define SF_L1     0x04 | ||||
| #define SF_L2     0x08 | ||||
| #define SF_L3     0x0c | ||||
| #define SF_L4     0x10 | ||||
| #define SF_L5     0x14 | ||||
| #define SF_L6     0x18 | ||||
| #define SF_L7     0x1c | ||||
| #define SF_I0     0x20 | ||||
| #define SF_I1     0x24 | ||||
| #define SF_I2     0x28 | ||||
| #define SF_I3     0x2c | ||||
| #define SF_I4     0x30 | ||||
| #define SF_I5     0x34 | ||||
| #define SF_FP     0x38 | ||||
| #define SF_PC     0x3c | ||||
| #define SF_RETP   0x40 | ||||
| #define SF_XARG0  0x44 | ||||
| #define SF_XARG1  0x48 | ||||
| #define SF_XARG2  0x4c | ||||
| #define SF_XARG3  0x50 | ||||
| #define SF_XARG4  0x54 | ||||
| #define SF_XARG5  0x58 | ||||
| #define SF_XXARG  0x5c | ||||
|  | ||||
| /* Reg_window offsets */ | ||||
| #define RW_L0     0x00 | ||||
| #define RW_L1     0x04 | ||||
| #define RW_L2     0x08 | ||||
| #define RW_L3     0x0c | ||||
| #define RW_L4     0x10 | ||||
| #define RW_L5     0x14 | ||||
| #define RW_L6     0x18 | ||||
| #define RW_L7     0x1c | ||||
| #define RW_I0     0x20 | ||||
| #define RW_I1     0x24 | ||||
| #define RW_I2     0x28 | ||||
| #define RW_I3     0x2c | ||||
| #define RW_I4     0x30 | ||||
| #define RW_I5     0x34 | ||||
| #define RW_I6     0x38 | ||||
| #define RW_I7     0x3c | ||||
|  | ||||
| /* Fpu_window offsets */ | ||||
| #define FW_F0     0x00 | ||||
| #define FW_F2     0x08 | ||||
| #define FW_F4     0x10 | ||||
| #define FW_F6     0x18 | ||||
| #define FW_F8     0x20 | ||||
| #define FW_F10    0x28 | ||||
| #define FW_F12    0x30 | ||||
| #define FW_F14    0x38 | ||||
| #define FW_F16    0x40 | ||||
| #define FW_F18    0x48 | ||||
| #define FW_F20    0x50 | ||||
| #define FW_F22    0x58 | ||||
| #define FW_F24    0x60 | ||||
| #define FW_F26    0x68 | ||||
| #define FW_F28    0x70 | ||||
| #define FW_F30    0x78 | ||||
| #define FW_FSR    0x80 | ||||
|  | ||||
| #endif /* !_INCLUDE_LEON_STACK_h */ | ||||
							
								
								
									
										40
									
								
								libgloss/sparc_leon/asm-leon/liblocks.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								libgloss/sparc_leon/asm-leon/liblocks.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __LEONBARE_LIBLOCKS_H | ||||
| #define __LEONBARE_LIBLOCKS_H | ||||
|  | ||||
| extern int (*__lbst_pthread_mutex_init) (pthread_mutex_t * __mutex, | ||||
| 					 pthread_mutexattr_t * __mutex_attr); | ||||
| extern int (*__lbst_pthread_mutex_destroy) (pthread_mutex_t * __mutex); | ||||
| extern int (*__lbst_pthread_mutex_trylock) (pthread_mutex_t * __mutex); | ||||
| extern int (*__lbst_pthread_mutex_lock) (pthread_mutex_t * __mutex); | ||||
| extern int (*__lbst_pthread_mutex_unlock) (pthread_mutex_t * __mutex); | ||||
| extern int (*__lbst_pthread_mutexattr_init) (pthread_mutexattr_t * __attr); | ||||
| extern int (*__lbst_pthread_mutexattr_destroy) (pthread_mutexattr_t * __attr); | ||||
| extern int (*__lbst_pthread_mutexattr_settype) (pthread_mutexattr_t * __attr, | ||||
| 						int __kind); | ||||
|  | ||||
| #endif /* __LEONBARE_LIBLOCKS_H */ | ||||
							
								
								
									
										59
									
								
								libgloss/sparc_leon/asm-leon/linkage.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								libgloss/sparc_leon/asm-leon/linkage.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef H_LEONBARE_LINKAGE_H | ||||
| #define H_LEONBARE_LINKAGE_H | ||||
|  | ||||
| #ifndef _ASM | ||||
| # define __inline__	__inline__	__attribute__((always_inline)) | ||||
|  | ||||
| #define likely(x)	__builtin_expect(!!(x), 1) | ||||
| #define unlikely(x)	__builtin_expect(!!(x), 0) | ||||
| #define barrier()       __memory_barrier() | ||||
|  | ||||
| #define gccalign8 __attribute__((aligned(8))) | ||||
|  | ||||
| #else /* !_ASM */ | ||||
|  | ||||
| #define	MCOUNT_SIZE	0	/* no instructions inserted */ | ||||
| #define	MCOUNT(x) | ||||
|  | ||||
| /* | ||||
|  * ENTRY provides the standard procedure entry code and an easy way to | ||||
|  * insert the calls to mcount for profiling. ENTRY_NP is identical, but | ||||
|  * never calls mcount. | ||||
|  */ | ||||
| #define	ENTRY(x) \ | ||||
| 	.section	".text"; \ | ||||
| 	.align	4; \ | ||||
| 	.global	x; \ | ||||
| 	.type	x, #function; \ | ||||
| x:	MCOUNT(x) | ||||
|  | ||||
| #define	ENTRY_SIZE	MCOUNT_SIZE | ||||
|  | ||||
| #endif /* _ASM */ | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										33
									
								
								libgloss/sparc_leon/asm-leon/param.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								libgloss/sparc_leon/asm-leon/param.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _LEON_ASMSPARC_PARAM_H | ||||
| #define _LEON_ASMSPARC_PARAM_H | ||||
|  | ||||
| /* note: this is also defined in machine/param.h */ | ||||
| #define HZ		  100UL	/* Internal kernel timer frequency */ | ||||
| #define  CLOCK_TICK_RATE  1000000UL	/* Underlying HZ */ | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										570
									
								
								libgloss/sparc_leon/asm-leon/queue.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										570
									
								
								libgloss/sparc_leon/asm-leon/queue.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,570 @@ | ||||
| //####BSDCOPYRIGHTBEGIN#### | ||||
| // | ||||
| // ------------------------------------------- | ||||
| // | ||||
| // Portions of this software may have been derived from OpenBSD,  | ||||
| // FreeBSD or other sources, and are covered by the appropriate | ||||
| // copyright disclaimers included herein. | ||||
| // | ||||
| // Portions created by Red Hat are | ||||
| // Copyright (C) 2002 Red Hat, Inc. All Rights Reserved. | ||||
| // | ||||
| // ------------------------------------------- | ||||
| // | ||||
| //####BSDCOPYRIGHTEND#### | ||||
| //========================================================================== | ||||
|  | ||||
| /* | ||||
|  * Copyright (c) 1991, 1993 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *	This product includes software developed by the University of | ||||
|  *	California, Berkeley and its contributors. | ||||
|  * 4. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  *	@(#)queue.h	8.5 (Berkeley) 8/20/94 | ||||
|  * $FreeBSD: src/sys/sys/queue.h,v 1.32.2.4 2001/03/31 03:33:39 hsu Exp $ | ||||
|  */ | ||||
|  | ||||
| #ifndef _SYS_QUEUE_H_ | ||||
| #define	_SYS_QUEUE_H_ | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
|  | ||||
| /* | ||||
|  * This file defines five types of data structures: singly-linked lists, | ||||
|  * singly-linked tail queues, lists, tail queues, and circular queues. | ||||
|  * | ||||
|  * A singly-linked list is headed by a single forward pointer. The elements | ||||
|  * are singly linked for minimum space and pointer manipulation overhead at | ||||
|  * the expense of O(n) removal for arbitrary elements. New elements can be | ||||
|  * added to the list after an existing element or at the head of the list. | ||||
|  * Elements being removed from the head of the list should use the explicit | ||||
|  * macro for this purpose for optimum efficiency. A singly-linked list may | ||||
|  * only be traversed in the forward direction.  Singly-linked lists are ideal | ||||
|  * for applications with large datasets and few or no removals or for | ||||
|  * implementing a LIFO queue. | ||||
|  * | ||||
|  * A singly-linked tail queue is headed by a pair of pointers, one to the | ||||
|  * head of the list and the other to the tail of the list. The elements are | ||||
|  * singly linked for minimum space and pointer manipulation overhead at the | ||||
|  * expense of O(n) removal for arbitrary elements. New elements can be added | ||||
|  * to the list after an existing element, at the head of the list, or at the | ||||
|  * end of the list. Elements being removed from the head of the tail queue | ||||
|  * should use the explicit macro for this purpose for optimum efficiency. | ||||
|  * A singly-linked tail queue may only be traversed in the forward direction. | ||||
|  * Singly-linked tail queues are ideal for applications with large datasets | ||||
|  * and few or no removals or for implementing a FIFO queue. | ||||
|  * | ||||
|  * A list is headed by a single forward pointer (or an array of forward | ||||
|  * pointers for a hash table header). The elements are doubly linked | ||||
|  * so that an arbitrary element can be removed without a need to | ||||
|  * traverse the list. New elements can be added to the list before | ||||
|  * or after an existing element or at the head of the list. A list | ||||
|  * may only be traversed in the forward direction. | ||||
|  * | ||||
|  * A tail queue is headed by a pair of pointers, one to the head of the | ||||
|  * list and the other to the tail of the list. The elements are doubly | ||||
|  * linked so that an arbitrary element can be removed without a need to | ||||
|  * traverse the list. New elements can be added to the list before or | ||||
|  * after an existing element, at the head of the list, or at the end of | ||||
|  * the list. A tail queue may be traversed in either direction. | ||||
|  * | ||||
|  * A circle queue is headed by a pair of pointers, one to the head of the | ||||
|  * list and the other to the tail of the list. The elements are doubly | ||||
|  * linked so that an arbitrary element can be removed without a need to | ||||
|  * traverse the list. New elements can be added to the list before or after | ||||
|  * an existing element, at the head of the list, or at the end of the list. | ||||
|  * A circle queue may be traversed in either direction, but has a more | ||||
|  * complex end of list detection. | ||||
|  * | ||||
|  * For details on the use of these macros, see the queue(3) manual page. | ||||
|  * | ||||
|  * | ||||
|  *			SLIST	LIST	STAILQ	TAILQ	CIRCLEQ | ||||
|  * _HEAD		+	+	+	+	+ | ||||
|  * _ENTRY		+	+	+	+	+ | ||||
|  * _INIT		+	+	+	+	+ | ||||
|  * _EMPTY		+	+	+	+	+ | ||||
|  * _FIRST		+	+	+	+	+ | ||||
|  * _NEXT		+	+	+	+	+ | ||||
|  * _PREV		-	-	-	+	+ | ||||
|  * _LAST		-	-	+	+	+ | ||||
|  * _FOREACH		+	+	+	+	+ | ||||
|  * _FOREACH_REVERSE	-	-	-	+	+ | ||||
|  * _INSERT_HEAD		+	+	+	+	+ | ||||
|  * _INSERT_BEFORE	-	+	-	+	+ | ||||
|  * _INSERT_AFTER	+	+	+	+	+ | ||||
|  * _INSERT_TAIL		-	-	+	+	+ | ||||
|  * _REMOVE_HEAD		+	-	+	-	- | ||||
|  * _REMOVE		+	+	+	+	+ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Singly-linked List definitions. | ||||
|  */ | ||||
| #define SLIST_HEAD(name, type)						\ | ||||
| struct name {								\ | ||||
| 	struct type *slh_first;	/* first element */			\ | ||||
| } | ||||
|  | ||||
| #define SLIST_HEAD_INITIALIZER(head)					\ | ||||
| 	{ NULL } | ||||
|  | ||||
| #define SLIST_ENTRY(type)						\ | ||||
| struct {								\ | ||||
| 	struct type *sle_next;	/* next element */			\ | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Singly-linked List functions. | ||||
|  */ | ||||
| #define	SLIST_EMPTY(head)	((head)->slh_first == NULL) | ||||
|  | ||||
| #define	SLIST_FIRST(head)	((head)->slh_first) | ||||
|  | ||||
| #define SLIST_FOREACH(var, head, field)					\ | ||||
| 	for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) | ||||
|  | ||||
| #define SLIST_INIT(head) {						\ | ||||
| 	(head)->slh_first = NULL;					\ | ||||
| } | ||||
|  | ||||
| #define SLIST_INSERT_AFTER(slistelm, elm, field) do {			\ | ||||
| 	(elm)->field.sle_next = (slistelm)->field.sle_next;		\ | ||||
| 	(slistelm)->field.sle_next = (elm);				\ | ||||
| } while (0) | ||||
|  | ||||
| #define SLIST_INSERT_HEAD(head, elm, field) do {			\ | ||||
| 	(elm)->field.sle_next = (head)->slh_first;			\ | ||||
| 	(head)->slh_first = (elm);					\ | ||||
| } while (0) | ||||
|  | ||||
| #define SLIST_NEXT(elm, field)	((elm)->field.sle_next) | ||||
|  | ||||
| #define SLIST_REMOVE_HEAD(head, field) do {				\ | ||||
| 	(head)->slh_first = (head)->slh_first->field.sle_next;		\ | ||||
| } while (0) | ||||
|  | ||||
| #define SLIST_REMOVE(head, elm, type, field) do {			\ | ||||
| 	if ((head)->slh_first == (elm)) {				\ | ||||
| 		SLIST_REMOVE_HEAD((head), field);			\ | ||||
| 	}								\ | ||||
| 	else {								\ | ||||
| 		struct type *curelm = (head)->slh_first;		\ | ||||
| 		while( curelm->field.sle_next != (elm) )		\ | ||||
| 			curelm = curelm->field.sle_next;		\ | ||||
| 		curelm->field.sle_next =				\ | ||||
| 		    curelm->field.sle_next->field.sle_next;		\ | ||||
| 	}								\ | ||||
| } while (0) | ||||
|  | ||||
| /* | ||||
|  * Singly-linked Tail queue definitions. | ||||
|  */ | ||||
| #define STAILQ_HEAD(name, type)						\ | ||||
| struct name {								\ | ||||
| 	struct type *stqh_first;/* first element */			\ | ||||
| 	struct type **stqh_last;/* addr of last next element */		\ | ||||
| } | ||||
|  | ||||
| #define STAILQ_HEAD_INITIALIZER(head)					\ | ||||
| 	{ NULL, &(head).stqh_first } | ||||
|  | ||||
| #define STAILQ_ENTRY(type)						\ | ||||
| struct {								\ | ||||
| 	struct type *stqe_next;	/* next element */			\ | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Singly-linked Tail queue functions. | ||||
|  */ | ||||
| #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) | ||||
|  | ||||
| #define	STAILQ_INIT(head) do {						\ | ||||
| 	(head)->stqh_first = NULL;					\ | ||||
| 	(head)->stqh_last = &(head)->stqh_first;			\ | ||||
| } while (0) | ||||
|  | ||||
| #define STAILQ_FIRST(head)	((head)->stqh_first) | ||||
|  | ||||
| #define	STAILQ_LAST(head, type, field)					\ | ||||
| 	(STAILQ_EMPTY(head) ?						\ | ||||
| 		NULL :							\ | ||||
| 	        ((struct type *)					\ | ||||
| 		((char *)((head)->stqh_last) - __offsetof(struct type, field)))) | ||||
|  | ||||
| #define STAILQ_FOREACH(var, head, field)				\ | ||||
| 	for((var) = (head)->stqh_first; (var); (var) = (var)->field.stqe_next) | ||||
|  | ||||
| #define STAILQ_INSERT_HEAD(head, elm, field) do {			\ | ||||
| 	if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)	\ | ||||
| 		(head)->stqh_last = &(elm)->field.stqe_next;		\ | ||||
| 	(head)->stqh_first = (elm);					\ | ||||
| } while (0) | ||||
|  | ||||
| #define STAILQ_INSERT_TAIL(head, elm, field) do {			\ | ||||
| 	(elm)->field.stqe_next = NULL;					\ | ||||
| 	*(head)->stqh_last = (elm);					\ | ||||
| 	(head)->stqh_last = &(elm)->field.stqe_next;			\ | ||||
| } while (0) | ||||
|  | ||||
| #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {		\ | ||||
| 	if (((elm)->field.stqe_next = (tqelm)->field.stqe_next) == NULL)\ | ||||
| 		(head)->stqh_last = &(elm)->field.stqe_next;		\ | ||||
| 	(tqelm)->field.stqe_next = (elm);				\ | ||||
| } while (0) | ||||
|  | ||||
| #define STAILQ_NEXT(elm, field)	((elm)->field.stqe_next) | ||||
|  | ||||
| #define STAILQ_REMOVE_HEAD(head, field) do {				\ | ||||
| 	if (((head)->stqh_first =					\ | ||||
| 	     (head)->stqh_first->field.stqe_next) == NULL)		\ | ||||
| 		(head)->stqh_last = &(head)->stqh_first;		\ | ||||
| } while (0) | ||||
|  | ||||
| #define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do {			\ | ||||
| 	if (((head)->stqh_first = (elm)->field.stqe_next) == NULL)	\ | ||||
| 		(head)->stqh_last = &(head)->stqh_first;		\ | ||||
| } while (0) | ||||
|  | ||||
| #define STAILQ_REMOVE(head, elm, type, field) do {			\ | ||||
| 	if ((head)->stqh_first == (elm)) {				\ | ||||
| 		STAILQ_REMOVE_HEAD(head, field);			\ | ||||
| 	}								\ | ||||
| 	else {								\ | ||||
| 		struct type *curelm = (head)->stqh_first;		\ | ||||
| 		while( curelm->field.stqe_next != (elm) )		\ | ||||
| 			curelm = curelm->field.stqe_next;		\ | ||||
| 		if((curelm->field.stqe_next =				\ | ||||
| 		    curelm->field.stqe_next->field.stqe_next) == NULL)	\ | ||||
| 			(head)->stqh_last = &(curelm)->field.stqe_next;	\ | ||||
| 	}								\ | ||||
| } while (0) | ||||
|  | ||||
| /* | ||||
|  * List definitions. | ||||
|  */ | ||||
| #define LIST_HEAD(name, type)						\ | ||||
| struct name {								\ | ||||
| 	struct type *lh_first;	/* first element */			\ | ||||
| } | ||||
|  | ||||
| #define LIST_HEAD_INITIALIZER(head)					\ | ||||
| 	{ NULL } | ||||
|  | ||||
| #define LIST_ENTRY(type)						\ | ||||
| struct {								\ | ||||
| 	struct type *le_next;	/* next element */			\ | ||||
| 	struct type **le_prev;	/* address of previous next element */	\ | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * List functions. | ||||
|  */ | ||||
|  | ||||
| #define	LIST_EMPTY(head) ((head)->lh_first == NULL) | ||||
|  | ||||
| #define LIST_FIRST(head)	((head)->lh_first) | ||||
|  | ||||
| #define LIST_FOREACH(var, head, field)					\ | ||||
| 	for((var) = (head)->lh_first; (var); (var) = (var)->field.le_next) | ||||
|  | ||||
| #define	LIST_INIT(head) do {						\ | ||||
| 	(head)->lh_first = NULL;					\ | ||||
| } while (0) | ||||
|  | ||||
| #define LIST_INSERT_AFTER(listelm, elm, field) do {			\ | ||||
| 	if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)	\ | ||||
| 		(listelm)->field.le_next->field.le_prev =		\ | ||||
| 		    &(elm)->field.le_next;				\ | ||||
| 	(listelm)->field.le_next = (elm);				\ | ||||
| 	(elm)->field.le_prev = &(listelm)->field.le_next;		\ | ||||
| } while (0) | ||||
|  | ||||
| #define LIST_INSERT_BEFORE(listelm, elm, field) do {			\ | ||||
| 	(elm)->field.le_prev = (listelm)->field.le_prev;		\ | ||||
| 	(elm)->field.le_next = (listelm);				\ | ||||
| 	*(listelm)->field.le_prev = (elm);				\ | ||||
| 	(listelm)->field.le_prev = &(elm)->field.le_next;		\ | ||||
| } while (0) | ||||
|  | ||||
| #define LIST_INSERT_HEAD(head, elm, field) do {				\ | ||||
| 	if (((elm)->field.le_next = (head)->lh_first) != NULL)		\ | ||||
| 		(head)->lh_first->field.le_prev = &(elm)->field.le_next;\ | ||||
| 	(head)->lh_first = (elm);					\ | ||||
| 	(elm)->field.le_prev = &(head)->lh_first;			\ | ||||
| } while (0) | ||||
|  | ||||
| #define LIST_NEXT(elm, field)	((elm)->field.le_next) | ||||
|  | ||||
| #define LIST_REMOVE(elm, field) do {					\ | ||||
| 	if ((elm)->field.le_next != NULL)				\ | ||||
| 		(elm)->field.le_next->field.le_prev = 			\ | ||||
| 		    (elm)->field.le_prev;				\ | ||||
| 	*(elm)->field.le_prev = (elm)->field.le_next;			\ | ||||
| } while (0) | ||||
|  | ||||
| /* | ||||
|  * Tail queue definitions. | ||||
|  */ | ||||
| #define TAILQ_HEAD(name, type)						\ | ||||
| struct name {								\ | ||||
| 	struct type *tqh_first;	/* first element */			\ | ||||
| 	struct type **tqh_last;	/* addr of last next element */		\ | ||||
|         char *tqh_name;                                                 \ | ||||
| } | ||||
|  | ||||
| #define TAILQ_HEAD_INITIALIZER(head)					\ | ||||
| 	{ NULL, &(head).tqh_first, 0 } | ||||
|  | ||||
| #define TAILQ_ENTRY(type)						\ | ||||
| struct {								\ | ||||
| 	struct type *tqe_next;	/* next element */			\ | ||||
| 	struct type **tqe_prev;	/* address of previous next element */	\ | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Tail queue functions. | ||||
|  */ | ||||
| #define	TAILQ_EMPTY(head) ((head)->tqh_first == NULL) | ||||
|  | ||||
| #define	TAILQ_HASTWO(head, field) ((!TAILQ_EMPTY(head)) && TAILQ_NEXT(TAILQ_FIRST(head),field)) | ||||
|  | ||||
| #define TAILQ_FOREACH(var, head, field)					\ | ||||
| 	for (var = TAILQ_FIRST(head); var; var = TAILQ_NEXT(var, field)) | ||||
|  | ||||
| #define TAILQ_FOREACH_REVERSE(var, head, headname, field)		\ | ||||
| 	for ((var) = TAILQ_LAST((head), headname);			\ | ||||
| 	     (var);							\ | ||||
| 	     (var) = TAILQ_PREV((var), headname, field)) | ||||
|  | ||||
| #define	TAILQ_FIRST(head) ((head)->tqh_first) | ||||
|  | ||||
| #define	TAILQ_LAST(head, headname) \ | ||||
| 	(*(((struct headname *)((head)->tqh_last))->tqh_last)) | ||||
|  | ||||
| #define	TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) | ||||
|  | ||||
| #define TAILQ_PREV(elm, headname, field) \ | ||||
| 	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) | ||||
|  | ||||
| #define	TAILQ_INIT(head) do {						\ | ||||
| 	(head)->tqh_first = NULL;					\ | ||||
| 	(head)->tqh_last = &(head)->tqh_first;				\ | ||||
|         (head)->tqh_name = 0;                                           \ | ||||
| } while (0) | ||||
|  | ||||
| #define TAILQ_INSERT_HEAD(head, elm, field) do {			\ | ||||
| 	if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\ | ||||
| 		(head)->tqh_first->field.tqe_prev =			\ | ||||
| 		    &(elm)->field.tqe_next;				\ | ||||
| 	else								\ | ||||
| 		(head)->tqh_last = &(elm)->field.tqe_next;		\ | ||||
| 	(head)->tqh_first = (elm);					\ | ||||
| 	(elm)->field.tqe_prev = &(head)->tqh_first;			\ | ||||
| } while (0) | ||||
|  | ||||
| #define TAILQ_INSERT_TAIL(head, elm, field) do {			\ | ||||
| 	(elm)->field.tqe_next = NULL;					\ | ||||
| 	(elm)->field.tqe_prev = (head)->tqh_last;			\ | ||||
| 	*(head)->tqh_last = (elm);					\ | ||||
| 	(head)->tqh_last = &(elm)->field.tqe_next;			\ | ||||
| } while (0) | ||||
|  | ||||
| #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\ | ||||
| 	if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ | ||||
| 		(elm)->field.tqe_next->field.tqe_prev = 		\ | ||||
| 		    &(elm)->field.tqe_next;				\ | ||||
| 	else								\ | ||||
| 		(head)->tqh_last = &(elm)->field.tqe_next;		\ | ||||
| 	(listelm)->field.tqe_next = (elm);				\ | ||||
| 	(elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\ | ||||
| } while (0) | ||||
|  | ||||
| #define TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\ | ||||
| 	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\ | ||||
| 	(elm)->field.tqe_next = (listelm);				\ | ||||
| 	*(listelm)->field.tqe_prev = (elm);				\ | ||||
| 	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\ | ||||
| } while (0) | ||||
|  | ||||
| #define TAILQ_REMOVE(head, elm, field) do {				\ | ||||
| 	if (((elm)->field.tqe_next) != NULL)				\ | ||||
| 		(elm)->field.tqe_next->field.tqe_prev = 		\ | ||||
| 		    (elm)->field.tqe_prev;				\ | ||||
| 	else								\ | ||||
| 		(head)->tqh_last = (elm)->field.tqe_prev;		\ | ||||
| 	*(elm)->field.tqe_prev = (elm)->field.tqe_next;			\ | ||||
|         (elm)->field.tqe_next = 0;                                      \ | ||||
|         (elm)->field.tqe_prev = 0;     /* mark removed */               \ | ||||
| } while (0) | ||||
|  | ||||
| #define	TAILQ_REMOVED(elm, field) ((elm)->field.tqe_next == NULL && (elm)->field.tqe_prev == NULL) | ||||
|  | ||||
| /* | ||||
|  * Circular queue definitions. | ||||
|  */ | ||||
| #define CIRCLEQ_HEAD(name, type)					\ | ||||
| struct name {								\ | ||||
| 	struct type *cqh_first;		/* first element */		\ | ||||
| 	struct type *cqh_last;		/* last element */		\ | ||||
| } | ||||
|  | ||||
| #define CIRCLEQ_ENTRY(type)						\ | ||||
| struct {								\ | ||||
| 	struct type *cqe_next;		/* next element */		\ | ||||
| 	struct type *cqe_prev;		/* previous element */		\ | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Circular queue functions. | ||||
|  */ | ||||
| #define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) | ||||
|  | ||||
| #define CIRCLEQ_FIRST(head) ((head)->cqh_first) | ||||
|  | ||||
| #define CIRCLEQ_FOREACH(var, head, field)				\ | ||||
| 	for((var) = (head)->cqh_first;					\ | ||||
| 	    (var) != (void *)(head);					\ | ||||
| 	    (var) = (var)->field.cqe_next) | ||||
|  | ||||
| #define CIRCLEQ_FOREACH_REVERSE(var, head, field)			\ | ||||
| 	for((var) = (head)->cqh_last;					\ | ||||
| 	    (var) != (void *)(head);					\ | ||||
| 	    (var) = (var)->field.cqe_prev) | ||||
|  | ||||
| #define	CIRCLEQ_INIT(head) do {						\ | ||||
| 	(head)->cqh_first = (void *)(head);				\ | ||||
| 	(head)->cqh_last = (void *)(head);				\ | ||||
| } while (0) | ||||
|  | ||||
| #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\ | ||||
| 	(elm)->field.cqe_next = (listelm)->field.cqe_next;		\ | ||||
| 	(elm)->field.cqe_prev = (listelm);				\ | ||||
| 	if ((listelm)->field.cqe_next == (void *)(head))		\ | ||||
| 		(head)->cqh_last = (elm);				\ | ||||
| 	else								\ | ||||
| 		(listelm)->field.cqe_next->field.cqe_prev = (elm);	\ | ||||
| 	(listelm)->field.cqe_next = (elm);				\ | ||||
| } while (0) | ||||
|  | ||||
| #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\ | ||||
| 	(elm)->field.cqe_next = (listelm);				\ | ||||
| 	(elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\ | ||||
| 	if ((listelm)->field.cqe_prev == (void *)(head))		\ | ||||
| 		(head)->cqh_first = (elm);				\ | ||||
| 	else								\ | ||||
| 		(listelm)->field.cqe_prev->field.cqe_next = (elm);	\ | ||||
| 	(listelm)->field.cqe_prev = (elm);				\ | ||||
| } while (0) | ||||
|  | ||||
| #define CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\ | ||||
| 	(elm)->field.cqe_next = (head)->cqh_first;			\ | ||||
| 	(elm)->field.cqe_prev = (void *)(head);				\ | ||||
| 	if ((head)->cqh_last == (void *)(head))				\ | ||||
| 		(head)->cqh_last = (elm);				\ | ||||
| 	else								\ | ||||
| 		(head)->cqh_first->field.cqe_prev = (elm);		\ | ||||
| 	(head)->cqh_first = (elm);					\ | ||||
| } while (0) | ||||
|  | ||||
| #define CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\ | ||||
| 	(elm)->field.cqe_next = (void *)(head);				\ | ||||
| 	(elm)->field.cqe_prev = (head)->cqh_last;			\ | ||||
| 	if ((head)->cqh_first == (void *)(head))			\ | ||||
| 		(head)->cqh_first = (elm);				\ | ||||
| 	else								\ | ||||
| 		(head)->cqh_last->field.cqe_next = (elm);		\ | ||||
| 	(head)->cqh_last = (elm);					\ | ||||
| } while (0) | ||||
|  | ||||
| #define CIRCLEQ_LAST(head) ((head)->cqh_last) | ||||
|  | ||||
| #define CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next) | ||||
|  | ||||
| #define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev) | ||||
|  | ||||
| #define	CIRCLEQ_REMOVE(head, elm, field) do {				\ | ||||
| 	if ((elm)->field.cqe_next == (void *)(head))			\ | ||||
| 		(head)->cqh_last = (elm)->field.cqe_prev;		\ | ||||
| 	else								\ | ||||
| 		(elm)->field.cqe_next->field.cqe_prev =			\ | ||||
| 		    (elm)->field.cqe_prev;				\ | ||||
| 	if ((elm)->field.cqe_prev == (void *)(head))			\ | ||||
| 		(head)->cqh_first = (elm)->field.cqe_next;		\ | ||||
| 	else								\ | ||||
| 		(elm)->field.cqe_prev->field.cqe_next =			\ | ||||
| 		    (elm)->field.cqe_next;				\ | ||||
| } while (0) | ||||
|  | ||||
| /* | ||||
|  * XXX insque() and remque() are an old way of handling certain queues. | ||||
|  * They bogusly assumes that all queue heads look alike. | ||||
|  */ | ||||
|  | ||||
| struct quehead | ||||
| { | ||||
|   struct quehead *qh_link; | ||||
|   struct quehead *qh_rlink; | ||||
| }; | ||||
|  | ||||
| #ifdef	__GNUC__ | ||||
|  | ||||
| static __inline void | ||||
| insque (void *a, void *b) | ||||
| { | ||||
|   struct quehead *element = a, *head = b; | ||||
|  | ||||
|   element->qh_link = head->qh_link; | ||||
|   element->qh_rlink = head; | ||||
|   head->qh_link = element; | ||||
|   element->qh_link->qh_rlink = element; | ||||
| } | ||||
|  | ||||
| static __inline void | ||||
| remque (void *a) | ||||
| { | ||||
|   struct quehead *element = a; | ||||
|  | ||||
|   element->qh_link->qh_rlink = element->qh_rlink; | ||||
|   element->qh_rlink->qh_link = element->qh_link; | ||||
|   element->qh_rlink = 0; | ||||
| } | ||||
|  | ||||
| #else /* !__GNUC__ */ | ||||
|  | ||||
| void insque __P ((void *a, void *b)); | ||||
| void remque __P ((void *a)); | ||||
|  | ||||
| #endif /* __GNUC__ */ | ||||
|  | ||||
| #endif /* __ASSEMBLER__ */ | ||||
|  | ||||
|  | ||||
| #endif /* !_SYS_QUEUE_H_ */ | ||||
							
								
								
									
										69
									
								
								libgloss/sparc_leon/asm-leon/spinlock.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								libgloss/sparc_leon/asm-leon/spinlock.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _INCLUDE_LEONSPINLOCK_h | ||||
| #define _INCLUDE_LEONSPINLOCK_h | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   unsigned char lock; | ||||
| } raw_spinlock_t; | ||||
|  | ||||
| #define __RAW_SPIN_LOCK_UNLOCKED	{ 0 } | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   volatile unsigned int lock; | ||||
| } raw_rwlock_t; | ||||
|  | ||||
| #define __RAW_RW_LOCK_UNLOCKED		{ 0 } | ||||
|  | ||||
| static inline void | ||||
| __raw_spin_lock (raw_spinlock_t * lock) | ||||
| { | ||||
|   __asm__ __volatile__ ("\n1:\n\t" "ldstuba	[%0]1, %%g2\n\t"	/* ASI_LEON23_DCACHE_MISS */ | ||||
| 			"orcc	%%g2, 0x0, %%g0\n\t" "bne,a	2f\n\t" " ldub	[%0], %%g2\n\t" ".subsection	2\n" "2:\n\t" "orcc	%%g2, 0x0, %%g0\n\t" "bne,a	2b\n\t" " ldub	[%0], %%g2\n\t" "b,a	1b\n\t" ".previous\n":	/* no outputs */ | ||||
| 			:"r" (lock):"g2", "memory", "cc"); | ||||
| } | ||||
|  | ||||
| static inline int | ||||
| __raw_spin_trylock (raw_spinlock_t * lock) | ||||
| { | ||||
|   unsigned int result; | ||||
|   __asm__ __volatile__ ("ldstuba [%1]1, %0"	/* ASI_LEON23_DCACHE_MISS */ | ||||
| 			:"=r" (result):"r" (lock):"memory"); | ||||
|   return (result == 0); | ||||
| } | ||||
|  | ||||
| static inline void | ||||
| __raw_spin_unlock (raw_spinlock_t * lock) | ||||
| { | ||||
|   __asm__ __volatile__ ("stb %%g0, [%0]"::"r" (lock):"memory"); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif /* _INCLUDE_LEONSPINLOCK_h */ | ||||
| /* end of include file */ | ||||
							
								
								
									
										77
									
								
								libgloss/sparc_leon/asm-leon/stack.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								libgloss/sparc_leon/asm-leon/stack.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _SYS_STACK_H_ | ||||
| #define	_SYS_STACK_H_ | ||||
|  | ||||
| #if !defined(_ASM) | ||||
| #include <sys/types.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef	__cplusplus | ||||
| extern "C" | ||||
| { | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * A stack frame looks like: | ||||
|  * | ||||
|  * %fp->|				| | ||||
|  *	|-------------------------------| | ||||
|  *	|  Locals, temps, saved floats	| | ||||
|  *	|-------------------------------| | ||||
|  *	|  outgoing parameters past 6	| | ||||
|  *	|-------------------------------|-\ | ||||
|  *	|  6 words for callee to dump	| | | ||||
|  *	|  register arguments		| | | ||||
|  *	|-------------------------------|  > minimum stack frame | ||||
|  *	|  One word struct-ret address	| | | ||||
|  *	|-------------------------------| | | ||||
|  *	|  16 words to save IN and	| | | ||||
|  * %sp->|  LOCAL register on overflow	| | | ||||
|  *	|-------------------------------|-/ | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Constants defining a 32-bit stack frame. | ||||
|  */ | ||||
| #define	WINDOWSIZE	(16*4)	/* size of window save area */ | ||||
| #define	ARGPUSHSIZE	(6*4)	/* size of arg dump area */ | ||||
| #define	ARGPUSH	        (WINDOWSIZE + 4)	/* arg dump area offset */ | ||||
| #define	MINFRAME	(WINDOWSIZE + ARGPUSHSIZE + 4)	/* min frame */ | ||||
|  | ||||
| #define	STACK_GROWTH_DOWN	/* stacks grow from high to low addresses */ | ||||
|  | ||||
| /* | ||||
|  * Stack alignment macros. | ||||
|  */ | ||||
| #define	STACK_ALIGN	8 | ||||
| #define	SA(X)		(((X)+(STACK_ALIGN-1)) & ~(STACK_ALIGN-1)) | ||||
|  | ||||
| #ifdef	__cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif				/* _SYS_STACK_H */ | ||||
							
								
								
									
										33
									
								
								libgloss/sparc_leon/asm-leon/time.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								libgloss/sparc_leon/asm-leon/time.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _ASMSPARC_TIME_H | ||||
| #define _ASMSPARC_TIME_H | ||||
|  | ||||
| extern struct timespec xtime; | ||||
| extern unsigned long tick_nsec;	/* nsec per tick (resolution) */ | ||||
| extern unsigned long nodotimer; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										75
									
								
								libgloss/sparc_leon/asm-leon/timer.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								libgloss/sparc_leon/asm-leon/timer.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef _ASMSPARC_TIMER_H | ||||
| #define _ASMSPARC_TIMER_H | ||||
|  | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_queue.h>*/ | ||||
| #include <sys/time.h> | ||||
| #include <asm-leon/clock.h> | ||||
|  | ||||
| #ifndef __ASSEMBLER__ | ||||
| typedef int (*timerevent_handler) (void *); | ||||
| struct timerevent | ||||
| { | ||||
|   TAILQ_ENTRY (timerevent) n; | ||||
|   struct timespec expire; | ||||
|   timerevent_handler handler; | ||||
|   void *arg; | ||||
|  | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| #define GT_TIMESPEC(t1, t2) \ | ||||
|       (t1.tv_sec > t2.tv_sec || \ | ||||
|        (t1.tv_sec == t2.tv_sec && \ | ||||
| 	t1.tv_nsec > t2.tv_nsec)) | ||||
|  | ||||
| #define GT_TIMEVAL(t1, t2) \ | ||||
|       (t1.tv_sec > t2.tv_sec || \ | ||||
|        (t1.tv_sec == t2.tv_sec && \ | ||||
| 	t1.tv_usec > t2.tv_usec)) | ||||
|  | ||||
| /* | ||||
|  * MINUS_TIME only works if src1 > src2 | ||||
|  */ | ||||
| #define MINUS_TIMEVAL(dst, src1, src2) \ | ||||
|     if ((src2).tv_usec > (src1).tv_usec) { \ | ||||
|       (dst).tv_sec = (src1).tv_sec - (src2).tv_sec - 1; \ | ||||
|       (dst).tv_usec = ((src1).tv_usec - (src2).tv_usec) + USEC_PER_SEC; \ | ||||
|     } \ | ||||
|     else { \ | ||||
|       (dst).tv_sec = (src1).tv_sec - (src2).tv_sec; \ | ||||
|       (dst).tv_usec = (src1).tv_usec - (src2).tv_usec; \ | ||||
|     } | ||||
|  | ||||
| /* Protypes */ | ||||
| #ifndef __ASSEMBLER__ | ||||
| void leonbare_init_ticks (); | ||||
| int addtimer (struct timerevent *e); | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										31
									
								
								libgloss/sparc_leon/asm-leon/types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								libgloss/sparc_leon/asm-leon/types.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef H_LEONBARE_TYPES_H | ||||
| #define H_LEONBARE_TYPES_H | ||||
|  | ||||
| typedef unsigned long long u64; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										185
									
								
								libgloss/sparc_leon/asm-leon/winmacros.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										185
									
								
								libgloss/sparc_leon/asm-leon/winmacros.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,185 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
|  | ||||
| /* Store the register window onto the 8-byte aligned area starting | ||||
|  * at %reg.  It might be %sp, it might not, we don't care. | ||||
|  */ | ||||
| #define RW_STORE(reg) \ | ||||
| 	std	%l0, [%reg + RW_L0]; \ | ||||
| 	std	%l2, [%reg + RW_L2]; \ | ||||
| 	std	%l4, [%reg + RW_L4]; \ | ||||
| 	std	%l6, [%reg + RW_L6]; \ | ||||
| 	std	%i0, [%reg + RW_I0]; \ | ||||
| 	std	%i2, [%reg + RW_I2]; \ | ||||
| 	std	%i4, [%reg + RW_I4]; \ | ||||
| 	std	%i6, [%reg + RW_I6]; | ||||
|  | ||||
| /* Load a register window from the area beginning at %reg. */ | ||||
| #define RW_LOAD(reg) \ | ||||
| 	ldd	[%reg + RW_L0], %l0; \ | ||||
| 	ldd	[%reg + RW_L2], %l2; \ | ||||
| 	ldd	[%reg + RW_L4], %l4; \ | ||||
| 	ldd	[%reg + RW_L6], %l6; \ | ||||
| 	ldd	[%reg + RW_I0], %i0; \ | ||||
| 	ldd	[%reg + RW_I2], %i2; \ | ||||
| 	ldd	[%reg + RW_I4], %i4; \ | ||||
| 	ldd	[%reg + RW_I6], %i6; | ||||
|  | ||||
| /* Loading and storing struct pt_reg trap frames. */ | ||||
| #define PT_LOAD_INS(base_reg) \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_I0], %i0; \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_I2], %i2; \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_I4], %i4; \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_I6], %i6; | ||||
|  | ||||
| #define PT_LOAD_GLOBALS(base_reg) \ | ||||
|         ld      [%base_reg + SF_REGS_SZ + PT_G1], %g1; \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_G2], %g2; \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_G4], %g4; \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_G6], %g6; | ||||
|  | ||||
| #define PT_LOAD_GLOBALS_23(base_reg) \ | ||||
|         ldd     [%base_reg + SF_REGS_SZ + PT_G2], %g2; | ||||
|  | ||||
| #define PT_LOAD_YREG(base_reg, scratch) \ | ||||
|         ld      [%base_reg + SF_REGS_SZ + PT_Y], %scratch; \ | ||||
|         wr      %scratch, 0x0, %y; | ||||
|  | ||||
| #define PT_LOAD_PRIV(base_reg, pt_psr, pt_pc, pt_npc) \ | ||||
|         ld      [%base_reg + SF_REGS_SZ + PT_PSR], %pt_psr; \ | ||||
|         ld      [%base_reg + SF_REGS_SZ + PT_PC], %pt_pc; \ | ||||
|         ld      [%base_reg + SF_REGS_SZ + PT_NPC], %pt_npc; | ||||
|  | ||||
| #define PT_LOAD_ALL(base_reg, pt_psr, pt_pc, pt_npc, scratch) \ | ||||
|         PT_LOAD_YREG(base_reg, scratch) \ | ||||
|         PT_LOAD_INS(base_reg) \ | ||||
|         PT_LOAD_GLOBALS(base_reg) \ | ||||
|         PT_LOAD_PRIV(base_reg, pt_psr, pt_pc, pt_npc) | ||||
|  | ||||
| #define PT_LOAD_ALL_FAST(base_reg, pt_psr, pt_pc, pt_npc, scratch) \ | ||||
|         PT_LOAD_YREG(base_reg, scratch) \ | ||||
|         PT_LOAD_GLOBALS(base_reg) | ||||
|  | ||||
| #define PT_STORE_INS(base_reg) \ | ||||
|         std     %i0, [%base_reg + SF_REGS_SZ + PT_I0]; \ | ||||
|         std     %i2, [%base_reg + SF_REGS_SZ + PT_I2]; \ | ||||
|         std     %i4, [%base_reg + SF_REGS_SZ + PT_I4]; \ | ||||
|         std     %i6, [%base_reg + SF_REGS_SZ + PT_I6]; | ||||
|  | ||||
| #define PT_STORE_GLOBALS(base_reg) \ | ||||
|         st      %g1, [%base_reg + SF_REGS_SZ + PT_G1]; \ | ||||
|         std     %g2, [%base_reg + SF_REGS_SZ + PT_G2]; \ | ||||
|         std     %g4, [%base_reg + SF_REGS_SZ + PT_G4]; \ | ||||
|         std     %g6, [%base_reg + SF_REGS_SZ + PT_G6]; | ||||
|  | ||||
| #define PT_STORE_GLOBALS_23(base_reg) \ | ||||
|         std     %g2, [%base_reg + SF_REGS_SZ + PT_G2]; | ||||
|  | ||||
| #define PT_STORE_YREG(base_reg, scratch) \ | ||||
|         rd      %y, %scratch; \ | ||||
|         st      %scratch, [%base_reg + SF_REGS_SZ + PT_Y]; | ||||
|  | ||||
| #define PT_STORE_PRIV(base_reg, pt_psr, pt_pc, pt_npc) \ | ||||
|         st      %pt_psr, [%base_reg + SF_REGS_SZ + PT_PSR]; \ | ||||
|         st      %pt_pc,  [%base_reg + SF_REGS_SZ + PT_PC]; \ | ||||
|         st      %pt_npc, [%base_reg + SF_REGS_SZ + PT_NPC]; | ||||
|  | ||||
| #define PT_STORE_ALL(base_reg, reg_psr, reg_pc, reg_npc, g_scratch) \ | ||||
|         PT_STORE_PRIV(base_reg, reg_psr, reg_pc, reg_npc) \ | ||||
|         PT_STORE_GLOBALS(base_reg) \ | ||||
|         PT_STORE_YREG(base_reg, g_scratch) \ | ||||
|         PT_STORE_INS(base_reg) | ||||
|  | ||||
| #define PT_STORE_ALL_FAST(base_reg, reg_psr, reg_pc, reg_npc, g_scratch) \ | ||||
|         PT_STORE_GLOBALS(base_reg) \ | ||||
|         PT_STORE_YREG(base_reg, g_scratch) | ||||
|  | ||||
| /* Store the fpu register window*/ | ||||
| #define FW_STORE(reg) \ | ||||
|         std	%f0, [reg + FW_F0]; \ | ||||
| 	std	%f2, [reg + FW_F2]; \ | ||||
| 	std	%f4, [reg + FW_F4]; \ | ||||
| 	std	%f6, [reg + FW_F6]; \ | ||||
| 	std	%f8, [reg + FW_F8]; \ | ||||
| 	std	%f10, [reg + FW_F10]; \ | ||||
| 	std	%f12, [reg + FW_F12]; \ | ||||
| 	std	%f14, [reg + FW_F14]; \ | ||||
| 	std	%f16, [reg + FW_F16]; \ | ||||
| 	std	%f18, [reg + FW_F18]; \ | ||||
| 	std	%f20, [reg + FW_F20]; \ | ||||
| 	std	%f22, [reg + FW_F22]; \ | ||||
| 	std	%f24, [reg + FW_F24]; \ | ||||
| 	std	%f26, [reg + FW_F26]; \ | ||||
| 	std	%f28, [reg + FW_F28]; \ | ||||
| 	std	%f30, [reg + FW_F30]; \ | ||||
| 	st	%fsr, [reg + FW_FSR]; | ||||
|  | ||||
| /* Load a fpu register window from the area beginning at reg. */ | ||||
| #define FW_LOAD(reg) \ | ||||
|         ldd	[reg + FW_F0], %f0; \ | ||||
| 	ldd	[reg + FW_F2], %f2; \ | ||||
| 	ldd	[reg + FW_F4], %f4; \ | ||||
| 	ldd	[reg + FW_F6], %f6; \ | ||||
| 	ldd	[reg + FW_F8], %f8; \ | ||||
| 	ldd	[reg + FW_F10], %f10; \ | ||||
| 	ldd	[reg + FW_F12], %f12; \ | ||||
| 	ldd	[reg + FW_F14], %f14; \ | ||||
| 	ldd	[reg + FW_F16], %f16; \ | ||||
| 	ldd	[reg + FW_F18], %f18; \ | ||||
| 	ldd	[reg + FW_F20], %f20; \ | ||||
| 	ldd	[reg + FW_F22], %f22; \ | ||||
| 	ldd	[reg + FW_F24], %f24; \ | ||||
| 	ldd	[reg + FW_F26], %f26; \ | ||||
| 	ldd	[reg + FW_F28], %f28; \ | ||||
| 	ldd	[reg + FW_F30], %f30; \ | ||||
| 	ld	[reg + FW_FSR], %fsr; | ||||
|  | ||||
| #define SET_WIM_CWPMIN2(psr_reg,tmp1,tmp2,tmp3,tmp4) \ | ||||
|         sethi	%hi(_nwindows_min2), %##tmp1; \ | ||||
| 	and	%##psr_reg, SPARC_PSR_WIN_MASK, %##tmp3; \ | ||||
| 	mov	1, %##tmp2; \ | ||||
| 	ld	[ %##tmp1 + %lo(_nwindows_min2)], %##tmp1; \ | ||||
|         sll	%##tmp2, %##tmp3, %##tmp3; \ | ||||
|         sll	%##tmp3, 2, %##tmp4; \ | ||||
|         srl	%##tmp3, %##tmp1, %##tmp1; \ | ||||
|         or	%##tmp4, %##tmp1, %##tmp3; \ | ||||
| 	wr      %##tmp3, 0x0, %wim; \ | ||||
|         nop; nop; nop; | ||||
|  | ||||
| #define SET_WIM_CWPMIN1(psr_reg,tmp1,tmp2,tmp3,tmp4) \ | ||||
|         sethi	%hi(_nwindows_min1), %##tmp1; \ | ||||
| 	and	%##psr_reg, SPARC_PSR_WIN_MASK, %##tmp3; \ | ||||
| 	mov	1, %##tmp2; \ | ||||
| 	ld	[ %##tmp1 + %lo(_nwindows_min1)], %##tmp1; \ | ||||
|         sll	%##tmp2, %##tmp3, %##tmp3; \ | ||||
|         sll	%##tmp3, 1, %##tmp4; \ | ||||
|         srl	%##tmp3, %##tmp1, %##tmp1; \ | ||||
|         or	%##tmp4, %##tmp1, %##tmp3; \ | ||||
| 	wr      %##tmp3, 0x0, %wim; \ | ||||
|         nop; nop; nop; | ||||
							
								
								
									
										53
									
								
								libgloss/sparc_leon/bdinit.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								libgloss/sparc_leon/bdinit.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	bdinit1 | ||||
| 	.set	bdinit1,__bdinit1 | ||||
| 	/* ------- */ | ||||
| __bdinit1: | ||||
| 	retl | ||||
| 	nop | ||||
| 	 | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	bdinit2 | ||||
| 	.set	bdinit2,__bdinit2 | ||||
| 	/* ------- */ | ||||
| __bdinit2: | ||||
| 	retl | ||||
| 	nop | ||||
|  | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	prelibchook | ||||
| 	.set	prelibchook,__prelibchook | ||||
| 	/* ------- */ | ||||
| __prelibchook: | ||||
| 	retl | ||||
| 	nop | ||||
|  | ||||
| 		 | ||||
							
								
								
									
										148
									
								
								libgloss/sparc_leon/busscan.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								libgloss/sparc_leon/busscan.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| !unsigned int ahbslv_scan(register unsigned int vendor,register unsigned int driver) { | ||||
| !  register unsigned int conf, mbar,i, *confp; | ||||
| !  register unsigned int cfg_area = (unsigned int ) (LEON3_IO_AREA | LEON3_CONF_AREA | LEON3_AHB_SLAVE_CONF_AREA); | ||||
| !  for (i = 0; i < LEON3_AHB_SLAVES; i++)  | ||||
| !  { | ||||
| !    confp = (unsigned int*)(cfg_area + (i * LEON3_AHB_CONF_WORDS * 4)); | ||||
| !    conf = *confp; | ||||
| !    //mbar = *(unsigned int*)(i * LEON3_AHB_CONF_WORDS+ (4 * 4)); | ||||
| !    if ((amba_vendor(conf) == vendor) && (amba_device(conf) == driver)) { | ||||
| !      return (unsigned int)confp; | ||||
| !    } | ||||
| !  } | ||||
| !  return 0; | ||||
| !} | ||||
|  | ||||
|                   | ||||
| 	.section	".text" | ||||
| 	.global  ahbslv_scan	 | ||||
| 	.align 4 | ||||
| 	 | ||||
| ahbslv_scan: | ||||
| 	mov	%o0, %g1 | ||||
| 	mov	-2048, %o5 | ||||
| 	mov	0, %o3 | ||||
| 	sll	%o3, 5, %o0 | ||||
| .LL11: | ||||
| 	add	%o5, %o0, %o4 | ||||
| 	ld	[%o5+%o0], %o2 | ||||
| 	srl	%o2, 24, %o0 | ||||
| 	cmp	%o0, %g1 | ||||
| 	bne,a	.LL10 | ||||
| 	add	%o3, 1, %o3 | ||||
| 	srl	%o2, 12, %o0 | ||||
| 	and	%o0, 4095, %o0 | ||||
| 	cmp	%o0, %o1 | ||||
| 	be	.LL1 | ||||
| 	mov	%o4, %o2 | ||||
| 	add	%o3, 1, %o3 | ||||
| .LL10: | ||||
| 	cmp	%o3, 7 | ||||
| 	bleu,a	.LL11 | ||||
| 	sll	%o3, 5, %o0 | ||||
| 	mov	0, %o2 | ||||
| .LL1: | ||||
| 	retl | ||||
| 	mov	%o2, %o0 | ||||
|  | ||||
|  | ||||
| !unsigned int apbslv_scan(register unsigned int base,register unsigned int vendor, register unsigned int driver) { | ||||
| !  register unsigned int conf, mbar,i, *confp; | ||||
| !  for (i = 0; i < LEON3_APB_SLAVES; i++)  | ||||
| !  { | ||||
| !    confp = (unsigned int*)(base + (i * LEON3_APB_CONF_WORDS * 4)); | ||||
| !    conf = *confp; | ||||
| !    //mbar = *(unsigned int*)(i * LEON3_AHB_CONF_WORDS+ (4 * 4)); | ||||
| !    if ((amba_vendor(conf) == vendor) && (amba_device(conf) == driver)) { | ||||
| !      return (unsigned int)confp; | ||||
| !    } | ||||
| !  } | ||||
| !  return 0; | ||||
| !} | ||||
|  | ||||
|  | ||||
| 	.section	".text" | ||||
| 	.align 4 | ||||
| 	.global  apbslv_scan | ||||
| 	 | ||||
| apbslv_scan: | ||||
| 	mov	%o0, %g1 | ||||
| 	mov	0, %o4 | ||||
| 	sll	%o4, 3, %o0 | ||||
| .LL22: | ||||
| 	add	%g1, %o0, %o5 | ||||
| 	ld	[%g1+%o0], %o3 | ||||
| 	srl	%o3, 24, %o0 | ||||
| 	cmp	%o0, %o1 | ||||
| 	bne,a	.LL21 | ||||
| 	add	%o4, 1, %o4 | ||||
| 	srl	%o3, 12, %o0 | ||||
| 	and	%o0, 4095, %o0 | ||||
| 	cmp	%o0, %o2 | ||||
| 	be	.LL12 | ||||
| 	mov	%o5, %o3 | ||||
| 	add	%o4, 1, %o4 | ||||
| .LL21: | ||||
| 	cmp	%o4, 15 | ||||
| 	bleu,a	.LL22 | ||||
| 	sll	%o4, 3, %o0 | ||||
| 	mov	0, %o3 | ||||
| .LL12: | ||||
| 	retl | ||||
| 	mov	%o3, %o0 | ||||
|  | ||||
|  | ||||
|  | ||||
| !unsigned int getbase(register unsigned int *mbar,register unsigned int iobase) { | ||||
| !  register unsigned int conf = mbar[1]; | ||||
| !  return ((iobase & 0xfff00000) | | ||||
| !          ((conf & 0xfff00000)>> 12)) & (((conf & 0x0000fff0) <<4) | 0xfff00000); | ||||
| !   | ||||
| !} | ||||
|          | ||||
|           | ||||
| 	.section	".text" | ||||
| 	.align 4 | ||||
| 	.global  iobar_getbase | ||||
|  | ||||
| iobar_getbase: | ||||
| 	ld	[%o0+4], %o2 | ||||
| 	sethi	%hi(-1048576), %o3 | ||||
| 	and	%o1, %o3, %o1 | ||||
| 	and	%o2, %o3, %o0 | ||||
| 	srl	%o0, 12, %o0 | ||||
| 	or	%o1, %o0, %o1 | ||||
| 	sethi	%hi(64512), %o0 | ||||
| 	or	%o0, 1008, %o0 | ||||
| 	and	%o2, %o0, %o2 | ||||
| 	sll	%o2, 4, %o2 | ||||
| 	or	%o2, %o3, %o2 | ||||
| 	and	%o1, %o2, %o1 | ||||
| 	retl | ||||
| 	mov	%o1, %o0 | ||||
|          | ||||
							
								
								
									
										51
									
								
								libgloss/sparc_leon/cacheA.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								libgloss/sparc_leon/cacheA.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
|          | ||||
|         .seg    "data" | ||||
| 	.global sparc_leon23_cache_flush, sparc_leon23_icache_flush, sparc_leon23_dcache_flush | ||||
| 	 | ||||
| 	.global _leon_version | ||||
| 	 | ||||
| 	.seg    "text" | ||||
|  | ||||
| /* =============================================== */ | ||||
| 	 | ||||
| /* use only %o7 */	 | ||||
| sparc_leon23_icache_flush: | ||||
| sparc_leon3_icache_flush: | ||||
| 	retl | ||||
| sparc_leon23_cache_flush:	 | ||||
| sparc_leon3_cache_flush: | ||||
| 	sta %g0, [%g0] ASI_LEON3_IFLUSH | ||||
| sparc_leon23_dcache_flush:	 | ||||
| sparc_leon3_dcache_flush: | ||||
| 	retl | ||||
| 	 sta %g0, [%g0] ASI_LEON3_DFLUSH | ||||
|  | ||||
|  | ||||
| 	 | ||||
							
								
								
									
										117
									
								
								libgloss/sparc_leon/catch_interrupt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								libgloss/sparc_leon/catch_interrupt.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #define NULL 0 | ||||
| struct irqaction *_irqtbl[32] = | ||||
|   { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||
| 0, 0, 0, 0, 0, 0, 0 }; | ||||
| struct irqaction _oirqtbl[32] = | ||||
|   { INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, | ||||
|   INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, | ||||
|   INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, | ||||
|   INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, | ||||
|   INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, | ||||
|   INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, | ||||
|   INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, | ||||
|   INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION, INIT_IRQACTION | ||||
| }; | ||||
|  | ||||
| int | ||||
| catch_interrupt (int func, int irq) | ||||
| { | ||||
|   struct irqaction *a = _irqtbl[irq]; | ||||
|   struct irqaction *n = &_oirqtbl[irq]; | ||||
|   if (irq >= 32) | ||||
|     return 0; | ||||
|  | ||||
|   while (a) | ||||
|     { | ||||
|       if (a == n) | ||||
| 	{ | ||||
| 	  int tmp = (int) a->handler; | ||||
| 	  a->handler = (irqhandler) func; | ||||
| 	  return tmp; | ||||
| 	} | ||||
|       a = a->next; | ||||
|     } | ||||
|   n->handler = (irqhandler) func; | ||||
|   chained_catch_interrupt (irq, n); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| chained_catch_interrupt (int irq, struct irqaction *a) | ||||
| { | ||||
|   a->next = _irqtbl[irq]; | ||||
|   _irqtbl[irq] = a; | ||||
| } | ||||
|  | ||||
| int no_inirq_check = 0; | ||||
| int inirq[32] = { 0, 0, 0, 0, 0, 0, 0, 0, | ||||
|   0, 0, 0, 0, 0, 0, 0, 0, | ||||
|   0, 0, 0, 0, 0, 0, 0, 0, | ||||
|   0, 0, 0, 0, 0, 0, 0, 0 | ||||
| }; | ||||
| extern struct irqmp_type irqmp; | ||||
|  | ||||
| void (*handler_irq_pre) (void) = 0; | ||||
| void (*handler_irq_post) (void) = 0; | ||||
| handler_irq (int irq, struct leonbare_pt_regs *pt_regs) | ||||
| { | ||||
|   struct irqaction *a; | ||||
|  | ||||
|   if (irq == irqmp.eirq) | ||||
|     irq = irqmp.addr[48] & 0x1f; | ||||
|   if (!irq) | ||||
|     irq = irqmp.eirq; | ||||
|  | ||||
|   a = _irqtbl[irq]; | ||||
|  | ||||
|   while (a) | ||||
|     { | ||||
|       if (a->handler) | ||||
| 	{ | ||||
| #ifndef CONFIG_LEONBARE_NONESTEDIRQ | ||||
| 	  if (no_inirq_check || !(inirq[irq])) | ||||
| 	    { | ||||
| #endif | ||||
| 	      inirq[irq]++; | ||||
| 	      if (handler_irq_pre) | ||||
| 		handler_irq_pre (); | ||||
| 	      a->handler (irq, a->dev_id, pt_regs); | ||||
| 	      if (handler_irq_post) | ||||
| 		handler_irq_post (); | ||||
| 	      inirq[irq]--; | ||||
| #ifndef CONFIG_LEONBARE_NONESTEDIRQ | ||||
| 	    } | ||||
| #endif | ||||
| 	} | ||||
|       a = a->next; | ||||
|     } | ||||
| } | ||||
|  | ||||
| schedulehandler schedule_callback = 0; | ||||
							
								
								
									
										55
									
								
								libgloss/sparc_leon/catch_interrupt_mvt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								libgloss/sparc_leon/catch_interrupt_mvt.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #define NULL 0 | ||||
|  | ||||
|  | ||||
| /* multi vector trapping version of trap handler installs */ | ||||
| int | ||||
| mvtlolevelirqinstall (int irqnr, void (*handler) ()) | ||||
| { | ||||
|   unsigned long h = (unsigned long) handler; | ||||
|   unsigned long *addr = | ||||
|     (unsigned long *) ((locore_readtbr () & ~0xFFF) + 0x100 + (16 * irqnr)); | ||||
|  | ||||
|   if (irqnr == 0 || irqnr >= 15) | ||||
|     { | ||||
|       return 0; | ||||
|     } | ||||
|  | ||||
|   addr[0] = ((h >> 10) & 0x3fffff) | 0x29000000;	/* 29000000: sethi   %hi(handler), %l4       */ | ||||
|   addr[1] = ((h) & 0x3ff) | 0x81c52000;	/* 81c52000: jmpl    %l4 + %lo(handler), %g0 */ | ||||
|   addr[2] = 0x01000000;		/* 01000000: nop */ | ||||
|   addr[3] = 0x01000000;		/* 01000000: nop */ | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| int | ||||
| lolevelirqinstall (int irqnr, void (*handler) ()) | ||||
| { | ||||
|   return mvtlolevelirqinstall (irqnr, handler); | ||||
| } | ||||
							
								
								
									
										64
									
								
								libgloss/sparc_leon/catch_interrupt_pending.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								libgloss/sparc_leon/catch_interrupt_pending.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #define NULL 0 | ||||
|  | ||||
| TAILQ_HEAD (pending_queue, pendingaction) pending = | ||||
| TAILQ_HEAD_INITIALIZER (pending); | ||||
|  | ||||
|      void add_pending (struct pendingaction *a) | ||||
| { | ||||
|   unsigned long old = leonbare_disable_traps (); | ||||
|   TAILQ_INSERT_TAIL (&pending, a, next); | ||||
|   leonbare_enable_traps (old); | ||||
| } | ||||
|  | ||||
| struct pendingaction * | ||||
| get_pending () | ||||
| { | ||||
|   struct pendingaction *a = 0; | ||||
|   unsigned long old = leonbare_disable_traps (); | ||||
|   if (a = TAILQ_FIRST (&pending)) | ||||
|     { | ||||
|       TAILQ_REMOVE (&pending, a, next); | ||||
|     } | ||||
|   leonbare_enable_traps (old); | ||||
|   return a; | ||||
| } | ||||
|  | ||||
| void | ||||
| process_pending () | ||||
| { | ||||
|   struct pendingaction *a; | ||||
|   while (a = get_pending ()) | ||||
|     { | ||||
|       if (a->handler) | ||||
| 	{ | ||||
| 	  a->handler (a->arg); | ||||
| 	} | ||||
|     } | ||||
| } | ||||
							
								
								
									
										76
									
								
								libgloss/sparc_leon/catch_interrupt_svt.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								libgloss/sparc_leon/catch_interrupt_svt.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #define NULL 0 | ||||
|  | ||||
| /* single vector trapping version of trap handler installs */ | ||||
| struct svt_trap_entry | ||||
| { | ||||
|   int start, end, func; | ||||
| }; | ||||
| extern struct svt_trap_entry trap_table[28]; | ||||
| extern struct svt_trap_entry svt_trap_table_ext[17]; | ||||
| extern struct svt_trap_entry svt_trap_table_ext_end; | ||||
|  | ||||
| static struct svt_trap_entry * | ||||
| gettrap_pos (int nr) | ||||
| { | ||||
|   struct svt_trap_entry *p = trap_table; | ||||
|   while ((p->start) || (p->end) || (p->func)) | ||||
|     { | ||||
|       if (p->start <= nr && p->end >= nr) | ||||
| 	{ | ||||
| 	  break; | ||||
| 	} | ||||
|       p++; | ||||
|     } | ||||
|   return p; | ||||
| } | ||||
|  | ||||
| int | ||||
| svtloleveltrapinstall (int trap, void (*handler) ()) | ||||
| { | ||||
|   struct svt_trap_entry *p = gettrap_pos (trap); | ||||
|   if (p >= &svt_trap_table_ext_end) | ||||
|     { | ||||
|       return 0; | ||||
|     } | ||||
|   p->start = trap; | ||||
|   p->end = trap; | ||||
|   p->func = handler; | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| int | ||||
| svtlolevelirqinstall (int irqnr, void (*handler) ()) | ||||
| { | ||||
|   if (irqnr == 0 || irqnr >= 15) | ||||
|     { | ||||
|       return 0; | ||||
|     } | ||||
|   return svtloleveltrapinstall (irqnr + 0x10, handler); | ||||
| } | ||||
							
								
								
									
										3877
									
								
								libgloss/sparc_leon/configure
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										3877
									
								
								libgloss/sparc_leon/configure
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										58
									
								
								libgloss/sparc_leon/configure.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								libgloss/sparc_leon/configure.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| dnl Process this file with autoconf to produce a configure script. | ||||
| AC_PREREQ(2.59) | ||||
| AC_INIT(crt0.S) | ||||
|  | ||||
| if test "${enable_shared}" = "yes" ; then | ||||
|     echo "Shared libraries not supported for cross compiling, ignored" | ||||
| fi | ||||
|  | ||||
| if test "$srcdir" = "." ; then | ||||
|   if test "${with_target_subdir}" != "." ; then | ||||
|     libgloss_topdir="${srcdir}/${with_multisrctop}../../.." | ||||
|   else | ||||
|     libgloss_topdir="${srcdir}/${with_multisrctop}../.." | ||||
|   fi | ||||
| else | ||||
|   libgloss_topdir="${srcdir}/../.." | ||||
| fi | ||||
| AC_CONFIG_AUX_DIR($libgloss_topdir) | ||||
|  | ||||
| AC_CANONICAL_SYSTEM | ||||
| AC_ARG_PROGRAM | ||||
|  | ||||
| AC_PROG_INSTALL | ||||
|  | ||||
| LIB_AC_PROG_CC | ||||
| AS=${AS-as} | ||||
| AC_SUBST(AS) | ||||
| AR=${AR-ar} | ||||
| AC_SUBST(AR) | ||||
| LD=${LD-ld} | ||||
| AC_SUBST(LD) | ||||
| AC_PROG_RANLIB | ||||
| LIB_AM_PROG_AS | ||||
|  | ||||
| host_makefile_frag=${srcdir}/../config/default.mh | ||||
| target_makefile_frag=${srcdir}/../config/default.mt | ||||
|  | ||||
| dnl We have to assign the same value to other variables because autoconf | ||||
| dnl doesn't provide a mechanism to substitute a replacement keyword with | ||||
| dnl arbitrary data or pathnames. | ||||
| dnl | ||||
| host_makefile_frag_path=$host_makefile_frag | ||||
| AC_SUBST(host_makefile_frag_path) | ||||
| AC_SUBST_FILE(host_makefile_frag) | ||||
| target_makefile_frag_path=$target_makefile_frag | ||||
| AC_SUBST(target_makefile_frag_path) | ||||
| AC_SUBST_FILE(target_makefile_frag) | ||||
|  | ||||
| AC_CONFIG_FILES(Makefile, | ||||
| . ${libgloss_topdir}/config-ml.in, | ||||
| srcdir=${srcdir} | ||||
| target=${target} | ||||
| with_multisubdir=${with_multisubdir} | ||||
| ac_configure_args="${ac_configure_args} --enable-multilib" | ||||
| CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} | ||||
| libgloss_topdir=${libgloss_topdir} | ||||
| ) | ||||
| AC_OUTPUT | ||||
							
								
								
									
										29
									
								
								libgloss/sparc_leon/console.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								libgloss/sparc_leon/console.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
|  | ||||
| int *console = (int *) 0x80000100; | ||||
							
								
								
									
										354
									
								
								libgloss/sparc_leon/console_dbg.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										354
									
								
								libgloss/sparc_leon/console_dbg.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,354 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <ctype.h> | ||||
| #ifdef _HAVE_STDC | ||||
| #include <stdarg.h> | ||||
| #else | ||||
| #include <varargs.h> | ||||
| #endif | ||||
| #include <asm-leon/leoncompat.h> | ||||
| #include <asm-leon/leon.h> | ||||
|  | ||||
| static size_t | ||||
| lo_strnlen (const char *s, size_t count) | ||||
| { | ||||
|   const char *sc; | ||||
|  | ||||
|   for (sc = s; count-- && *sc != '\0'; ++sc) | ||||
|     /* nothing */ ; | ||||
|   return sc - s; | ||||
| } | ||||
|  | ||||
| static int | ||||
| lo_vsnprintf (char *buf, size_t size, const char *fmt, va_list args) | ||||
| { | ||||
|   int len; | ||||
|   unsigned long long num; | ||||
|   int i, j, n; | ||||
|   char *str, *end, c; | ||||
|   const char *s; | ||||
|   int flags; | ||||
|   int field_width; | ||||
|   int precision; | ||||
|   int qualifier; | ||||
|   int filler; | ||||
|  | ||||
|   str = buf; | ||||
|   end = buf + size - 1; | ||||
|  | ||||
|   if (end < buf - 1) | ||||
|     { | ||||
|       end = ((void *) -1); | ||||
|       size = end - buf + 1; | ||||
|     } | ||||
|  | ||||
|   for (; *fmt; ++fmt) | ||||
|     { | ||||
|       if (*fmt != '%') | ||||
| 	{ | ||||
| 	  if (*fmt == '\n') | ||||
| 	    { | ||||
| 	      if (str <= end) | ||||
| 		{ | ||||
| 		  *str = '\r'; | ||||
| 		} | ||||
| 	      str++; | ||||
| 	    } | ||||
| 	  if (str <= end) | ||||
| 	    *str = *fmt; | ||||
| 	  ++str; | ||||
| 	  continue; | ||||
| 	} | ||||
|  | ||||
|       /* process flags */ | ||||
|       flags = 0; | ||||
|       /* get field width */ | ||||
|       field_width = 0; | ||||
|       /* get the precision */ | ||||
|       precision = -1; | ||||
|       /* get the conversion qualifier */ | ||||
|       qualifier = 'l'; | ||||
|       filler = ' '; | ||||
|  | ||||
|       ++fmt; | ||||
|  | ||||
|       if (*fmt == '0') | ||||
| 	{ | ||||
| 	  filler = '0'; | ||||
| 	  ++fmt; | ||||
| 	} | ||||
|  | ||||
|       while (isdigit (*fmt)) | ||||
| 	{ | ||||
| 	  field_width = field_width * 10 + ((*fmt) - '0'); | ||||
| 	  ++fmt; | ||||
| 	} | ||||
|  | ||||
|       /* default base */ | ||||
|       switch (*fmt) | ||||
| 	{ | ||||
| 	case 'c': | ||||
| 	  c = (unsigned char) va_arg (args, int); | ||||
| 	  if (str <= end) | ||||
| 	    *str = c; | ||||
| 	  ++str; | ||||
| 	  while (--field_width > 0) | ||||
| 	    { | ||||
| 	      if (str <= end) | ||||
| 		*str = ' '; | ||||
| 	      ++str; | ||||
| 	    } | ||||
| 	  continue; | ||||
|  | ||||
| 	case 's': | ||||
| 	  s = va_arg (args, char *); | ||||
| 	  if (!s) | ||||
| 	    s = "<NULL>"; | ||||
|  | ||||
| 	  len = lo_strnlen (s, precision); | ||||
|  | ||||
| 	  for (i = 0; i < len; ++i) | ||||
| 	    { | ||||
| 	      if (str <= end) | ||||
| 		*str = *s; | ||||
| 	      ++str; | ||||
| 	      ++s; | ||||
| 	    } | ||||
| 	  while (len < field_width--) | ||||
| 	    { | ||||
| 	      if (str <= end) | ||||
| 		*str = ' '; | ||||
| 	      ++str; | ||||
| 	    } | ||||
| 	  continue; | ||||
|  | ||||
|  | ||||
| 	case '%': | ||||
| 	  if (str <= end) | ||||
| 	    *str = '%'; | ||||
| 	  ++str; | ||||
| 	  continue; | ||||
|  | ||||
| 	case 'x': | ||||
| 	  break; | ||||
| 	case 'd': | ||||
| 	  break; | ||||
|  | ||||
| 	default: | ||||
| 	  if (str <= end) | ||||
| 	    *str = '%'; | ||||
| 	  ++str; | ||||
| 	  if (*fmt) | ||||
| 	    { | ||||
| 	      if (str <= end) | ||||
| 		*str = *fmt; | ||||
| 	      ++str; | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      --fmt; | ||||
| 	    } | ||||
| 	  continue; | ||||
| 	} | ||||
|       num = va_arg (args, unsigned long); | ||||
|       if (*fmt == 'd') | ||||
| 	{ | ||||
| 	  j = 0; | ||||
| 	  while (num && str <= end) | ||||
| 	    { | ||||
| 	      *str = (num % 10) + '0'; | ||||
| 	      num = num / 10; | ||||
| 	      ++str; | ||||
| 	      j++; | ||||
| 	    } | ||||
| 	  /* flip */ | ||||
| 	  for (i = 0; i < (j / 2); i++) | ||||
| 	    { | ||||
| 	      n = str[(-j) + i]; | ||||
| 	      str[(-j) + i] = str[-(i + 1)]; | ||||
| 	      str[-(i + 1)] = n; | ||||
| 	    } | ||||
| 	  /* shift */ | ||||
| 	  if (field_width > j) | ||||
| 	    { | ||||
| 	      i = field_width - j; | ||||
| 	      for (n = 1; n <= j; n++) | ||||
| 		{ | ||||
| 		  if (str + i - n <= end) | ||||
| 		    { | ||||
| 		      str[i - n] = str[-n]; | ||||
| 		    } | ||||
| 		} | ||||
| 	      for (i--; i >= 0; i--) | ||||
| 		{ | ||||
| 		  str[i - j] = filler; | ||||
| 		} | ||||
| 	      str += field_width - j; | ||||
| 	      j = 1; | ||||
| 	    } | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  for (j = 0, i = 0; i < 8 && str <= end; i++) | ||||
| 	    { | ||||
| 	      if ((n = | ||||
| 		   ((unsigned long) (num & (0xf0000000ul >> (i * 4)))) >> | ||||
| 		   ((7 - i) * 4)) || j != 0) | ||||
| 		{ | ||||
| 		  if (n >= 10) | ||||
| 		    n += 'a' - 10; | ||||
| 		  else | ||||
| 		    n += '0'; | ||||
| 		  *str = n; | ||||
| 		  ++str; | ||||
| 		  j++; | ||||
| 		} | ||||
| 	    } | ||||
|  | ||||
| 	  /* shift */ | ||||
| 	  if (field_width > j) | ||||
| 	    { | ||||
| 	      i = field_width - j; | ||||
| 	      for (n = 1; n <= j; n++) | ||||
| 		{ | ||||
| 		  if (str + i - n <= end) | ||||
| 		    { | ||||
| 		      str[i - n] = str[-n]; | ||||
| 		    } | ||||
| 		} | ||||
| 	      for (i--; i >= 0; i--) | ||||
| 		{ | ||||
| 		  str[i - j] = filler; | ||||
| 		} | ||||
| 	      str += field_width - j; | ||||
| 	      j = 1; | ||||
| 	    } | ||||
|  | ||||
|  | ||||
| 	} | ||||
|  | ||||
|       if (j == 0 && str <= end) | ||||
| 	{ | ||||
| 	  *str = '0'; | ||||
| 	  ++str; | ||||
| 	} | ||||
|     } | ||||
|   if (str <= end) | ||||
|     *str = '\0'; | ||||
|   else if (size > 0) | ||||
|     /* don't write out a null byte if the buf size is zero */ | ||||
|     *end = '\0'; | ||||
|   /* the trailing null byte doesn't count towards the total | ||||
|    * ++str; | ||||
|    */ | ||||
|   return str - buf; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * lo_vsprintf - Format a string and place it in a buffer | ||||
|  * @buf: The buffer to place the result into | ||||
|  * @fmt: The format string to use | ||||
|  * @args: Arguments for the format string | ||||
|  * | ||||
|  * Call this function if you are already dealing with a va_list. | ||||
|  * You probably want lo_sprintf instead. | ||||
|  */ | ||||
| static int | ||||
| lo_vsprintf (char *buf, const char *fmt, va_list args) | ||||
| { | ||||
|   return lo_vsnprintf (buf, 0xFFFFFFFFUL, fmt, args); | ||||
| } | ||||
|  | ||||
|  | ||||
| int | ||||
| dbgleon_sprintf (char *buf, size_t size, const char *fmt, ...) | ||||
| { | ||||
|   va_list args; | ||||
|   int printed_len; | ||||
|  | ||||
|   va_start (args, fmt); | ||||
|   printed_len = lo_vsnprintf (buf, size, fmt, args); | ||||
|   va_end (args); | ||||
|   return printed_len; | ||||
| } | ||||
|  | ||||
| #define UART_TIMEOUT 100000 | ||||
| static LEON23_APBUART_Regs_Map *uart_regs = 0; | ||||
| int | ||||
| dbgleon_printf (const char *fmt, ...) | ||||
| { | ||||
|   unsigned int i, loops, ch; | ||||
|   amba_apb_device apbdevs[1]; | ||||
|   va_list args; | ||||
|   int printed_len; | ||||
|   char printk_buf[1024]; | ||||
|   char *p = printk_buf; | ||||
|  | ||||
|   /* Emit the output into the temporary buffer */ | ||||
|   va_start (args, fmt); | ||||
|   printed_len = lo_vsnprintf (printk_buf, sizeof (printk_buf), fmt, args); | ||||
|   va_end (args); | ||||
|  | ||||
|   //--------------------- | ||||
|   switch (LEONCOMPAT_VERSION) | ||||
|     { | ||||
|     case 3: | ||||
|     default: | ||||
|       { | ||||
| 	if (!uart_regs) | ||||
| 	  { | ||||
| 	    if (i = | ||||
| 		leon3_getapbbase (VENDOR_GAISLER, GAISLER_APBUART, apbdevs, | ||||
| 				  1)) | ||||
| 	      { | ||||
| 		uart_regs = (LEON23_APBUART_Regs_Map *) apbdevs[0].start; | ||||
| 	      } | ||||
| 	  } | ||||
| 	if (uart_regs) | ||||
| 	  { | ||||
| 	    while (printed_len-- != 0) | ||||
| 	      { | ||||
| 		ch = *p++; | ||||
| 		if (uart_regs) | ||||
| 		  { | ||||
| 		    loops = 0; | ||||
| 		    while (!(uart_regs->status & LEON_REG_UART_STATUS_THE) | ||||
| 			   && (loops < UART_TIMEOUT)) | ||||
| 		      loops++; | ||||
| 		    uart_regs->data = ch; | ||||
| 		    loops = 0; | ||||
| 		    while (!(uart_regs->status & LEON_REG_UART_STATUS_TSE) | ||||
| 			   && (loops < UART_TIMEOUT)) | ||||
| 		      loops++; | ||||
| 		  } | ||||
| 	      } | ||||
| 	  } | ||||
|       } | ||||
|       break; | ||||
|     } | ||||
|   //--------------------- | ||||
| } | ||||
							
								
								
									
										34
									
								
								libgloss/sparc_leon/console_init.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								libgloss/sparc_leon/console_init.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| extern int *console; | ||||
|  | ||||
| console_init (unsigned int *addr, int freq, int baud) | ||||
| { | ||||
|   console = addr; | ||||
|   addr[1] = 0; | ||||
|   addr[2] = 3; | ||||
|   addr[3] = (freq / baud + 8) / 16 - 1; | ||||
| } | ||||
							
								
								
									
										121
									
								
								libgloss/sparc_leon/contextswitch.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								libgloss/sparc_leon/contextswitch.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #include <asm-leon/time.h> | ||||
| #include <asm-leon/contextswitch.h> | ||||
|  | ||||
| /* This asm code relies on the following offsets (setjmp.h):  | ||||
| #define THREAD_JB_SP     0  | ||||
| #define THREAD_JB_PC     1 | ||||
| #define THREAD_JB_PSR    8  | ||||
| #define THREAD_JB_WIM    9 */ | ||||
|  | ||||
| int | ||||
| _do_thread_setjmp (threadctx_t env, unsigned int savesigs) | ||||
| { | ||||
|  | ||||
| #ifndef _FLAT | ||||
|   /* first restore should trap */ | ||||
|   env[THREAD_JB_WIM] = 1 << ((env[THREAD_JB_PSR] & SPARC_PSR_WIN_MASK) + 1); | ||||
|   env[THREAD_JB_WIM] |= env[THREAD_JB_WIM] >> SPARC_NUM_REGWIN; | ||||
| #else | ||||
|   env[THREAD_JB_WIM] = 0; | ||||
| #endif | ||||
|  | ||||
| #ifndef _SOFT_FLOAT | ||||
|   env[THREAD_JB_FPUCTX] = fpustate_current; | ||||
| #endif | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| thread_longjmp (threadctx_t env, int val) | ||||
| { | ||||
|  | ||||
|   if (!val) | ||||
|     val = 1; | ||||
|  | ||||
| #ifndef _SOFT_FLOAT | ||||
|   fpustate_current = env[THREAD_JB_FPUCTX]; | ||||
| #endif | ||||
|  | ||||
|   _switch_to (env, val); | ||||
|  | ||||
| /*   __asm__ __volatile__(                                                                      \ */ | ||||
| /* "        mov     %8,%%i0              /\* propagate on restore *\/                        \n\t"\ */ | ||||
| /* "        mov     %0,%%i1              /\* propagate on restore *\/                        \n\t"\ */ | ||||
| /* "        restore                                                                        \n\t"\ */ | ||||
| /* "        mov     %%o0,%%g6                                                              \n\t"\ */ | ||||
| /* "        mov     %%o1,%%g3            /\* former %%i1 (val) *\/                           \n\t"\ */ | ||||
| /* "                                                                                       \n\t"\ */ | ||||
| /* "        !ta      0x03                /\* flush registers *\/                             \n\t"\ */ | ||||
| /* "        save   %%sp, %7, %%sp                                                          \n\t"\ */ | ||||
| /* "        save   %%sp, %7, %%sp                                                          \n\t"\ */ | ||||
| /* "        save   %%sp, %7, %%sp                                                          \n\t"\ */ | ||||
| /* "        save   %%sp, %7, %%sp                                                          \n\t"\ */ | ||||
| /* "        save   %%sp, %7, %%sp                                                          \n\t"\ */ | ||||
| /* "        save   %%sp, %7, %%sp                                                          \n\t"\ */ | ||||
| /* "        save   %%sp, %7, %%sp                                                          \n\t"\ */ | ||||
| /* "                                                                                       \n\t"\ */ | ||||
| /* "        ldd     [%%g6+%5], %%g4      /\* load psr,wim *\/                                \n\t"\ */ | ||||
| /* "        wr      %%g4, 0x20, %%psr                                                      \n\t"\ */ | ||||
| /* "        nop                                                                            \n\t"\ */ | ||||
| /* "        nop                                                                            \n\t"\ */ | ||||
| /* "        nop                                                                            \n\t"\ */ | ||||
| /* "        ldd     [%%g6 +%1], %%sp     /\* load sp, pc to jump to *\/                      \n\t"\ */ | ||||
| /* "        wr      %%g5, 0x0, %%wim                                                       \n\t"\ */ | ||||
| /* "                                                                                       \n\t"\ */ | ||||
| /* "        ldd     [%%sp], %%l0         /\* restore window *\/                              \n\t"\ */ | ||||
| /* "        ldd     [%%sp+8], %%l2                                                         \n\t"\ */ | ||||
| /* "        ldd     [%%sp+16], %%l4                                                        \n\t"\ */ | ||||
| /* "        ldd     [%%sp+24], %%l6                                                        \n\t"\ */ | ||||
| /* "                                                                                       \n\t"\ */ | ||||
| /* "        ldd     [%%sp+32], %%i0                                                        \n\t"\ */ | ||||
| /* "        ldd     [%%sp+40], %%i2                                                        \n\t"\ */ | ||||
| /* "        ldd     [%%sp+48], %%i4                                                        \n\t"\ */ | ||||
| /* "        ldd     [%%sp+56], %%i6                                                        \n\t"\ */ | ||||
| /* "        wr      %%g4, 0x00, %%psr                                                      \n\t"\ */ | ||||
| /* "        nop                                                                            \n\t"\ */ | ||||
| /* "        nop                                                                            \n\t"\ */ | ||||
| /* "        nop                                                                            \n\t"\ */ | ||||
| /* "                                                                                       \n\t"\ */ | ||||
| /* "        jmp     %%o7 + 8             /\* success      *\/                                \n\t"\ */ | ||||
| /* "        mov     %%g3, %%o0           /\* return %%g3  *\/                                \n\t"\ */ | ||||
| /* : : /\* %0 *\/ "r" (val),                                                                      \ */ | ||||
| /*     /\* %1 *\/ "i" (sizeof(int) * THREAD_JB_SP),                                                      \ */ | ||||
| /*     /\* %2 *\/ "i" (sizeof(int) * THREAD_JB_I7),                                                      \ */ | ||||
| /*     /\* %3 *\/ "i" (sizeof(int) * THREAD_JB_FP),                                                      \ */ | ||||
| /*     /\* %4 *\/ "i" (sizeof(int) * THREAD_JB_PC),                                                      \ */ | ||||
| /*     /\* %5 *\/ "i" (sizeof(int) * THREAD_JB_PSR),                                                     \ */ | ||||
| /*     /\* %6 *\/ "i" (sizeof(int) * THREAD_JB_WIM),                                                     \ */ | ||||
| /*     /\* %7 *\/ "i" (-SF_REGS_SZ),                                                                     \ */ | ||||
| /*     /\* %8 *\/ "r" (env) );                                                                       */ | ||||
|  | ||||
|   /* never come here */ | ||||
| } | ||||
							
								
								
									
										101
									
								
								libgloss/sparc_leon/contextswitch_asm.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								libgloss/sparc_leon/contextswitch_asm.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
|  | ||||
| /* This asm code relies on the following offsets (setjmp.h):  | ||||
| #define THREAD_JB_SP     0  | ||||
| #define THREAD_JB_PC     1 | ||||
| #define THREAD_JB_PSR    8  | ||||
| #define THREAD_JB_WIM    9 */ | ||||
|  | ||||
| 	/* Number of register windows */ | ||||
| 	.global _nwindows_min1, _nwindows | ||||
|  | ||||
| 	.text | ||||
| 	.global _switch_to | ||||
| _switch_to:	 | ||||
|    | ||||
| #ifndef _FLAT | ||||
|         !mov     %o0,%i0                   /* propagate env on restore */                         | ||||
|         !mov     %o1,%i1                   /* propagate val on restore */                         | ||||
|         !restore                                                                         | ||||
|         mov     %o0,%g7                                                               | ||||
|         mov     %o1,%g3                   /* former %%i1 (val) */                            | ||||
| 	 | ||||
| 	sethi %hi(_nwindows_min1), %g4    /* flush registers */ | ||||
| 	ld [%g4+%lo(_nwindows_min1)], %g4 | ||||
| 1:	save   %sp, -SF_REGS_SZ, %sp	 !NWINDOWS-1 times | ||||
| 	sub    %g4,1,%g4 | ||||
| 	cmp    %g0,%g4 | ||||
| 	bne    1b | ||||
| 	 nop | ||||
| #else | ||||
|         mov     %o0,%g7                                                               | ||||
|         mov     %o1,%g3                   /* former %%i1 (val) */ | ||||
| 	RW_STORE(sp) | ||||
| #endif | ||||
| 	 | ||||
|         ldd     [%g7+THREAD_JB_PSR*4], %g4 /* load psr,wim */                                 | ||||
|         wr      %g4, 0x20, %psr                                                       | ||||
|         nop                                                                             | ||||
|         nop                                                                             | ||||
|         nop                                                                             | ||||
|         ldd     [%g7 +THREAD_JB_SP*4], %sp /* load sp, pc to jump to */                       | ||||
|         wr      %g5, 0x0, %wim                                                        | ||||
|          | ||||
| 	RW_LOAD(sp)                       /* restore window */  | ||||
|         wr      %g4, 0x00, %psr                                                       | ||||
|         nop                                                                             | ||||
|         nop                                                                             | ||||
|         nop                                                                             | ||||
|                                                                                         | ||||
|         jmp     %o7 + 8                   /* success      */                                 | ||||
|         mov     %g3, %o0                  /* return %%g3  */                                 | ||||
| 	 | ||||
|   | ||||
|  | ||||
|         .text                                     | ||||
| 	.global thread_setjmp, _do_thread_setjmp  | ||||
| thread_setjmp:                                   | ||||
|  | ||||
| #ifdef _FLAT | ||||
| 	RW_STORE(sp)                      /* store window */ | ||||
| #endif | ||||
|  | ||||
| !	RW_STORE(sp)                      /* store window for _FLAT and normal, SWITCH_TO_STACK in pthread need this*/ | ||||
| 		 | ||||
| 	mov %psr,%o2                             | ||||
| #ifndef _SOFT_FLOAT | ||||
|         set 0x1000,%o3                           | ||||
|         andn %o2,%o3,%o2      !disable fpu | ||||
| #endif	 | ||||
|         std %sp,[%o0]         !THREAD_JB_SP      | ||||
|         st  %o2,[%o0+(8*4)]   !THREAD_JB_PSR     | ||||
|         ba _do_thread_setjmp                     | ||||
|          nop                                     | ||||
							
								
								
									
										91
									
								
								libgloss/sparc_leon/crt0.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								libgloss/sparc_leon/crt0.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| 	.text | ||||
| 	.global _start, main, _end | ||||
|  | ||||
| _start: | ||||
|  | ||||
| #ifndef _FLAT | ||||
| 	save	%sp, -64, %sp | ||||
| #else | ||||
| 	add	%sp, -72, %sp | ||||
| 	st	%o7, [%sp+64] | ||||
| #endif | ||||
|         /* clear the bss */ | ||||
|   | ||||
|         sethi %hi(__bss_start),%g2 | ||||
|         or    %g2,%lo(__bss_start),%g2  ! g2 = start of bss | ||||
|         sethi %hi(_end),%g3 | ||||
|         or    %g3,%lo(_end),%g3         ! g3 = end of bss | ||||
|         mov   %g0,%g1                   ! so std has two zeros | ||||
| 	sub   %g3, %g2, %g3 | ||||
| zerobss: | ||||
| 	subcc  %g3, 8, %g3 | ||||
| 	bge,a   zerobss | ||||
| 	std    %g0,[%g2+%g3] | ||||
|  | ||||
| 	set    _end, %o0 | ||||
| 	st     %g0,[%o0] | ||||
|  | ||||
| 	call	bdinit2 | ||||
| 	 nop | ||||
|  | ||||
| 	call	prelibchook | ||||
| 	 nop | ||||
|  | ||||
| 	call	_call_initcalls        /* atexit uses __atexit lock */ | ||||
| 	 nop | ||||
| 	 | ||||
| 	set	_fini, %o0 | ||||
| 	call	atexit, 1 | ||||
| 	 nop | ||||
| 	 | ||||
| 	call	_init | ||||
| 	 nop | ||||
|          | ||||
| 	call    main | ||||
|          nop | ||||
| 	call _exit | ||||
| 	nop | ||||
| #ifndef _FLAT | ||||
| 	ret | ||||
| 	restore | ||||
| #else | ||||
| 	ld	[%sp+64], %o7 | ||||
| 	retl | ||||
| 	add	%sp, 72, %sp | ||||
| #endif | ||||
|  | ||||
|         .seg    "data" | ||||
|         .global .bdata | ||||
| .bdata: | ||||
|         .align  8 | ||||
|         .global _environ | ||||
| _environ: | ||||
|         .word   1 | ||||
|   | ||||
|  | ||||
|  | ||||
							
								
								
									
										69
									
								
								libgloss/sparc_leon/crti.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								libgloss/sparc_leon/crti.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| !   Copyright (C) 1992 Free Software Foundation, Inc. | ||||
| !   Written By David Vinayak Henkel-Wallace, June 1992 | ||||
| !  | ||||
| ! This file 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. | ||||
| !  | ||||
| ! In addition to the permissions in the GNU General Public License, the | ||||
| ! Free Software Foundation gives you unlimited permission to link the | ||||
| ! compiled version of this file with other programs, and to distribute | ||||
| ! those programs without any restriction coming from the use of this | ||||
| ! file.  (The General Public License restrictions do apply in other | ||||
| ! respects; for example, they cover modification of the file, and | ||||
| ! distribution when not linked into another program.) | ||||
| !  | ||||
| ! This file 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 this program; see the file COPYING.  If not, write to | ||||
| ! the Free Software Foundation, 59 Temple Place - Suite 330, | ||||
| ! Boston, MA 02111-1307, USA. | ||||
| !  | ||||
| !    As a special exception, if you link this library with files | ||||
| !    compiled with GCC to produce an executable, this does not cause | ||||
| !    the resulting executable to be covered by the GNU General Public License. | ||||
| !    This exception does not however invalidate any other reasons why | ||||
| !    the executable file might be covered by the GNU General Public License. | ||||
| !  | ||||
|  | ||||
| ! This file just make a stack frame for the contents of the .fini and | ||||
| ! .init sections.  Users may put any desired instructions in those | ||||
| ! sections. | ||||
|  | ||||
| ! This file is linked in before the Values-Xx.o files and also before | ||||
| ! crtbegin, with which perhaps it should be merged. | ||||
|  | ||||
|  | ||||
| 	.section	".init" | ||||
| 	.global	_init | ||||
| 	.type	_init,#function | ||||
| 	.align	4 | ||||
| _init: | ||||
| #ifndef _FLAT | ||||
| 	save	%sp, -96, %sp | ||||
| #else | ||||
| 	add	%sp, -96, %sp | ||||
| 	st	%o7, [%sp + 64] | ||||
| #endif | ||||
| 	 | ||||
| 	 | ||||
| 	.section	".fini" | ||||
| 	.global	_fini | ||||
| 	.type	_fini,#function | ||||
| 	.align	4 | ||||
| _fini: | ||||
| #ifndef _FLAT | ||||
| 	save	%sp, -96, %sp | ||||
| #else | ||||
| 	add	%sp, -96, %sp | ||||
| 	st	%o7, [%sp + 64] | ||||
| #endif | ||||
|  | ||||
| 	  | ||||
|  | ||||
|  | ||||
							
								
								
									
										63
									
								
								libgloss/sparc_leon/crtn.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								libgloss/sparc_leon/crtn.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
|  | ||||
| !   Copyright (C) 1992 Free Software Foundation, Inc. | ||||
| !   Written By David Vinayak Henkel-Wallace, June 1992 | ||||
| !  | ||||
| ! This file 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. | ||||
| !  | ||||
| ! In addition to the permissions in the GNU General Public License, the | ||||
| ! Free Software Foundation gives you unlimited permission to link the | ||||
| ! compiled version of this file with other programs, and to distribute | ||||
| ! those programs without any restriction coming from the use of this | ||||
| ! file.  (The General Public License restrictions do apply in other | ||||
| ! respects; for example, they cover modification of the file, and | ||||
| ! distribution when not linked into another program.) | ||||
| !  | ||||
| ! This file 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 this program; see the file COPYING.  If not, write to | ||||
| ! the Free Software Foundation, 59 Temple Place - Suite 330, | ||||
| ! Boston, MA 02111-1307, USA. | ||||
| !  | ||||
| !    As a special exception, if you link this library with files | ||||
| !    compiled with GCC to produce an executable, this does not cause | ||||
| !    the resulting executable to be covered by the GNU General Public License. | ||||
| !    This exception does not however invalidate any other reasons why | ||||
| !    the executable file might be covered by the GNU General Public License. | ||||
| !  | ||||
|  | ||||
| ! This file just makes sure that the .fini and .init sections do in | ||||
| ! fact return.  Users may put any desired instructions in those sections. | ||||
| ! This file is the last thing linked into any executable. | ||||
|  | ||||
| 	.file		"crtn.s" | ||||
|  | ||||
| 	.section	".init" | ||||
| 	.align		4 | ||||
| #ifndef _FLAT | ||||
| 	ret | ||||
| 	restore | ||||
| #else | ||||
| 	ld	[%sp+64], %o7 | ||||
| 	retl | ||||
| 	add	%sp, 96, %sp | ||||
| #endif | ||||
|  | ||||
| 	.section	".fini" | ||||
| 	.align		4 | ||||
|  | ||||
| #ifndef _FLAT | ||||
| 	ret | ||||
| 	restore | ||||
| #else | ||||
| 	ld	[%sp+64], %o7 | ||||
| 	retl | ||||
| 	add	%sp, 96, %sp | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										113
									
								
								libgloss/sparc_leon/etrap.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								libgloss/sparc_leon/etrap.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,113 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|          | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
|          | ||||
| /* Registers to not touch at all. */ | ||||
| #define t_psr        l0 /* Set by caller */ | ||||
| #define t_pc         l1 /* Set by caller */ | ||||
| #define t_npc        l2 /* Set by caller */ | ||||
| #define t_wim        l3 /* Set by caller */ | ||||
| #define t_twinmask   l4 /* Set at beginning of this entry routine. */ | ||||
| #define t_kstack     l5 /* Set right before pt_regs frame is built */ | ||||
| #define t_retpc      l6 /* If you change this, change winmacro.h header file */ | ||||
| #define t_systable   l7 /* Never touch this, could be the syscall table ptr. */ | ||||
| #define curptr       g6 /* Set after pt_regs frame is built */ | ||||
|  | ||||
| 	/* Number of register windows */ | ||||
| 	.global _nwindows_min1, _nwindows | ||||
|  | ||||
|         .text | ||||
| 	.align 4 | ||||
| 	.globl	leonbare_trapsetup | ||||
|  | ||||
| leonbare_trapsetup: | ||||
|  | ||||
| #ifdef 	_FLAT | ||||
| 	restore | ||||
| 	RW_STORE(sp) | ||||
| 	save | ||||
| #endif | ||||
|  | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	/* build a pt_regs trap frame. */ | ||||
|         sub	%fp, (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ), %t_kstack | ||||
| 	PT_STORE_ALL(t_kstack, t_psr, t_pc, t_npc, g2) | ||||
| 	 | ||||
| 	/* build a fp_regs trap frame. */ | ||||
| 	sethi %hi(fpustate_current), %g2 | ||||
| 	ld [%g2+%lo(fpustate_current)], %g3 | ||||
| 	st %g3,[%t_kstack + (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ - 4)]  | ||||
| 	add %t_kstack,SF_REGS_SZ + PT_REGS_SZ,%g3 | ||||
| 	st %g3, [%g2+%lo(fpustate_current)] | ||||
| 	 | ||||
| #else	 | ||||
| 	/* build a pt_regs trap frame. | ||||
| 	 */ | ||||
|         sub	%fp, (SF_REGS_SZ + PT_REGS_SZ), %t_kstack | ||||
| 	PT_STORE_ALL(t_kstack, t_psr, t_pc, t_npc, g2) | ||||
| #endif | ||||
| 	 | ||||
|  | ||||
| #ifndef _FLAT | ||||
|         /* See if we are in the trap window. */ | ||||
| 	mov	1, %t_twinmask | ||||
| 	sll	%t_twinmask, %t_psr, %t_twinmask ! t_twinmask = (1 << psr) | ||||
| 	andcc	%t_twinmask, %t_wim, %g0 | ||||
| 	beq	1f		! in trap window, clean up | ||||
| 	 nop | ||||
|  | ||||
|                 /*-------------------------------------------------*/ | ||||
|                 /* Spill , adjust %wim and go. */ | ||||
|                 srl	%t_wim, 0x1, %g2	! begin computation of new %wim | ||||
| 		 | ||||
| 		sethi %hi(_nwindows_min1), %g3 | ||||
| 		ld [%g3+%lo(_nwindows_min1)], %g3 | ||||
|  | ||||
|                 sll	%t_wim, %g3, %t_wim	! NWINDOWS-1 | ||||
|                 or	%t_wim, %g2, %g2 | ||||
|                 and	%g2, 0xff, %g2		 | ||||
|          | ||||
|                 save	%g0, %g0, %g0           ! get in window to be saved | ||||
|          | ||||
|         	/* Set new %wim value */ | ||||
|                 wr	%g2, 0x0, %wim | ||||
|  | ||||
|         	/* Save the kernel window onto the corresponding stack. */ | ||||
|                 RW_STORE(sp) | ||||
|          | ||||
|         	restore	%g0, %g0, %g0 | ||||
|                 /*-------------------------------------------------*/ | ||||
|          | ||||
| 1:                 | ||||
| #endif | ||||
| 	/* Trap from kernel with a window available. | ||||
| 	 * Just do it... | ||||
| 	 */ | ||||
| 	jmpl	%t_retpc + 0x8, %g0	! return to caller | ||||
| 	 mov	%t_kstack, %sp		! jump onto new stack | ||||
|          | ||||
|          | ||||
							
								
								
									
										121
									
								
								libgloss/sparc_leon/etrap_fast.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								libgloss/sparc_leon/etrap_fast.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|          | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
|          | ||||
| /* Registers to not touch at all. */ | ||||
| #define t_psr        l0 /* Set by caller */ | ||||
| #define t_pc         l1 /* Set by caller */ | ||||
| #define t_npc        l2 /* Set by caller */ | ||||
| #define t_wim        l3 /* Set by caller */ | ||||
| #define t_twinmask   l4 /* Set at beginning of this entry routine. */ | ||||
| #define t_kstack     l5 /* Set right before pt_regs frame is built */ | ||||
| #define t_retpc      l6 /* If you change this, change winmacro.h header file */ | ||||
| #define t_systable   l7 /* Never touch this, could be the syscall table ptr. */ | ||||
| #define curptr       g6 /* Set after pt_regs frame is built */ | ||||
|  | ||||
| 	/* Number of register windows */ | ||||
| 	.global _nwindows_min1, _nwindows | ||||
|  | ||||
|         .text | ||||
| 	.align 4 | ||||
| 	.globl	leonbare_trapsetup_fast | ||||
|  | ||||
| /* etap entry special for irqtrap.S */ | ||||
| leonbare_trapsetup_fast: | ||||
|  | ||||
| #ifdef 	_FLAT | ||||
| 	restore | ||||
| 	RW_STORE(sp) | ||||
| 	save | ||||
| #endif | ||||
|  | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	/* build a pt_regs trap frame. */ | ||||
|         sub	%fp, (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ), %t_kstack | ||||
| 	st 	%t_psr, [%t_kstack + (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ - 8)] /* sparc_fpuwindow_regs.irqpsr  */  | ||||
| 	 | ||||
| 	set	SPARC_PSR_EF_MASK, %t_twinmask | ||||
| 	andn	%t_psr, %t_twinmask, %t_psr	          ! fpu off | ||||
| 	 | ||||
| 	PT_STORE_ALL_FAST(t_kstack, t_psr, t_pc, t_npc, g2) | ||||
|         /*PT_STORE_GLOBALS(t_kstack)*/  | ||||
| 	 | ||||
| 	/* build a fp_regs trap frame. */ | ||||
| 	sethi %hi(fpustate_current), %g2 | ||||
| 	ld [%g2+%lo(fpustate_current)], %g3 | ||||
| 	st %g3,[%t_kstack + (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ - 4)]    /* sparc_fpuwindow_regs.lastctx */ | ||||
| 	add %t_kstack,SF_REGS_SZ + PT_REGS_SZ,%g3 | ||||
| 	st 	%g3, [%g2+%lo(fpustate_current)] | ||||
| 	st	%g0, [%g3 + FW_FSR] | ||||
| #else	 | ||||
| 	/* build a pt_regs trap frame. | ||||
| 	 */ | ||||
|         sub	%fp, (SF_REGS_SZ + PT_REGS_SZ), %t_kstack | ||||
| 	PT_STORE_ALL_FAST(t_kstack, t_psr, t_pc, t_npc, g2) | ||||
| 	/*PT_STORE_GLOBALS(t_kstack)*/ | ||||
| #endif | ||||
| 	 | ||||
|  | ||||
| #ifndef _FLAT | ||||
|         /* See if we are in the trap window . */ | ||||
| 	mov	1, %t_twinmask | ||||
| 	sll	%t_twinmask, %t_psr, %t_twinmask ! t_twinmask = (1 << psr) | ||||
| 	andcc	%t_twinmask, %t_wim, %g0 | ||||
| 	beq	1f		! in trap window, clean up | ||||
| 	 nop | ||||
|  | ||||
|                 /*-------------------------------------------------*/ | ||||
|                 /* Spill , adjust %wim and go. */ | ||||
|                 srl	%t_wim, 0x1, %g2	! begin computation of new %wim | ||||
| 		 | ||||
| 		sethi %hi(_nwindows_min1), %g3 | ||||
| 		ld [%g3+%lo(_nwindows_min1)], %g3 | ||||
|  | ||||
|                 sll	%t_wim, %g3, %t_wim	! NWINDOWS-1 | ||||
|                 or	%t_wim, %g2, %g2 | ||||
|                 and	%g2, 0xff, %g2		 | ||||
|          | ||||
|                 save	%g0, %g0, %g0           ! get in window to be saved | ||||
|          | ||||
|         	/* Set new %wim value */ | ||||
|                 wr	%g2, 0x0, %wim | ||||
|  | ||||
|         	/* Save the kernel window onto the corresponding stack. */ | ||||
|                 RW_STORE(sp) | ||||
|          | ||||
|         	restore	%g0, %g0, %g0 | ||||
|                 /*-------------------------------------------------*/ | ||||
|          | ||||
| 1:                 | ||||
| #endif | ||||
| 	/* Trap from kernel with a window available. | ||||
| 	 * Just do it... | ||||
| 	 */ | ||||
| 	jmpl	%t_retpc + 0x8, %g0	! return to caller | ||||
| 	 mov	%t_kstack, %sp		! jump onto new stack | ||||
|          | ||||
|          | ||||
							
								
								
									
										111
									
								
								libgloss/sparc_leon/fpu.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								libgloss/sparc_leon/fpu.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/asmmacro.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
| #include <asm-leon/leon.h> | ||||
| 	 | ||||
| #ifndef _SOFT_FLOAT | ||||
|  | ||||
|   	.seg    "text" | ||||
| 	/* ------- */ | ||||
|   	.weak	_fpdis_enable_svt | ||||
| 	.set	_fpdis_enable_svt,__fpdis_enable_svt | ||||
|   	.weak	_fpdis_enable | ||||
| 	.set	_fpdis_enable,__fpdis_enable | ||||
| 	/* ------- */ | ||||
| 	!.global _fpdis_enable,_fpdis_enable_svt | ||||
| __fpdis_enable_svt: | ||||
| __fpdis_enable: | ||||
|  | ||||
| 	set SPARC_PSR_EF_MASK,%l3 | ||||
| 	or %l0,%l3,%l0 | ||||
| 	or %l0,0xf00, %l3		! PIL up to 15, enable fpu | ||||
| 	wr %l3,0, %psr		        ! restore the condition flags, enable fpu | ||||
| 	nop | ||||
| 	nop | ||||
| 	nop | ||||
| 	 | ||||
| 	mov	%psr, %l3		! check if fpu is present | ||||
| 	set SPARC_PSR_EF_MASK,%l4 | ||||
| 	andcc	%l3, %l4, %l3 | ||||
| 	bne	4f | ||||
| 	 nop | ||||
| 	 | ||||
| 	 ta	0                       ! no fpu present, halt | ||||
| 	 | ||||
| 4: | ||||
| 	set     fpustate_current,%l4 | ||||
| 	 | ||||
| 	ld [%l4],%l4 | ||||
| 	set     fpustate_owner,%l5 | ||||
| 	ld [%l5],%l5 | ||||
| 	cmp	%l4,%l5 | ||||
| 	beq	mpfnostore | ||||
| 	 nop | ||||
| 	cmp    %g0,%l5 | ||||
| 	 beq	mpfstore | ||||
| 	nop | ||||
|  | ||||
| 	FW_STORE(%l5) | ||||
| 	 | ||||
| mpfstore:	 | ||||
| 	set     fpustate_owner,%l6 | ||||
| 	st %l4,[%l6] | ||||
| 	cmp    %g0,%l4 | ||||
| 	 beq	mpfnostore | ||||
| 	nop | ||||
| 	 | ||||
| 	FW_LOAD(%l4) | ||||
|  | ||||
| mpfnostore:	 | ||||
| 	wr	%l0,0, %psr		! restore the condition flags, enable fpu | ||||
| 	nop | ||||
| 	nop | ||||
| 	nop | ||||
| 	 | ||||
| 	jmpl	%l1,  %g0 | ||||
| 	rett	%l2 | ||||
| 	 | ||||
|   	.seg    "data" | ||||
|  | ||||
| 	.global fpustate_default | ||||
| 	.align	8 | ||||
| fpustate_default: | ||||
| 	.long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; | ||||
| 	.long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; | ||||
| 	.long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; | ||||
| 	.long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; | ||||
| 	.long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; .long 0; | ||||
| 	.global fpustate_owner | ||||
| fpustate_owner: | ||||
| 	.word	fpustate_default				! pointer to FPU owning context | ||||
| 	 | ||||
|  	.global fpustate_current	 | ||||
| fpustate_current:	 | ||||
| 	.word	fpustate_default				! pointer to current threads FPU context | ||||
| 	         | ||||
| #endif | ||||
							
								
								
									
										272
									
								
								libgloss/sparc_leon/gettimeofday.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								libgloss/sparc_leon/gettimeofday.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,272 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/errno.h> | ||||
| #include <asm-leon/elfmacro.h> | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #include <asm-leon/jiffies.h> | ||||
| #include <asm-leon/param.h> | ||||
| #include <asm-leon/leoncompat.h> | ||||
|  | ||||
| static __inline__ unsigned long do_gettimeoffset (); | ||||
|  | ||||
|  | ||||
| extern int *rtc; | ||||
|  | ||||
| unsigned long wall_jiffies = INITIAL_JIFFIES; | ||||
| unsigned long tick_nsec = TICK_NSEC; | ||||
| unsigned long tick_usec = TICK_NSEC / 1000; | ||||
| unsigned long seperateirq = 1; | ||||
| unsigned long noalarm = 1; | ||||
| unsigned long force_noalarm = 0; | ||||
| unsigned long nodotimer = 0; | ||||
| int leonbare_hz = HZ; | ||||
|  | ||||
|  | ||||
| void settimer (); | ||||
| inline void | ||||
| do_timer (struct leonbare_pt_regs *regs) | ||||
| { | ||||
|   unsigned long ticks; | ||||
|   jiffies_64++; | ||||
|   ticks = jiffies - wall_jiffies; | ||||
|   if (ticks) | ||||
|     { | ||||
|       wall_jiffies += ticks; | ||||
|       do | ||||
| 	{ | ||||
| 	  ticks--; | ||||
| 	  xtime.tv_nsec += tick_nsec; | ||||
| 	  if (xtime.tv_nsec >= 1000000000) | ||||
| 	    { | ||||
| 	      xtime.tv_nsec -= 1000000000; | ||||
| 	      xtime.tv_sec++; | ||||
| 	    } | ||||
| 	} | ||||
|       while (ticks); | ||||
|     } | ||||
|   settimer (); | ||||
| } | ||||
|  | ||||
| int | ||||
| leonbare_alarm (int irq, void *arg, struct leonbare_pt_regs *regs) | ||||
| { | ||||
|   settimer (); | ||||
| } | ||||
|  | ||||
| extern clock_t (*clock_custom) (void); | ||||
| clock_t | ||||
| leonbare_clock_custom () | ||||
| { | ||||
|   int hz = leonbare_hz ? leonbare_hz : HZ; | ||||
|   return (clock_t) ((jiffies * (CLOCK_TICK_RATE / hz)) + do_gettimeoffset ()); | ||||
| } | ||||
|  | ||||
|  | ||||
| tickerhandler ticker_callback = 0; | ||||
| int | ||||
| leonbare_tick (int irq, void *arg, struct leonbare_pt_regs *regs) | ||||
| { | ||||
|   unsigned int ctrl; | ||||
|   if (!seperateirq) | ||||
|     { | ||||
|       /* only leon3 comes here */ | ||||
|       if (!noalarm) | ||||
| 	{ | ||||
| 	  ctrl = LEON3_GpTimer_Regs->e[1].ctrl; | ||||
| 	  if (ctrl & LEON3_GPTIMER_IP) | ||||
| 	    { | ||||
| 	      leonbare_alarm (irq, arg, regs); | ||||
| 	      LEON3_GpTimer_Regs->e[1].ctrl = ctrl & ~LEON3_GPTIMER_IP; | ||||
| 	    } | ||||
| 	} | ||||
|       ctrl = LEON3_GpTimer_Regs->e[0].ctrl; | ||||
|       if (!(ctrl & LEON3_GPTIMER_IP)) | ||||
| 	{ | ||||
| 	  return 0; | ||||
| 	} | ||||
|       LEON3_GpTimer_Regs->e[0].ctrl = ctrl & ~LEON3_GPTIMER_IP; | ||||
|     } | ||||
|  | ||||
|   if (!nodotimer) | ||||
|     { | ||||
|       do_timer (regs); | ||||
|     } | ||||
|   if (ticker_callback) | ||||
|     { | ||||
|       ticker_callback (regs); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static struct irqaction irqact1 = { (irqhandler) leonbare_tick, 0, 0, 0 }; | ||||
| static struct irqaction irqact2 = { (irqhandler) leonbare_alarm, 0, 0, 0 }; | ||||
|  | ||||
| void | ||||
| leonbare_init_ticks () | ||||
| { | ||||
|   int i, irq1 = 0, irq2 = 0; | ||||
|   int hz = leonbare_hz ? leonbare_hz : HZ; | ||||
|   amba_apb_device dev[1]; | ||||
|  | ||||
|   //--------------------- | ||||
|   switch (LEONCOMPAT_VERSION) | ||||
|     { | ||||
|     case 3: | ||||
|     default: | ||||
|       amba_init (); | ||||
|       if (LEON3_GpTimer_Regs && LEON3_IrqCtrl_Regs) | ||||
| 	{ | ||||
| 	  if ((LEON3_GpTimer_Regs->config & LEON3_GPTIMER_CONFIG_TIMERMASK) >= | ||||
| 	      2 && force_noalarm == 0) | ||||
| 	    noalarm = 0; | ||||
| 	  if (!(LEON3_GpTimer_Regs->config & LEON3_GPTIMER_CONFIG_SEPERATE)) | ||||
| 	    seperateirq = 0; | ||||
| 	  LEON3_GpTimer_Regs->e[0].val = 0; | ||||
| 	  LEON3_GpTimer_Regs->e[0].rld = (((CLOCK_TICK_RATE / hz) - 1)); | ||||
| 	  LEON3_GpTimer_Regs->e[0].ctrl = 0; | ||||
| 	  LEON3_GpTimer_Regs->e[0].ctrl = | ||||
| 	    LEON3_GPTIMER_EN | | ||||
| 	    LEON3_GPTIMER_RL | LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN; | ||||
| 	  irq1 = LEON3_GpTimer_Irq; | ||||
| 	  irq2 = LEON3_GpTimer_Irq + 1; | ||||
| 	} | ||||
|       break; | ||||
|     } | ||||
|   //--------------------- | ||||
|  | ||||
|   if (irq1) | ||||
|     { | ||||
|       clock_custom = leonbare_clock_custom; | ||||
|       chained_catch_interrupt (irq1, &irqact1); | ||||
|       leonbare_enable_irq (irq1); | ||||
|     } | ||||
|   if (irq2 && (!noalarm) && seperateirq) | ||||
|     { | ||||
|       chained_catch_interrupt (irq2, &irqact2); | ||||
|       leonbare_enable_irq (irq2); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
|  | ||||
| static __inline__ unsigned long | ||||
| do_gettimeoffset () | ||||
| { | ||||
|   unsigned long usec = 0; | ||||
|   //--------------------- | ||||
|   switch (LEONCOMPAT_VERSION) | ||||
|     { | ||||
|     case 3: | ||||
|     default: | ||||
|       usec = ((LEON3_GpTimer_Regs->e[0].rld & 0x7fffff) - | ||||
| 	      (LEON3_GpTimer_Regs->e[0].val & 0x7fffff)); | ||||
|       break; | ||||
|     } | ||||
|   //--------------------- | ||||
|   return usec; | ||||
| } | ||||
|  | ||||
| /* get usec (timeval)  resolution, | ||||
|  * could use nsec (timespec) because pthread use it  (todo) */ | ||||
| void | ||||
| do_gettimeofday (struct timeval *tv) | ||||
| { | ||||
|  | ||||
|   unsigned long flags; | ||||
|   unsigned long seq; | ||||
|   unsigned long usec, sec; | ||||
|  | ||||
|   do | ||||
|     { | ||||
|       unsigned long lost; | ||||
|       seq = jiffies; | ||||
|  | ||||
|       usec = do_gettimeoffset (); | ||||
|       lost = jiffies - wall_jiffies; | ||||
|  | ||||
|       if (unlikely (lost)) | ||||
| 	{ | ||||
| 	  usec += lost * tick_usec; | ||||
| 	} | ||||
|  | ||||
|       sec = xtime.tv_sec; | ||||
|       usec += (xtime.tv_nsec / 1000); | ||||
|     } | ||||
|   while (seq != jiffies); | ||||
|  | ||||
|   while (usec >= 1000000) | ||||
|     { | ||||
|       usec -= 1000000; | ||||
|       sec++; | ||||
|     } | ||||
|  | ||||
|   tv->tv_sec = sec; | ||||
|   tv->tv_usec = usec; | ||||
| } | ||||
|  | ||||
| int | ||||
| gettimeofday (struct timeval *__p, void *__tz) | ||||
| { | ||||
|   do_gettimeofday (__p); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| //''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
|  | ||||
| static int | ||||
| do_settimeofday (struct timespec *tv) | ||||
| { | ||||
|   time_t sec = tv->tv_sec; | ||||
|   long nsec = tv->tv_nsec; | ||||
|  | ||||
|   if ((unsigned long) nsec >= NSEC_PER_SEC) | ||||
|     return EINVAL; | ||||
|  | ||||
|   /* | ||||
|    * This is revolting. We need to set "xtime" correctly. However, the | ||||
|    * value in this location is the value at the most recent update of | ||||
|    * wall time.  Discover what correction gettimeofday() would have | ||||
|    * made, and then undo it! | ||||
|    */ | ||||
|   nsec -= 1000 * (do_gettimeoffset () + | ||||
| 		  (jiffies - wall_jiffies) * (USEC_PER_SEC / HZ)); | ||||
|  | ||||
|   set_normalized_timespec (&xtime, sec, nsec); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| settimeofday (const struct timeval *tv, const struct timezone *tz) | ||||
| { | ||||
|   struct timespec ts; | ||||
|   ts.tv_sec = tv->tv_sec; | ||||
|   ts.tv_nsec = tv->tv_usec * NSEC_PER_USEC; | ||||
|   return do_settimeofday (&ts); | ||||
| } | ||||
							
								
								
									
										45
									
								
								libgloss/sparc_leon/initcalls.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								libgloss/sparc_leon/initcalls.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/elfmacro.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| void | ||||
| _call_initcalls () | ||||
| { | ||||
|  | ||||
|   initcall_t *p = &__leonbare_initcall_start; | ||||
|   while (p < &__leonbare_initcall_end) | ||||
|     { | ||||
|       if (*p) | ||||
| 	{ | ||||
| 	  (*p) (); | ||||
| 	} | ||||
|       p++; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										53
									
								
								libgloss/sparc_leon/io.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								libgloss/sparc_leon/io.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #define DREADY 1 | ||||
| #define TREADY 4 | ||||
|  | ||||
| extern volatile int *console; | ||||
|  | ||||
| void | ||||
| outbyte (int c) | ||||
| { | ||||
|   volatile int *rxstat; | ||||
|   volatile int *rxadata; | ||||
|   int rxmask; | ||||
|   while ((console[1] & TREADY) == 0); | ||||
|   console[0] = (0x0ff & c); | ||||
|   if (c == '\n') | ||||
|     { | ||||
|       while ((console[1] & TREADY) == 0); | ||||
|       console[0] = (int) '\r'; | ||||
|     } | ||||
| } | ||||
|  | ||||
| int | ||||
| inbyte (void) | ||||
| { | ||||
|   if (!console) | ||||
|     return (0); | ||||
|   while (!(console[1] & DREADY)); | ||||
|   return console[0]; | ||||
| } | ||||
							
								
								
									
										41
									
								
								libgloss/sparc_leon/irqinstall.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								libgloss/sparc_leon/irqinstall.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
|  | ||||
| 	/* l0: psr | ||||
| 	   l1: pc | ||||
| 	   l2: npc | ||||
| 	   l3: wim | ||||
| 	   l7: irqnr */	  | ||||
|           | ||||
|   	.seg    "text" | ||||
|  | ||||
|         .global locore_readtbr | ||||
|  | ||||
| locore_readtbr: | ||||
| 	retl | ||||
| 	 rd	%tbr,%o0 | ||||
|  | ||||
							
								
								
									
										108
									
								
								libgloss/sparc_leon/irqtrap.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								libgloss/sparc_leon/irqtrap.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
| #include <asm-leon/leon.h> | ||||
|  | ||||
| 	/* l0: psr | ||||
| 	   l1: pc | ||||
| 	   l2: npc | ||||
| 	   l3: wim | ||||
| 	   l7: irqnr */	  | ||||
|           | ||||
|   	.seg    "text" | ||||
|  | ||||
| 	/* ------- */ | ||||
|   	.weak	_leonbare_irq_entry_svt | ||||
| 	.set	_leonbare_irq_entry_svt,__leonbare_irq_entry_svt | ||||
|   	.weak	leonbare_irq_entry | ||||
| 	.set	leonbare_irq_entry,_leonbare_irq_entry | ||||
| 	/* ------- */ | ||||
|         !.global leonbare_irq_entry,_leonbare_irq_entry_svt | ||||
|         .global _irqtbl, _irqtrap, handler_irq, fpustate_current | ||||
|  | ||||
| __leonbare_irq_entry_svt:	 /* irq from svt trap dispatcher */ | ||||
| 	sub %l6,0x10, %l7  | ||||
| 	rd %wim, %l3 | ||||
| 	 | ||||
| _leonbare_irq_entry:		 | ||||
| 	set	SPARC_PSR_EF_MASK,%l6 | ||||
| 	andn	%l0, %l6, %l0	                   ! fpu off | ||||
| 	 | ||||
| 	SAVE_ALL | ||||
|  | ||||
| 	set     nestcount,%o0 | ||||
| 	ld      [%o0],%o1 | ||||
| 	add	%o1,1,%o1 | ||||
| 	st      %o1,[%o0] | ||||
| 	 | ||||
| #ifdef CONFIG_LEONBARE_NONESTEDIRQ	 | ||||
|         or	%l0, SPARC_PSR_PIL_MASK, %o0       ! no nested irqs | ||||
| 	wr	%o0, SPARC_PSR_ET_MASK, %psr | ||||
| 	WRITE_PAUSE | ||||
| #else | ||||
| 	sll     %l7,SPARC_PSR_PIL_SHIFT,%o1 | ||||
| 	andn	%l0,SPARC_PSR_PIL_MASK,%o0 | ||||
| 	or	%l0, %o1, %o1 | ||||
| 	set     nestedirq,%o0 | ||||
| 	ld      [%o0],%o0 | ||||
|         cmp     %g0,%o0                            ! no nested irqs? | ||||
| 	beq,a   .L1 | ||||
|         or	%o1, SPARC_PSR_PIL_MASK, %o1        | ||||
| .L1:	 | ||||
| 	wr	%o1, SPARC_PSR_ET_MASK, %psr | ||||
| 	WRITE_PAUSE | ||||
| #endif | ||||
| 	         | ||||
|         mov	%l7, %o0                           ! irq level | ||||
|         call	handler_irq                        ! void handler_irq (int irq, struct leonbare_pt_regs *pt_regs)  | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	 add	%sp, FW_REGS_SZ + 8 + SF_REGS_SZ , %o1	! pt_regs ptr | ||||
| #else | ||||
| 	 add	%sp, SF_REGS_SZ , %o1		   ! pt_regs ptr | ||||
| #endif | ||||
| 		 | ||||
| 	or      %l0, SPARC_PSR_PIL_MASK, %o1 | ||||
| 	wr	%o1, SPARC_PSR_ET_MASK, %psr	   ! enable nesting again, keep ET up  | ||||
| 	WRITE_PAUSE | ||||
| 	 | ||||
| 	set     nestcount,%o0 | ||||
| 	ld      [%o0],%o1 | ||||
| 	sub	%o1,1,%o1 | ||||
| 	st      %o1,[%o0] | ||||
| 	 | ||||
| 	RESTORE_ALL | ||||
|  | ||||
|         .seg    "data" | ||||
|         .global nestedirq | ||||
| 	.align  4 | ||||
| nestedirq: | ||||
|         .long   0 | ||||
|         .global nestcount | ||||
| 	.align  4 | ||||
| nestcount: | ||||
|         .long   0 | ||||
							
								
								
									
										128
									
								
								libgloss/sparc_leon/irqtrap_fast.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								libgloss/sparc_leon/irqtrap_fast.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
| #include <asm-leon/leon.h> | ||||
|  | ||||
| 	/* l0: psr | ||||
| 	   l1: pc | ||||
| 	   l2: npc | ||||
| 	   l3: wim | ||||
| 	   l7: irqnr */	  | ||||
|           | ||||
|   	.seg    "text" | ||||
|  | ||||
| 	/* ------- */ | ||||
|   	.weak	_leonbare_irq_entry_svt | ||||
| 	.set	_leonbare_irq_entry_svt,__leonbare_irq_entry_svt | ||||
|   	.weak	leonbare_irq_entry | ||||
| 	.set	leonbare_irq_entry,_leonbare_irq_entry | ||||
| 	/* ------- */ | ||||
|         !.global leonbare_irq_entry,_leonbare_irq_entry_svt | ||||
|         .global _irqtbl, _irqtrap, handler_irq, fpustate_current | ||||
|  | ||||
| #define FASTIRQ_ENABLE	 | ||||
| /*#define FASTIRQ_DYNAMIC*/	/* depend on FASTIRQ_ENABLE */ | ||||
| 	 | ||||
| __leonbare_irq_entry_svt:	 /* irq from svt trap dispatcher */ | ||||
| 	sub %l6,0x10, %l7  | ||||
| 	rd %wim, %l3 | ||||
| 	 | ||||
| _leonbare_irq_entry:	 | ||||
|  | ||||
| 	SAVE_ALL_FAST(.L3)                        ! fast irq processing, volatile %g6, use frame  | ||||
| 	 | ||||
| .L3: | ||||
| #ifdef __threadx__	 | ||||
| 	set	_tx_thread_system_state, %o0 | ||||
| 	ld      [%o0],%o1 | ||||
| 	add	%o1,1,%o1 | ||||
| 	st      %o1,[%o0] | ||||
| #endif | ||||
| 	 | ||||
| 	set     nestcount,%o0 | ||||
| 	ld      [%o0],%o1 | ||||
| 	add	%o1,1,%o1 | ||||
| 	st      %o1,[%o0] | ||||
| 	 | ||||
| #ifdef CONFIG_LEONBARE_NONESTEDIRQ	 | ||||
|         or	%l0, SPARC_PSR_PIL_MASK, %o0       ! no nested irqs | ||||
| 	wr	%o0, SPARC_PSR_ET_MASK, %psr | ||||
| 	WRITE_PAUSE | ||||
| #else | ||||
| 	sll     %l7,SPARC_PSR_PIL_SHIFT,%o1 | ||||
| 	andn	%l0,SPARC_PSR_PIL_MASK,%o0 | ||||
| 	or	%o0, %o1, %o1 | ||||
| 	set     nestedirq,%o0 | ||||
| 	ld      [%o0],%o0 | ||||
|         cmp     %g0,%o0                            ! no nested irqs? | ||||
| 	beq,a   .L1 | ||||
|         or	%o1, SPARC_PSR_PIL_MASK, %o1        | ||||
| .L1:	 | ||||
| 	wr	%o1, SPARC_PSR_ET_MASK, %psr | ||||
| 	WRITE_PAUSE | ||||
| #endif | ||||
| 	 | ||||
| 	mov	%l7, %o0                           ! irq level | ||||
|         call	handler_irq                        ! void handler_irq (int irq, struct leonbare_pt_regs *pt_regs)  | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	 add	%sp, FW_REGS_SZ + 8 + SF_REGS_SZ , %o1	! pt_regs ptr | ||||
| #else | ||||
| 	 add	%sp, SF_REGS_SZ , %o1		   ! pt_regs ptr | ||||
| #endif | ||||
| 	 | ||||
| 	or      %l0, SPARC_PSR_PIL_MASK, %o1 | ||||
| 	wr	%o1, SPARC_PSR_ET_MASK, %psr	   ! enable nesting again, keep ET up | ||||
| 	WRITE_PAUSE | ||||
|  | ||||
| 	set     nestcount,%o0 | ||||
| 	ld      [%o0],%o1 | ||||
| 	sub	%o1,1,%o1 | ||||
| 	st      %o1,[%o0] | ||||
| 	 | ||||
| #ifdef __threadx__	 | ||||
| 	set	_tx_thread_system_state, %o0 | ||||
| 	ld      [%o0],%o1 | ||||
| 	sub	%o1,1,%o1 | ||||
| 	st      %o1,[%o0] | ||||
| #endif | ||||
| 	 | ||||
| 	RESTORE_ALL_FAST | ||||
|  | ||||
|         .seg    "data" | ||||
|         .global nestedirq | ||||
| 	.align  4 | ||||
| nestedirq: | ||||
|         .long   0 | ||||
|         .global fastirq | ||||
| 	.align  4 | ||||
| fastirq: | ||||
|         .long   0 | ||||
|         .global nestcount | ||||
| 	.align  4 | ||||
| nestcount: | ||||
|         .long   0 | ||||
							
								
								
									
										38
									
								
								libgloss/sparc_leon/jiffies.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								libgloss/sparc_leon/jiffies.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/errno.h> | ||||
| #include <asm-leon/elfmacro.h> | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #include <asm-leon/jiffies.h> | ||||
| #include <asm-leon/param.h> | ||||
| #include <asm-leon/leoncompat.h> | ||||
|  | ||||
| struct timespec xtime __attribute__ ((aligned (16))); | ||||
| u64 jiffies_64 = INITIAL_JIFFIES; | ||||
							
								
								
									
										217
									
								
								libgloss/sparc_leon/kernel.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								libgloss/sparc_leon/kernel.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,217 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
|  | ||||
| struct leonbare_kernel leonbare_kernel; | ||||
|  | ||||
| /* | ||||
|  * queue 0: [ <acc=2>], | ||||
|  * queue 1: [ <acc=10>, <acc=8>,<acc=8>,<acc=1> ], | ||||
|  * queue 2: [ ... ], | ||||
|  * ... | ||||
|  * queue n: [ ... ] | ||||
|  * | ||||
|  *  Seach through ready queue [0 - LEONBARE_RUNQ_READY_NR-1] for the | ||||
|  *  first thread in a queue'ss head to discover | ||||
|  *  leonbare_thread_tick_callback() will put threads that have their th_caccount | ||||
|  *  consumed into the prepare-run queues. th_caccount is already initialized | ||||
|  *  to the value for the next schedule round. So all there is to do is to | ||||
|  *  move the to prepare-run queues to run queues [0 - LEONBARE_RUNQ_READY_NR-1]. | ||||
|  *  return the first thread in any queue, similary to leonbare_sched_next(). | ||||
|  *  Using LEONBARE_KR_RUNQ_WHICH and leonbare_thread.th_runq_which one can | ||||
|  *  determine weather the thread is in a runqueue or a prepare-runqueue: | ||||
|  *  LEONBARE_KR_RUNQ_WHICH == leonbare_thread.th_runq_which : thread in runqueue | ||||
|  *  LEONBARE_KR_RUNQ_WHICH != leonbare_thread.th_runq_which : thread in prepare-runqueue | ||||
|  *  after a leonbare_thread_tick_callback() or a run queue change, call | ||||
|  *  leonbare_sched_update() to update LEONBARE_KR_NEXT and | ||||
|  *  LEONBARE_KR_NEED_SCHEDULE | ||||
|  */ | ||||
| int | ||||
| leonbare_sched_update () | ||||
| { | ||||
|   int idx; | ||||
|   leonbare_thread_t n = 0; | ||||
|   int i = 0; | ||||
|   LEONBARE_VERIFYIRQDISABLED (); | ||||
|   LEONBARE_VERIFYSCHED (); | ||||
|   for (i = 0; i < LEONBARE_RUNQ_READY_NR; i++) | ||||
|     { | ||||
|       leonbare_thread_t c; | ||||
|       if (!LBTAILQ_EMPTY (LEONBARE_KR_RUNQ (i))) | ||||
| 	{ | ||||
| 	  n = LBTAILQ_FIRST (LEONBARE_KR_RUNQ (i)); | ||||
| 	  break; | ||||
| 	} | ||||
|     } | ||||
|   if (!n) | ||||
|     { | ||||
|       for (idx = 0; idx < LEONBARE_RUNQ_READY_NR; idx++) | ||||
| 	{ | ||||
| 	  struct leonbare_thread_queue *h0 = | ||||
| 	    (struct leonbare_thread_queue *) LEONBARE_KR_RUNQ (idx); | ||||
| 	  struct leonbare_thread_queue *h1 = (struct leonbare_thread_queue *) | ||||
| 	    LEONBARE_KR_RUNQ (idx + LEONBARE_RUNQ_PREPARE_IDX); | ||||
| 	  if (LBTAILQ_EMPTY (h1)) | ||||
| 	    { | ||||
| 	      LBTAILQ_INIT (h0); | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      *h0 = *h1; | ||||
| 	      if (LBTAILQ_FIRST (h0)) | ||||
| 		{ | ||||
| 		  LBTAILQ_FIRST (h0)->th_runq.tqe_prev = &(h0)->tqh_first; | ||||
| 		} | ||||
| 	      if (!n) | ||||
| 		{ | ||||
| 		  n = LBTAILQ_FIRST (h0); | ||||
| 		} | ||||
| 	    } | ||||
| 	} | ||||
|       for (idx = 0; idx < LEONBARE_RUNQ_READY_NR; idx++) | ||||
| 	{ | ||||
| 	  LBTAILQ_INIT (LEONBARE_KR_RUNQ (idx + LEONBARE_RUNQ_PREPARE_IDX)); | ||||
| 	} | ||||
|       LEONBARE_KR_RUNQ_WHICH++; | ||||
|       LEONBARE_VERIFYSCHED (); | ||||
|       LEONBARE_PRINTQUEUES (); | ||||
|     } | ||||
|   LEONBARE_KR_NEXT = n; | ||||
|   return (LEONBARE_KR_NEED_SCHEDULE); | ||||
| } | ||||
|  | ||||
| /*  called in the timer irq handling. Decrements the  | ||||
|  *  th_caccount field. On consumption of th_caccount the  | ||||
|  *  thread will be removed from the ready queue nad placed into the | ||||
|  *  prepare-runqueue for later readdition by leonbare_sched_readyprepare() | ||||
|  *  called from gettimeofday.c's installed ticker_callback callback | ||||
|  *  leonbare_thread_tick_callback() might change the kernel state in which case | ||||
|  *  state on return from leonbare_thread_tick_callback() leonbare_thread_schedule_callback() | ||||
|  *  will be called from rtrap_fast.S . | ||||
|  */ | ||||
| int | ||||
| leonbare_thread_tick_callback () | ||||
| { | ||||
|   LEONBARE_PROTECT_DECL (flags); | ||||
|   unsigned int r; | ||||
|   volatile leonbare_thread_t c = LEONBARE_KR_CURRENT; | ||||
|   leonbare_thread_t i; | ||||
|   LBDEBUG_FNCALL; | ||||
|   if (c && LEONBARE_KR_IS_PREEMPTION) | ||||
|     { | ||||
|  | ||||
|       LEONBARE_PROTECT_KERNEL_START (); | ||||
|       { | ||||
|  | ||||
| 	LEONBARE_VERIFYIRQDISABLED (); | ||||
| 	LEONBARE_VERIFYSCHED (); | ||||
|  | ||||
| 	if ((--c->th_caccount) < 0) | ||||
| 	  { | ||||
| 	    LBDEBUG_HEADER_PRINTF (LBDEBUG_QUEUE_NR, "remove %s(%x)\n", | ||||
| 				   LEONBARE_TH_NAME_DBG (c), c); | ||||
| 	    LBTAILQ_REMOVE (LEONBARE_KR_RUNQ (c->th_runq_idx), c, th_runq); | ||||
| 	    LBTAILQ_INSERT_TAIL (LEONBARE_KR_RUNQ | ||||
| 				 (c->th_runq_idx + LEONBARE_RUNQ_PREPARE_IDX), | ||||
| 				 c, th_runq); | ||||
| 	    c->th_caccount = c->th_account; | ||||
| 	    c->th_runq_which++; | ||||
| 	  } | ||||
| 	else | ||||
| 	  { | ||||
| 	    /* todo: round robbin scheme */ | ||||
| 	  } | ||||
|       } | ||||
|       LEONBARE_PROTECT_KERNEL_END (); | ||||
|     } | ||||
|   r = leonbare_sched_update (); | ||||
|   return r; | ||||
| } | ||||
|  | ||||
| /* called from rtrap_fast.S's installed schedule_callback callback */ | ||||
| int | ||||
| leonbare_thread_schedule_callback (struct leonbare_pt_regs *ptregs) | ||||
| { | ||||
|   unsigned int retval; | ||||
|   LBDEBUG_FNCALL; | ||||
|   if (LEONBARE_KR_IS_IN_KERNEL == 0 && LEONBARE_KR_NEED_SCHEDULE) | ||||
|     { | ||||
|  | ||||
|       leonbare_sched (); | ||||
|  | ||||
|       //KERNEL_ENTER; | ||||
|       //KERNEL_EXIT(LEONBARE_KR_NEED_SCHEDULE, retval); | ||||
|     } | ||||
|   LBDEBUG_FNEXIT; | ||||
| } | ||||
|  | ||||
|  | ||||
| struct leonbare_thread _thread_main; | ||||
| int | ||||
| leonbare_thread_init () | ||||
| { | ||||
|   int i; | ||||
|   LBDEBUG_FNCALL; | ||||
|  | ||||
|   memset ((void *) &_thread_main, 0, sizeof (_thread_main)); | ||||
|   _thread_main.th_reentp = _impure_ptr; | ||||
|   _thread_main.th_name = "<main>"; | ||||
|   _thread_main.th_runq_idx = 0; | ||||
|   _thread_main.th_pri_idx = 0; | ||||
|   _thread_main.th_account = 0; | ||||
|  | ||||
|   LBTAILQ_INIT (LEONBARE_KR_ALLQ); | ||||
|   for (i = 0; i < LEONBARE_RUNQ_NR; i++) | ||||
|     { | ||||
|       LBTAILQ_INIT (LEONBARE_KR_RUNQ (i)); | ||||
|     } | ||||
|   LBTAILQ_INIT (LEONBARE_KR_ALLM); | ||||
|  | ||||
|   /* queues */ | ||||
|   LBTAILQ_INSERT_TAIL (LEONBARE_KR_ALLQ, &_thread_main, th_allq); | ||||
|  | ||||
|   /* inseart into ready queue 0 at head */ | ||||
|   LBTAILQ_INSERT_HEAD (LEONBARE_KR_RUNQ (_thread_main.th_runq_idx), | ||||
| 		       &_thread_main, th_runq); | ||||
|  | ||||
|   LEONBARE_KR_CURRENT = &_thread_main; | ||||
|   LEONBARE_KR_IS_IN_KERNEL = 0; | ||||
|  | ||||
|   leonbare_init_ticks (); | ||||
|   schedule_callback = (schedulehandler) leonbare_thread_schedule_callback; | ||||
|   ticker_callback = (tickerhandler) leonbare_thread_tick_callback; | ||||
|  | ||||
|   /* disable later */ | ||||
|   LEONBARE_KR_IS_PREEMPTION = 1; | ||||
|  | ||||
|  | ||||
|   LBDEBUG_FNEXIT; | ||||
| } | ||||
							
								
								
									
										112
									
								
								libgloss/sparc_leon/kernel_context.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								libgloss/sparc_leon/kernel_context.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/elfmacro.h> | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
|  | ||||
| 	FUNC_EXPORT(_leonbare_kernel_switchto) | ||||
| 	FUNC_EXPORT(_leonbare_Stop) | ||||
|  | ||||
| 	FUNC_IMPORT(leonbare_disable_traps) | ||||
|  | ||||
| 	.text | ||||
| 	 | ||||
| /* unsigned int _leonbare_kernel_switchto(struct leonbare_thread_ctx *thread,struct leonbare_thread_ctx *thread) */ | ||||
| FUNC_BEGIN(_leonbare_kernel_switchto) | ||||
| 	 | ||||
| 	/* =================================*/ | ||||
| 	/*        save context              */ | ||||
| 	/* =================================*/ | ||||
| 	 | ||||
| 	mov	%o0, %g1 | ||||
| 	mov	%o1, %g2 | ||||
| 	mov	%o7, %g3 | ||||
| 	rd	%psr, %g4                       /* psr.cwp should stay same because irq path rely on it. */ | ||||
| 	 | ||||
| 	call	leonbare_disable_traps		/* psr in %o0, modify %o0, %o1, %o7 */ | ||||
| 	 nop | ||||
|  | ||||
| 	set	TACODE_IRQCALL_FLUSH,%o1 | ||||
|         ta	TACODE_IRQCALL | ||||
| 	 | ||||
| 	st	%g4, [%g1 + LEONBARE_THREAD_CTX_STACK_PSR]	/* psr */ | ||||
| 	set	LEONBARE_THREAD_CTX_MAGIC,%g4 | ||||
| 	st	%g4, [%g1 + LEONBARE_THREAD_CTX_STACK_MAGIC] | ||||
| 	 | ||||
| 	mov	%g3, %o7			! restore %o7 | ||||
| 	 | ||||
| 	LEONBARE_THREAD_CTX_STORE_INS(g1) | ||||
| 	LEONBARE_THREAD_CTX_STORE_LOCALS(g1) | ||||
| 	LEONBARE_THREAD_CTX_STORE_OUTS(g1) | ||||
|  | ||||
| 	/* =================================*/ | ||||
| 	/*        restore context           */ | ||||
| 	/* =================================*/ | ||||
| 	 | ||||
| 	/* check valid context stack area */ | ||||
| 	ld	[%g2 + LEONBARE_THREAD_CTX_STACK_MAGIC], %o1 | ||||
| 	set	LEONBARE_THREAD_CTX_MAGIC,%o2 | ||||
| 	cmp	%o1, %o2 | ||||
| 	beq	1f | ||||
| 	 nop | ||||
| 	 | ||||
| 	/* stop all */ | ||||
| 	ta	0x0 | ||||
| 	 | ||||
| 1:	 | ||||
| 	/* get psr */ | ||||
| 	ld	[%g2 + LEONBARE_THREAD_CTX_STACK_PSR],%g1            /* psr.cwp should stay same because irq path rely on it. */ | ||||
| 	set	SPARC_PSR_EF_MASK,%g3		! clear ef bit | ||||
| 	andn	%g1, %g3, %g1		 | ||||
| 	 | ||||
| 	wr	%g0,%wim | ||||
| 	nop; nop; nop; | ||||
|  | ||||
| 	andn	%g1, SPARC_PSR_ET_MASK, %g3	! disable traps, up to PSR_EF imm andn ok | ||||
| 	wr	%g3, %psr | ||||
| 	nop; nop; nop; | ||||
|  | ||||
| 	LEONBARE_THREAD_CTX_LOAD_INS(g2) | ||||
| 	LEONBARE_THREAD_CTX_LOAD_LOCALS(g2) | ||||
| 	LEONBARE_THREAD_CTX_LOAD_OUTS(g2) | ||||
| 	 | ||||
| 	SET_WIM_CWPMIN1(g1,o1,o2,o3,o4)		! calc wim from psr_cwp so that next restore traps | ||||
| 	 | ||||
| 	wr	%g1,%psr | ||||
| 	nop; nop; nop; | ||||
| 	 | ||||
| 	retl | ||||
| 	 nop | ||||
| 	 | ||||
| FUNC_END(_leonbare_kernel_switchto) | ||||
|  | ||||
|  | ||||
| FUNC_BEGIN(_leonbare_Stop) | ||||
| 	ta 0x0 | ||||
| FUNC_END(_leonbare_Stop) | ||||
							
								
								
									
										162
									
								
								libgloss/sparc_leon/kernel_debug.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								libgloss/sparc_leon/kernel_debug.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,162 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_queue.h>*/ | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <stdarg.h> | ||||
|  | ||||
| /*indent: | ||||
|         indent -kr -i4 -ts4 -sob -l80 -ss -ncs -nut newlib-1.13.0/libgloss/sparc_leon/kernel*.c | ||||
| 	indent -kr -i4 -ts4 -sob -l80 -ss -ncs -nut *.h | ||||
| 	indent -kr -i4 -ts4 -sob -l80 -ss -ncs -nut *.c | ||||
| */ | ||||
|  | ||||
| void leonbare_sched_printqueue (); | ||||
|  | ||||
| int | ||||
| leonbare_sched_verify () | ||||
| { | ||||
| #ifdef LBDEBUG_DO_ASSERT | ||||
|   int i, j; | ||||
|   leonbare_thread_t c, d; | ||||
|   for (i = 0; i < LEONBARE_RUNQ_NR; i++) | ||||
|     { | ||||
|       LBTAILQ_FOREACH (c, LEONBARE_KR_RUNQ (i), th_runq) | ||||
|       { | ||||
| 	if (i < LEONBARE_RUNQ_READY_NR) | ||||
| 	  { | ||||
| 	    LBPASSERT (c->th_runq_idx == i, | ||||
| 		       "thread %s has wrong runq[%d] index (%d) ", | ||||
| 		       LEONBARE_TH_NAME_DBG (c), i, c->th_runq_idx); | ||||
| 	    LBPASSERT (c->th_runq_which == LEONBARE_KR_RUNQ_WHICH, | ||||
| 		       "thread %s in runqueue[%d] has wrong th_runq_which(%d) (!=LEONBARE_KR_RUNQ_WHICH(%d))", | ||||
| 		       LEONBARE_TH_NAME_DBG (c), i, c->th_runq_which, | ||||
| 		       LEONBARE_KR_RUNQ_WHICH); | ||||
| 	  } | ||||
| 	else if (i == LEONBARE_RUNQ_SUSPENDED_IDX) | ||||
| 	  { | ||||
| 	    LBPASSERT (c->th_flags & LEONBARE_TH_SUSPENDED, | ||||
| 		       "thread %s in suspension queue has LEONBARE_TH_SUSPENDED not set ", | ||||
| 		       LEONBARE_TH_NAME_DBG (c)); | ||||
| 	  } | ||||
| 	else if (i == LEONBARE_RUNQ_KILLED_IDX) | ||||
| 	  { | ||||
| 	    LBPASSERT (c-> | ||||
| 		       th_flags & (LEONBARE_TH_TERMINATED | | ||||
| 				   LEONBARE_TH_FINISHED), | ||||
| 		       "thread %s in killed queue has (LEONBARE_TH_TERMINATED | LEONBARE_TH_FINISHED) not set ", | ||||
| 		       LEONBARE_TH_NAME_DBG (c)); | ||||
| 	  } | ||||
| 	else if (i >= LEONBARE_RUNQ_PREPARE_IDX && | ||||
| 		 i < (LEONBARE_RUNQ_PREPARE_IDX + LEONBARE_RUNQ_READY_NR)) | ||||
| 	  { | ||||
| 	    LBPASSERT (c->th_runq_idx == (i - LEONBARE_RUNQ_PREPARE_IDX), | ||||
| 		       "thread %s has wrong prepare-runq[%d] index (%d) ", | ||||
| 		       LEONBARE_TH_NAME_DBG (c), | ||||
| 		       i - LEONBARE_RUNQ_PREPARE_IDX, c->th_runq_idx); | ||||
| 	    LBPASSERT (c->th_runq_which != LEONBARE_KR_RUNQ_WHICH, | ||||
| 		       "thread %s in prepare-runqueue[%d] has wrong th_runq_which(%d) (==LEONBARE_KR_RUNQ_WHICH(%d))", | ||||
| 		       LEONBARE_TH_NAME_DBG (c), i, c->th_runq_which, | ||||
| 		       LEONBARE_KR_RUNQ_WHICH); | ||||
| 	  } | ||||
|  | ||||
| 	if (i != LEONBARE_RUNQ_KILLED_IDX) | ||||
| 	  { | ||||
| 	    LBPASSERT (! | ||||
| 		       (c-> | ||||
| 			th_flags & (LEONBARE_TH_TERMINATED | | ||||
| 				    LEONBARE_TH_FINISHED)), | ||||
| 		       "thread %s not in killed queue has (LEONBARE_TH_TERMINATED | LEONBARE_TH_FINISHED) set ", | ||||
| 		       LEONBARE_TH_NAME_DBG (c)); | ||||
| 	  } | ||||
| 	if (i != LEONBARE_RUNQ_SUSPENDED_IDX) | ||||
| 	  { | ||||
| 	    LBPASSERT (!(c->th_flags & (LEONBARE_TH_SUSPENDED)), | ||||
| 		       "thread %s not in suspend queue has LEONBARE_TH_SUSPENDED set ", | ||||
| 		       LEONBARE_TH_NAME_DBG (c)); | ||||
| 	  } | ||||
|  | ||||
| 	if (LBTAILQ_NEXT (c, th_runq)) | ||||
| 	  { | ||||
| 	    LBPASSERT (c->th_account <= | ||||
| 		       LBTAILQ_NEXT (c, th_runq)->th_account, | ||||
| 		       "thread %s account is not sorted (%d<=%d)", | ||||
| 		       LEONBARE_TH_NAME_DBG (c), c->th_account, | ||||
| 		       LBTAILQ_NEXT (c, th_runq)->th_account); | ||||
| 	  } | ||||
|       } | ||||
|     } | ||||
|   LBTAILQ_FOREACH (c, LEONBARE_KR_ALLQ, th_allq) | ||||
|   { | ||||
|     if ((j = c->th_runq_idx) != -1) | ||||
|       { | ||||
| 	LBPASSERT (j >= 0 | ||||
| 		   && j < LEONBARE_RUNQ_NR, | ||||
| 		   "thread %s has wrong runq index (%d) ", | ||||
| 		   LEONBARE_TH_NAME_DBG (c), c->th_runq_idx); | ||||
| 	LBTAILQ_FOREACH (d, LEONBARE_KR_RUNQ (j), th_runq) | ||||
| 	{ | ||||
| 	  if (d == c) | ||||
| 	    { | ||||
| 	      break; | ||||
| 	    } | ||||
| 	} | ||||
| 	/*LBPASSERT(d,"thread %s is not in runq[%d] ",LEONBARE_TH_NAME_DBG(c),j); */ | ||||
|       } | ||||
|   } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| int | ||||
| leonbare_debug_printf (const char *fmt, ...) | ||||
| { | ||||
|   va_list ap; | ||||
|   va_start (ap, fmt); | ||||
|   vprintf (fmt, ap); | ||||
|   va_end (ap); | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| leonbare_sched_printqueue () | ||||
| { | ||||
|   int i, j; | ||||
|   leonbare_thread_t c; | ||||
|   for (i = 0; i < LEONBARE_RUNQ_NR; i++) | ||||
|     { | ||||
|       LBDEBUG_HEADER_PRINTF (LBDEBUG_QUEUE_NR, "runq[%d]:[", i); | ||||
|       LBTAILQ_FOREACH (c, LEONBARE_KR_RUNQ (i), th_runq) | ||||
|       { | ||||
| 	LBDEBUG (LBDEBUG_QUEUE_NR, "%s[0x%x](%d),", LEONBARE_TH_NAME_DBG (c), | ||||
| 		 c, c->th_account); | ||||
|       } | ||||
|       LBDEBUG (LBDEBUG_QUEUE_NR, "]\n", 0); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										35
									
								
								libgloss/sparc_leon/kernel_debug_var.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								libgloss/sparc_leon/kernel_debug_var.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_queue.h>*/ | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <stdarg.h> | ||||
|  | ||||
| int leonbare_debug = -1; | ||||
							
								
								
									
										31
									
								
								libgloss/sparc_leon/kernel_mm.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								libgloss/sparc_leon/kernel_mm.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
							
								
								
									
										107
									
								
								libgloss/sparc_leon/kernel_mutex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								libgloss/sparc_leon/kernel_mutex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_queue.h>*/ | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
|  | ||||
| leonbare_mutex_t | ||||
| leonbare_mutex_init (leonbare_mutex_t m) | ||||
| { | ||||
|   m->mx_owner_cnt = 0; | ||||
|   m->mx_owner = 0; | ||||
|   LBTAILQ_INIT (&(m->mx_threads)); | ||||
|  | ||||
|   LEONBARE_PROTECT_KERNEL_START (); | ||||
|   { | ||||
|     LBTAILQ_INSERT_TAIL (LEONBARE_KR_ALLM, m, mx_allm); | ||||
|   } | ||||
|   LEONBARE_PROTECT_KERNEL_END (); | ||||
|  | ||||
| } | ||||
|  | ||||
| int | ||||
| _self__leonbare_mutex_lock (leonbare_mutex_t m, int wait) | ||||
| { | ||||
|   int ret = LEONBARE_MUTEX_LOCK_OK; | ||||
|   leonbare_thread_t c; | ||||
|  | ||||
|   LEONBARE_PROTECT_MUTEXSTRUCT_START (m); | ||||
|   while (1) | ||||
|     { | ||||
|       if (LEONBARE_MUTEX_OWNER_GET (m) == 0) | ||||
| 	{ | ||||
| 	  LEONBARE_MUTEX_OWNER_SET (m, LEONBARE_KR_CURRENT); | ||||
| 	  LEONBARE_MUTEX_OWNER_CNT_SET (m, 0); | ||||
| 	  LBTAILQ_INSERT_TAIL (&c->th_mutex_locked, m, mx_locked); | ||||
| 	  ret = LEONBARE_MUTEX_LOCK_OK; | ||||
| 	  break; | ||||
| 	} | ||||
|       else if (m->mx_owner == LEONBARE_KR_CURRENT) | ||||
| 	{ | ||||
| 	  m->mx_owner_cnt++; | ||||
| 	  ret = LEONBARE_MUTEX_LOCK_OK; | ||||
| 	  break; | ||||
| 	} | ||||
|       LBTAILQ_INSERT_TAIL (&m->mx_threads, c, th_mutex); | ||||
|       current_suspend (); | ||||
|     } | ||||
|   LEONBARE_PROTECT_MUTEXSTRUCT_END (m); | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| leonbare_mutex_unlock (leonbare_mutex_t m) | ||||
| { | ||||
|   int ret = LEONBARE_MUTEX_UNLOCK_ERROR; | ||||
|   leonbare_thread_t c, h; | ||||
|  | ||||
|   LEONBARE_PROTECT_MUTEXSTRUCT_START (m); | ||||
|   { | ||||
|     c = LEONBARE_KR_CURRENT; | ||||
|     if (m->mx_owner != c) | ||||
|       { | ||||
| 	ret = LEONBARE_MUTEX_UNLOCK_OK; | ||||
|       } | ||||
|     else if (m->mx_owner == c && m->mx_owner_cnt) | ||||
|       { | ||||
| 	m->mx_owner_cnt--; | ||||
| 	ret = LEONBARE_MUTEX_UNLOCK_OK; | ||||
|       } | ||||
|     else if ((h = LBTAILQ_FIRST (&m->mx_threads))) | ||||
|       { | ||||
| 	LBTAILQ_REMOVE (&m->mx_threads, h, th_mutex); | ||||
| 	leonbare_thread_resume (h); | ||||
| 	ret = LEONBARE_MUTEX_UNLOCK_OK; | ||||
|       } | ||||
|   } | ||||
|   LEONBARE_PROTECT_MUTEXSTRUCT_END (m); | ||||
|   return ret; | ||||
| } | ||||
							
								
								
									
										59
									
								
								libgloss/sparc_leon/kernel_queue.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								libgloss/sparc_leon/kernel_queue.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_queue.h>*/ | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
|  | ||||
| int | ||||
| leonbare_thread_getqueueidx (leonbare_thread_t thread) | ||||
| { | ||||
|   LEONBARE_VERIFYSCHED (); | ||||
|   if (thread->th_flags & (LEONBARE_TH_TERMINATED | LEONBARE_TH_FINISHED)) | ||||
|     { | ||||
|       return LEONBARE_RUNQ_KILLED_IDX; | ||||
|     } | ||||
|   else if ((thread->th_flags & LEONBARE_TH_SUSPENDED)) | ||||
|     { | ||||
|       return LEONBARE_RUNQ_SUSPENDED_IDX; | ||||
|     } | ||||
|   else if (LEONBARE_RUNQ_ISREADY (thread->th_runq_idx)) | ||||
|     { | ||||
|       if (LEONBARE_KR_RUNQ_WHICH == thread->th_runq_which) | ||||
| 	{ | ||||
| 	  return thread->th_runq_idx; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  return thread->th_runq_idx + LEONBARE_RUNQ_PREPARE_IDX; | ||||
| 	} | ||||
|     } | ||||
|   return -1; | ||||
| } | ||||
							
								
								
									
										84
									
								
								libgloss/sparc_leon/kernel_sched.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								libgloss/sparc_leon/kernel_sched.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
|  | ||||
| unsigned int | ||||
| reschedule () | ||||
| { | ||||
|   leonbare_sched_update (); | ||||
|   return leonbare_sched (); | ||||
| } | ||||
|  | ||||
| unsigned int | ||||
| leonbare_sched () | ||||
| { | ||||
|   unsigned int ret = 0; | ||||
|   volatile leonbare_thread_t old = LEONBARE_KR_CURRENT, new = | ||||
|     LEONBARE_KR_NEXT; | ||||
|   LBDEBUG_FNCALL; | ||||
|   LBDEBUG_HEADER_PRINTF (LBDEBUG_SCHED_NR, "switch %s[%x]->%s[%x]\n", | ||||
| 			 LEONBARE_TH_NAME_DBG (old), old, | ||||
| 			 LEONBARE_TH_NAME_DBG (new), new); | ||||
|  | ||||
|   LBPASSERT ((old != new), | ||||
| 	     "leonbare_sched should only be called with reschedule work to do", | ||||
| 	     0); | ||||
|  | ||||
|   LEONBARE_KR_CURRENT = new; | ||||
|  | ||||
|   /* to be able to programm symetrically on kernel level each thread | ||||
|      saves it's spinlock on mutexes and kernel and irq flags in its | ||||
|      own save region. On a kernel switch they are released until the | ||||
|      thread is reawakened. Then the locks will be reaquired (and finally | ||||
|      released when the codeblock exits). The locking can be recursive. */ | ||||
|   if (old->th_prot.krp_k_depth) | ||||
|     { | ||||
|       LEONBARE_SMP_SPINLOCK_RELEASE (LEONBARE_KR_LOCK); | ||||
|     } | ||||
|   if (old->th_prot.krp_m_depth) | ||||
|     { | ||||
|       LEONBARE_SMP_SPINLOCK_RELEASE (old->th_prot.krp_m); | ||||
|     } | ||||
|  | ||||
|   ret = _leonbare_kernel_switchto (old, new); | ||||
|   optbarrier (); | ||||
|  | ||||
|   if (new->th_prot.krp_m_depth) | ||||
|     { | ||||
|       LEONBARE_SMP_SPINLOCK_AQUIRE (new->th_prot.krp_m); | ||||
|     } | ||||
|   if (old->th_prot.krp_k_depth) | ||||
|     { | ||||
|       LEONBARE_SMP_SPINLOCK_AQUIRE (LEONBARE_KR_LOCK); | ||||
|     } | ||||
|  | ||||
|   return ret; | ||||
| } | ||||
							
								
								
									
										214
									
								
								libgloss/sparc_leon/kernel_thread.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								libgloss/sparc_leon/kernel_thread.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,214 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_queue.h>*/ | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
| #include <asm-leon/leonbare_debug.h> | ||||
| #include <asm-leon/stack.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/irq.h> | ||||
|  | ||||
| int | ||||
| leonbare_thread_resume (leonbare_thread_t thread) | ||||
| { | ||||
|   leonbare_thread_t i = 0; | ||||
|   if ((thread->th_flags & LEONBARE_TH_SUSPENDED) && | ||||
|       !(thread->th_flags & (LEONBARE_TH_TERMINATED | LEONBARE_TH_FINISHED))) | ||||
|     { | ||||
|  | ||||
|       LEONBARE_PROTECT_KERNEL_START (); | ||||
|       { | ||||
| 	unsigned int idx = leonbare_thread_getqueueidx (thread); | ||||
|  | ||||
| 	if (idx != -1) | ||||
| 	  { | ||||
| 	    LBTAILQ_REMOVE (LEONBARE_KR_RUNQ (idx), thread, th_runq); | ||||
| 	  } | ||||
|  | ||||
| 	if (thread->th_pri_idx != -1) | ||||
| 	  { | ||||
| 	    thread->th_runq_idx = thread->th_pri_idx; | ||||
| 	    thread->th_runq_which = LEONBARE_KR_RUNQ_WHICH; | ||||
| 	    LBTAILQ_INSERT_HEAD (LEONBARE_KR_RUNQ (thread->th_runq_idx), | ||||
| 				 thread, th_runq); | ||||
| 	    LEONBARE_TH_SETSTATE (thread, LEONBARE_TH_READY); | ||||
| 	  } | ||||
|       } | ||||
|       LEONBARE_PROTECT_KERNEL_END (); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| int | ||||
| leonbare_thread_terminate (leonbare_thread_t thread) | ||||
| { | ||||
|   unsigned int ret = 0; | ||||
|   leonbare_thread_t c = LEONBARE_KR_CURRENT; | ||||
|   LEONBARE_PROTECT_KERNEL_START (); | ||||
|   { | ||||
|     unsigned int idx = leonbare_thread_getqueueidx (thread); | ||||
|  | ||||
|     if (LEONBARE_RUNQ_ISREADY (idx) || LEONBARE_RUNQ_ISPREPARE (idx) || | ||||
| 	LEONBARE_RUNQ_ISSUSPEND (idx)) | ||||
|       { | ||||
| 	LBTAILQ_REMOVE (LEONBARE_KR_RUNQ (idx), thread, th_runq); | ||||
|       } | ||||
|     else | ||||
|       { | ||||
| 	LBPASSERT (LEONBARE_RUNQ_ISKILLED (idx), | ||||
| 		   "thread %s is in no queue ", | ||||
| 		   LEONBARE_TH_NAME_DBG (thread)); | ||||
|       } | ||||
|     LEONBARE_TH_SETSTATE (thread, LEONBARE_TH_TERMINATED); | ||||
|     LBTAILQ_INSERT_HEAD (LEONBARE_KR_RUNQ (LEONBARE_RUNQ_KILLED_IDX), thread, | ||||
| 			 th_runq); | ||||
|  | ||||
|     LEONBARE_PRINTQUEUES (); | ||||
|  | ||||
|     LEONBARE_VERIFYSCHED (); | ||||
|   } | ||||
|   if (thread == LEONBARE_KR_CURRENT) | ||||
|     { | ||||
|       ret = reschedule (); | ||||
|       /* never come here */ | ||||
|       LEONBARE_STOPALL; | ||||
|     } | ||||
|   LEONBARE_PROTECT_KERNEL_END (); | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| int | ||||
| current_suspend () | ||||
| { | ||||
|   unsigned int ret = 0; | ||||
|   leonbare_thread_t c = LEONBARE_KR_CURRENT; | ||||
|   LEONBARE_PROTECT_KERNEL_START (); | ||||
|   { | ||||
|     LBPASSERT ((c->th_runq_which == LEONBARE_KR_RUNQ_WHICH), | ||||
| 	       "Current thread cannot be on the prepare queue", 0); | ||||
|  | ||||
|     LBTAILQ_REMOVE (LEONBARE_KR_RUNQ (c->th_runq_idx), c, th_runq); | ||||
|     LBTAILQ_INSERT_TAIL (LEONBARE_KR_RUNQ (LEONBARE_RUNQ_SUSPENDED_IDX), | ||||
| 			 c, th_runq); | ||||
|     c->th_runq_idx = LEONBARE_RUNQ_SUSPENDED_IDX; | ||||
|     LEONBARE_TH_SETSTATE (c, LEONBARE_TH_SUSPENDED); | ||||
|     LEONBARE_VERIFYSCHED (); | ||||
|   } | ||||
|   ret = reschedule (); | ||||
|   LEONBARE_PROTECT_KERNEL_END (); | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| void | ||||
| _leonbare_thread_body () | ||||
| { | ||||
|   LBDEBUG_FNCALL; | ||||
|   leonbare_thread_t thread = LEONBARE_KR_CURRENT; | ||||
|  | ||||
|   LEONBARE_KR_IS_IN_KERNEL = 0; | ||||
|   thread->th_result = thread->th_func (thread->th_arg); | ||||
|  | ||||
|   leonbare_thread_terminate (thread); | ||||
|  | ||||
|   LBDEBUG_FNEXIT; | ||||
| } | ||||
|  | ||||
| #define LEONBARE_BODY_OFFSET 200 | ||||
|  | ||||
| int | ||||
| leonbare_thread_create (struct leonbare_thread *thread, char *stack, | ||||
| 			int stacksize) | ||||
| { | ||||
|   LEONBARE_PROTECT_DECL (flags); | ||||
|   struct sparc_stackframe_regs *sp; | ||||
|   unsigned int v; | ||||
|   unsigned int fpspill, bodysp, bodyfp; | ||||
|   struct leonbare_thread_ctx *threadctx; | ||||
|   LBDEBUG_FNCALL; | ||||
|  | ||||
|   thread->th_stack_base = (char *) LEONBARE_STACKALIGN (stack); | ||||
|   stacksize -= thread->th_stack_base - stack; | ||||
|   thread->th_stack_size = stacksize; | ||||
|   thread->th_runq_idx = 0; | ||||
|   thread->th_pri_idx = 0; | ||||
|   thread->th_account = 0; | ||||
|   thread->th_caccount = 0; | ||||
|  | ||||
|   /* stack: | ||||
|    * 0:+--------------------------------+ <- thread.th_stack_base | ||||
|    *   |   ....                         | | ||||
|    *   +--------------------------------+ <- thread.th_ctx->out[6] (%sp) | ||||
|    *   |  _leonbare_thread_body() frame | | ||||
|    *   +--------------------------------+ <- thread.th_ctx->sf_ins[6]  (%fp) | ||||
|    *   |           WINDOWSPILL          | | ||||
|    *   +--------------------------------+ <- thread.th_ctx->fpu   | ||||
|    *   |  struct sparc_fpuwindow_regs   | | ||||
|    *   +--------------------------------+ <- thread.th_stack_base + thread->th_stack_size | ||||
|    * | ||||
|    */ | ||||
|   v = (unsigned int) (thread->th_stack_base + | ||||
| 		      LEONBARE_STACKALIGN (thread->th_stack_size - | ||||
| 					   (LEONBARE_BODY_OFFSET + | ||||
| 					    WINDOWSIZE + FW_REGS_SZ))); | ||||
|  | ||||
|   bodysp = ((unsigned int) v); | ||||
|   bodyfp = ((unsigned int) bodysp) + LEONBARE_BODY_OFFSET; | ||||
|   fpspill = ((unsigned int) bodyfp) + WINDOWSIZE; | ||||
|  | ||||
|   thread->th_ctx.outs[6] = (unsigned int) bodysp; | ||||
|   thread->th_ctx.outs[7] = (int) _leonbare_thread_body; | ||||
|   thread->th_ctx.outs[7] -= 8; | ||||
|   thread->th_ctx.sf_ins[6] = (unsigned int) bodyfp; | ||||
|   thread->th_ctx.fpu = (unsigned int) fpspill; | ||||
|   thread->th_ctx.magic = LEONBARE_THREAD_CTX_MAGIC; | ||||
|  | ||||
|   thread->th_ctx.psr = 0x0e0; | ||||
|   thread->th_ctx.wim = 0x2; | ||||
|  | ||||
|   LBDEBUG_HEADER_PRINTF (LBDEBUG_THREAD_NR, | ||||
| 			 "Thread %s (0x%x): stack [0x%x-0x%x] \n", | ||||
| 			 LEONBARE_TH_NAME_DBG (thread), thread, | ||||
| 			 thread->th_stack_base, | ||||
| 			 thread->th_stack_base + thread->th_stack_size); | ||||
|  | ||||
|   /* newlibc reent */ | ||||
|   thread->th_reentp = &(thread->th_reent); | ||||
|   _REENT_INIT_PTR (thread->th_reentp); | ||||
|  | ||||
|   LEONBARE_PROTECT_KERNEL_START (); | ||||
|   /* queues */ | ||||
|   LBTAILQ_INSERT_TAIL (LEONBARE_KR_ALLQ, thread, th_allq); | ||||
|   LBTAILQ_INSERT_TAIL (LEONBARE_KR_RUNQ (thread->th_runq_idx), thread, | ||||
| 		       th_runq); | ||||
|  | ||||
|   LEONBARE_PRINTQUEUES (); | ||||
|  | ||||
|   LEONBARE_PROTECT_KERNEL_END (); | ||||
|  | ||||
|   LBDEBUG_FNEXIT; | ||||
| } | ||||
							
								
								
									
										143
									
								
								libgloss/sparc_leon/lcpuinit.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								libgloss/sparc_leon/lcpuinit.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #define LEON3_IO_AREA 0xfff00000 | ||||
| #define LEON3_CONF_AREA 0xff000 | ||||
| #define VENDOR_GAISLER 0x01 | ||||
| #define GAISLER_APBMST 0x006 | ||||
| #define GAISLER_APBUART 0x00C | ||||
| #define GAISLER_GPTIMER 0x011 | ||||
|     | ||||
| 	.text | ||||
| 	/* ------- */ | ||||
|   	.weak	cpuinit | ||||
| 	.set	cpuinit,_cpuinit | ||||
| 	/* ------- */ | ||||
| 	!.global cpuinit | ||||
| _cpuinit: | ||||
|  | ||||
|         mov %o7,%g6 | ||||
|  | ||||
| 	mov	%psr, %l3 | ||||
| 	srl	%l3, 24, %g5 | ||||
| 	and  	%g5, 0xf, %g5 | ||||
| 	subcc	%g5, 3, %0 | ||||
| 	be	1f | ||||
|  | ||||
| 	/* other versions */ | ||||
| 	 | ||||
|         ba 2f  	 | ||||
|  | ||||
|         ! ####### leon3 ######### | ||||
|  | ||||
| 1:      set 0x01, %o0              !VENDOR_GAISLER | ||||
|         set 0x006, %o1             !GAISLER_APBMST   | ||||
|         call ahbslv_scan | ||||
|         nop | ||||
|  | ||||
|         cmp %g0,%o0  | ||||
|         be 2f | ||||
|          nop | ||||
|  | ||||
|         ld [%o0+16],%g1 | ||||
|         set 0xfff00000,%o0         !LEON3_IO_AREA           | ||||
|         and %g1,%o0,%g1            !g1: apb base | ||||
|  | ||||
|         set 0xff000,%o0            !LEON3_CONF_AREA     | ||||
|         or %g1,%o0,%g2             !g2: apb conf base | ||||
|    | ||||
|         ! ####### uart ######### | ||||
|         mov %g2,%o0 | ||||
|         set 0x01 , %o1             ! VENDOR_GAISLER    | ||||
|         set 0x00C,%o2              ! GAISLER_APBUART   | ||||
|         call apbslv_scan | ||||
|          nop | ||||
|         cmp %g0,%o0 | ||||
|         be 2f | ||||
|          nop | ||||
|          | ||||
|         call iobar_getbase | ||||
|          mov %g1,%o1 | ||||
|          | ||||
| 	set 	console, %g5 | ||||
|         st %o1,[%g5]             !uart base address | ||||
|  | ||||
|         ! ####### timer ######### | ||||
|  | ||||
|         mov %g2,%o0 | ||||
|         set 0x01 , %o1           !VENDOR_GAISLER | ||||
|         set 0x011,%o2            !GAISLER_GPTIMER | ||||
|         call apbslv_scan | ||||
|          nop | ||||
|         cmp %g0,%o0 | ||||
|         be 2f | ||||
|          nop | ||||
|          | ||||
|         call iobar_getbase | ||||
|          mov %g1,%o1 | ||||
|          | ||||
|         add %o1,0x10,%o1 | ||||
| 	set rtc, %g5 | ||||
|         st %o1,[%g5] | ||||
|  | ||||
|         ! ################ | ||||
|          | ||||
|         mov %g2,%o0 | ||||
|         set 0x01 , %o1           !VENDOR_GAISLER | ||||
|         set 0x00D,%o2            !GAISLER_IRQMP | ||||
|         call apbslv_scan | ||||
|         nop | ||||
|         cmp %g0,%o0 | ||||
|         be 2f | ||||
|         nop | ||||
|          | ||||
|         call iobar_getbase | ||||
|         mov %g1,%o1 | ||||
|          | ||||
| 	set irqmp, %g5 | ||||
|         st %o1,[%g5] | ||||
|         ld [%o1+0x10], %o2 | ||||
| 	srl %o2, 16, %o2 | ||||
| 	and %o2, 15, %o2 | ||||
|         st %o2,[%g5+4] | ||||
|  | ||||
|         ! ################ | ||||
|  | ||||
| 2:	mov %g6,%o7 | ||||
|         retl | ||||
| 	nop | ||||
|  | ||||
|         ! force link of jiffies_64 | ||||
|         .global jiffies_64 | ||||
| 3:      set jiffies_64,%g1 | ||||
|  | ||||
|  | ||||
| 	.data | ||||
| 	.global irqmp | ||||
|  | ||||
| irqmp:	.word 0		! IRQMP base address | ||||
| 	.word 0		! extended irq number | ||||
|  | ||||
| 	.text | ||||
							
								
								
									
										170
									
								
								libgloss/sparc_leon/locore.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								libgloss/sparc_leon/locore.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,170 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|   | ||||
| /* The traptable has to be the first code in a boot PROM. */ | ||||
|  | ||||
| #include <asm-leon/head.h> | ||||
|                  | ||||
| #define TRAP(H)  mov %psr, %l0; sethi %hi(H), %l4; jmp %l4+%lo(H); nop; | ||||
| #define TRAPL(H)  nop; sethi %hi(H), %g1; jmp %g1+%lo(H); nop; | ||||
| #define TRAP_ENTRY(H) rd %psr, %l0; b H; rd %wim, %l3; nop; | ||||
|  | ||||
| #define WIM_INIT 2 | ||||
| #ifdef _SOFT_FLOAT | ||||
| #define PSR_INIT 0x0e0 | ||||
| #else | ||||
| #define PSR_INIT 0x10e0 | ||||
| #endif | ||||
|  | ||||
| #define NUMREGWINDOWS 8 | ||||
|  | ||||
| /* Unexcpected trap will halt the processor by forcing it to error state */ | ||||
| #define BAD_TRAP ta 0; nop; nop; nop; | ||||
|  | ||||
| /* Software trap. Treat as BAD_TRAP */ | ||||
| #define SOFT_TRAP BAD_TRAP | ||||
|  | ||||
|   .seg    "text" | ||||
|   .global _trap_table, start, _start, cpuinit, leonbare_irq_entry, _hardreset | ||||
|   .global _window_overflow, _window_underflow, _flush_windows, _fpdis_enable | ||||
|   /*.global _nwindows, _leon_version, _nwindows_min1*/ | ||||
|  | ||||
| 	 | ||||
| ! | ||||
| ! Startup code for standalone system. Wash IU and FPU (if present) registers. | ||||
| ! The registers have to be written to initiate the parity bits. | ||||
| ! | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	_hardreset | ||||
| 	.set	_hardreset,_hardreset_libgloss | ||||
| 	/* ------- */ | ||||
| 	 | ||||
| 	.global _hardreset_custom_weak, _hardreset_real, _cleanregs_custom_weak, _hardreset_custom_svt_weak | ||||
|  | ||||
| _hardreset_real: | ||||
| 	nop | ||||
| _hardreset_libgloss: | ||||
| 	set     _hardreset_custom_weak, %g1  ! possible mkprom init code here, default links to dummy _hardreset_custom_dummy | ||||
| 	call     %g1 | ||||
| 	 nop | ||||
| 	 | ||||
| 	set     _trap_table, %g1       	! Initialize TBR | ||||
| 	mov     %g1, %tbr | ||||
| 	 | ||||
| 	set     _hardreset_custom_svt_weak, %g1 ! give mkprom svt chance to reset tbr | ||||
| 	call     %g1 | ||||
| 	 nop | ||||
| 	 | ||||
| 	set     _cleanregs_custom_weak, %g1 | ||||
| 	call     %g1 | ||||
| 	 nop | ||||
|  | ||||
| #ifdef _FLAT | ||||
| 	mov	%g0, %wim | ||||
| #else | ||||
| /*	! assume that %sp is correct use cwp of psr to set the next window as invalid | ||||
| 	mov	%psr, %g2    ! extract cwp | ||||
| 	and     0x1f, %g2,%g2 | ||||
| 	set     0x1, %g3 | ||||
| 	sll     %g3,%g2,%g3  ! the bit mask for cwp | ||||
|  | ||||
| 	sll     %g3, 1, %g4  ! rotate one to left | ||||
| 	sethi %hi(_nwindows_min1), %g5	! NWINDOWS-1 | ||||
| 	ld [%g5+%lo(_nwindows_min1)], %g5 | ||||
| 	srl  %g3, %g5, %g5 | ||||
|   	or   %g5, %g4, %g5 | ||||
|   	mov  %g5, %wim | ||||
|   	nop; nop; nop */ | ||||
| #endif | ||||
| 	 | ||||
| /* | ||||
| 	mov	%psr, %g2 | ||||
| 	set	0x202, %g3 | ||||
| 	sll	%g3, %g2, %g2 | ||||
| 	mov	%g2, %wim | ||||
| 	nop; nop; nop | ||||
| 1: | ||||
| */ | ||||
| 	! ------------------------------- | ||||
| 	! only cpu 0 initializes | ||||
| /*	mov	%psr, %g5 | ||||
| 	srl	%g5, 24, %g5 | ||||
| 	and  	%g5, 3, %g5 | ||||
| 	subcc	%g5, 3, %g0             ! leon2: 0 or 2, leon3:	3 | ||||
| 	bne	callcpuinit | ||||
| 	nop | ||||
| */ | ||||
| 	 | ||||
| 	rd     %asr17,%g5 | ||||
| 	srl    %g5,28,%g5 | ||||
| 	cmp %g5,%g0 | ||||
| 	 bne slavego | ||||
| 	nop | ||||
| 	 | ||||
| callcpuinit:       | ||||
| 	call	cpuinit | ||||
| 	 nop | ||||
| 	 | ||||
| 	call	pnpinit | ||||
| 	 nop | ||||
| 	 | ||||
| slavego:	 | ||||
|         ! ------------------------------- | ||||
| 	 | ||||
|         sub     %sp, 0x40, %sp  	! room for main to save args | ||||
| 	call	_start | ||||
|         nop | ||||
|  | ||||
| 	mov	1, %g1 | ||||
| 	ta 	0			! Halt if _main would return ... | ||||
| 	nop | ||||
|  | ||||
| 	.global	_fpdis,_fpdis_svt | ||||
| _fpdis_svt: | ||||
| _fpdis: | ||||
| 	set	0x1000, %l4 | ||||
| 	andcc	%l0, %l4, %l3 | ||||
| 	bne,a	4f | ||||
| 	andn	%l0, %l4, %l0 | ||||
| 	ta	0 | ||||
| 4: | ||||
| 	mov      %l0, %psr		! restore %psr | ||||
| 	nop; nop; nop | ||||
|   	jmp  %l2			! Jump to nPC | ||||
|   	rett  %l2 + 4 | ||||
|  | ||||
| 	 | ||||
| /* | ||||
| !'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
| 	.section .bss | ||||
| 	.global _nwindows, _leon_version, _nwindows_min1 | ||||
| _nwindows: | ||||
| 	.word 8 | ||||
| _nwindows_min1:	 | ||||
| 	.word 7 | ||||
| _leon_version: | ||||
| 	.word 3 | ||||
| */ | ||||
							
								
								
									
										50
									
								
								libgloss/sparc_leon/locore_atexit.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								libgloss/sparc_leon/locore_atexit.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <stddef.h> | ||||
| #include <stdlib.h> | ||||
| #include <reent.h> | ||||
| #include <sys/lock.h> | ||||
|  | ||||
| /* | ||||
|  * Register a function to be performed at exit or on shared library unload. | ||||
|  */ | ||||
|  | ||||
| int | ||||
| atexit (void (*fn) (void)) | ||||
| { | ||||
|   register struct _atexit *p; | ||||
|  | ||||
|   p = _GLOBAL_REENT->_atexit; | ||||
|   if (p == NULL) | ||||
|     _GLOBAL_REENT->_atexit = p = &_GLOBAL_REENT->_atexit0; | ||||
|   if (p->_ind >= _ATEXIT_SIZE) | ||||
|     { | ||||
|       return -1; | ||||
|     } | ||||
|  | ||||
|   p->_fns[p->_ind++] = fn; | ||||
|   return 0; | ||||
| } | ||||
							
								
								
									
										114
									
								
								libgloss/sparc_leon/locore_clean.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								libgloss/sparc_leon/locore_clean.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|   | ||||
| #include <asm-leon/head.h> | ||||
|                  | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	_cleanregs_custom_weak | ||||
| 	.set	_cleanregs_custom_weak,_cleanregs_donothing | ||||
| 	/* ------- */ | ||||
| 	.global _cleanregs_libgloss | ||||
| 	 | ||||
|  | ||||
| _cleanregs_donothing:	 | ||||
| _cleanregs_libgloss:	 | ||||
| 	retl | ||||
| 	 nop | ||||
| 	 | ||||
| 	 | ||||
| #define NUMREGWINDOWS 8 | ||||
| 	 | ||||
| //_cleanregs_libgloss:	 | ||||
| 	  | ||||
| !'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
| ! initialize regs with values	 | ||||
| //#define REGINIT	 | ||||
| #ifdef REGINIT | ||||
| 	 | ||||
| 	mov      %psr, %g3 | ||||
| 	mov      %wim, %g4 | ||||
| 	mov      %sp, %g5 | ||||
| 	mov      %fp, %g6 | ||||
| 	mov      %o7, %g7 | ||||
| 	mov      %g0, %wim | ||||
| 	set      0, %g1 | ||||
| 	andn     %g3,0x1f,%l0 | ||||
| 	mov      %l0,%psr | ||||
| 	nop;  nop; nop | ||||
| 	 | ||||
| 3:	set     0x0001,%i0 | ||||
| 	set     0x0101,%i1 | ||||
| 	set     0x0201,%i2 | ||||
| 	set     0x0301,%i3 | ||||
| 	set     0x0401,%i4 | ||||
| 	set     0x0501,%i5 | ||||
| 	set     0x0601,%i6 | ||||
| 	set     0x0701,%i7 | ||||
| 	set     0x0801,%l0 | ||||
| 	set     0x0901,%l1 | ||||
| 	set     0x1001,%l2 | ||||
| 	set     0x1101,%l3 | ||||
| 	set     0x1201,%l4 | ||||
| 	set     0x1301,%l5 | ||||
| 	set     0x1401,%l6 | ||||
| 	set     0x1501,%l7 | ||||
| 	or      %g1,%i0,%i0 | ||||
| 	or      %g1,%i1,%i1 | ||||
| 	or      %g1,%i2,%i2 | ||||
| 	or      %g1,%i3,%i3 | ||||
| 	or      %g1,%i4,%i4 | ||||
| 	or      %g1,%i5,%i5 | ||||
| 	or      %g1,%i6,%i6 | ||||
| 	or      %g1,%i7,%i7 | ||||
| 	or      %g1,%l0,%l0 | ||||
| 	or      %g1,%l1,%l1 | ||||
| 	or      %g1,%l2,%l2 | ||||
| 	or      %g1,%l3,%l3 | ||||
| 	or      %g1,%l4,%l4 | ||||
| 	or      %g1,%l5,%l5 | ||||
| 	or      %g1,%l6,%l6 | ||||
| 	or      %g1,%l7,%l7 | ||||
| 	restore | ||||
| 	set 0x10000,%g2 | ||||
| 	add %g1,%g2,%g1 | ||||
| 	set NUMREGWINDOWS*0x10000,%g2 | ||||
| 	cmp %g1,%g2 | ||||
| 	bne 3b | ||||
| 	 nop | ||||
| 	 | ||||
| 	mov      %g4,%wim | ||||
| 	nop; nop; nop; | ||||
| 	mov      %g3,%psr  | ||||
| 	nop; nop; nop; | ||||
| 	mov      %g5, %sp  | ||||
| 	mov      %g6, %fp  | ||||
| 	 | ||||
| #endif | ||||
| !'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
|  | ||||
| 	jmpl %g7+8,%g0 | ||||
| 	nop | ||||
|  | ||||
							
								
								
									
										170
									
								
								libgloss/sparc_leon/locore_mvt.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								libgloss/sparc_leon/locore_mvt.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,170 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|   | ||||
| /* The traptable has to be the first code in a boot PROM. */ | ||||
|  | ||||
| #include <asm-leon/head.h> | ||||
|                  | ||||
| #define TRAP(H)  mov %psr, %l0; sethi %hi(H), %l4; jmp %l4+%lo(H); nop; | ||||
| #define TRAPL(H)  mov %g0, %g4; sethi %hi(H), %g4; jmp %g4+%lo(H); nop; | ||||
| #define TRAP_ENTRY(H) rd %psr, %l0; b H; rd %wim, %l3; nop; | ||||
| /* srmmu trap */	 | ||||
| #define SRMMU_TFAULT rd %psr, %l0; rd %wim, %l3; b _srmmu_fault; mov 1, %l6; | ||||
| #define SRMMU_DFAULT rd %psr, %l0; rd %wim, %l3; b _srmmu_fault; mov 9, %l6; | ||||
|  | ||||
| #define WIM_INIT 2 | ||||
| #ifdef _SOFT_FLOAT | ||||
| #define PSR_INIT 0x0e0 | ||||
| #else | ||||
| #define PSR_INIT 0x10e0 | ||||
| #endif | ||||
|  | ||||
| #define NUMREGWINDOWS 8 | ||||
|  | ||||
| /* Unexcpected trap will halt the processor by forcing it to error state */ | ||||
| #define BAD_TRAP ta 0; nop; nop; nop; | ||||
|  | ||||
| /* Software trap. Treat as BAD_TRAP */ | ||||
| #define SOFT_TRAP BAD_TRAP | ||||
|  | ||||
|   .seg    "text" | ||||
|   .global _trap_table, cpuinit, leonbare_irq_entry, _hardreset, _hardreset_mvt | ||||
|   .global _window_overflow, _window_underflow, _flush_windows, _fpdis_enable | ||||
|   .global start | ||||
| start:  | ||||
| _trap_table: | ||||
|   TRAPL(_hardreset_mvt);	! 00 reset trap  | ||||
|   SRMMU_TFAULT			! 01 instruction_access_exception (in mmu_asm.S) | ||||
|   BAD_TRAP;			! 02 illegal_instruction | ||||
|   BAD_TRAP;			! 03 priveleged_instruction | ||||
| #ifndef _SOFT_FLOAT | ||||
|   TRAP(_fpdis_enable);		! 04 fp_disabled | ||||
| #else | ||||
|   TRAP(_fpdis);			! 04 fp_disabled | ||||
| #endif		 | ||||
| #ifndef _FLAT | ||||
|   TRAP(_window_overflow);	! 05 window_overflow | ||||
|   TRAP(_window_underflow);	! 06 window_underflow | ||||
| #else | ||||
|   BAD_TRAP; BAD_TRAP; | ||||
| #endif | ||||
|   BAD_TRAP;			! 07 memory_address_not_aligned | ||||
|   BAD_TRAP;			! 08 fp_exception | ||||
|   SRMMU_DFAULT		        ! 09 data_access_exception (in mmu_asm.S) | ||||
|   BAD_TRAP;			! 0A tag_overflow | ||||
|  | ||||
|   BAD_TRAP;			! 0B undefined | ||||
|   BAD_TRAP;			! 0C undefined | ||||
|   BAD_TRAP;			! 0D undefined | ||||
|   BAD_TRAP;			! 0E undefined | ||||
|   BAD_TRAP;			! 0F undefined | ||||
|   BAD_TRAP;			! 10 undefined | ||||
|  | ||||
|   /* Interrupt entries */ | ||||
|   TRAP_ENTRY_INTERRUPT(1);		! 11 interrupt level 1 | ||||
|   TRAP_ENTRY_INTERRUPT(2);		! 12 interrupt level 2 | ||||
|   TRAP_ENTRY_INTERRUPT(3);		! 13 interrupt level 3 | ||||
|   TRAP_ENTRY_INTERRUPT(4);		! 14 interrupt level 4 | ||||
|   TRAP_ENTRY_INTERRUPT(5);		! 15 interrupt level 5 | ||||
|   TRAP_ENTRY_INTERRUPT(6);		! 16 interrupt level 6 | ||||
|   TRAP_ENTRY_INTERRUPT(7);		! 17 interrupt level 7 | ||||
|   TRAP_ENTRY_INTERRUPT(8);		! 18 interrupt level 8 | ||||
|   TRAP_ENTRY_INTERRUPT(9);		! 19 interrupt level 9 | ||||
|   TRAP_ENTRY_INTERRUPT(10);		! 1A interrupt level 1 | ||||
|   TRAP_ENTRY_INTERRUPT(11);		! 1B interrupt level 11 | ||||
|   TRAP_ENTRY_INTERRUPT(12);		! 1C interrupt level 12 | ||||
|   TRAP_ENTRY_INTERRUPT(13);		! 1D interrupt level 13 | ||||
|   TRAP_ENTRY_INTERRUPT(14);		! 1E interrupt level 14 | ||||
|   TRAP_ENTRY_INTERRUPT(15);		! 1F interrupt level 15 | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 20 - 23 undefined | ||||
|   BAD_TRAP;					! 24 cp_disabled | ||||
| 	    BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 25 - 27 undefined | ||||
|   BAD_TRAP;					! 28 cp_exception | ||||
| 	    BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 29 - 2B undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 2C - 2F undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 30 - 33 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 34 - 37 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 38 - 3B undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 3C - 3F undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 40 - 43 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 44 - 47 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 48 - 4B undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 4C - 4F undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 50 - 53 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 54 - 57 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 58 - 5B undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 5C - 5F undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 60 - 63 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 64 - 67 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 68 - 6B undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 6C - 6F undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 70 - 73 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 74 - 77 undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 78 - 7B undefined | ||||
|   BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;	! 7C - 7F undefined | ||||
|  | ||||
|   /* Software traps */ | ||||
|   SOFT_TRAP; SOFT_TRAP; TRAP(_irqcall); 	! 80 - 82  | ||||
| #ifndef _FLAT | ||||
|   TRAP_ENTRY(_flush_windows)			! 83 | ||||
| #else | ||||
|   SOFT_TRAP | ||||
| #endif | ||||
|   SOFT_TRAP;					! 84 | ||||
|   TRAP(_irqcall_disableirq);			! 85 | ||||
|   SOFT_TRAP; SOFT_TRAP;				! 86 - 87 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 88 - 8B | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 8C - 8F | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 90 - 93 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 94 - 97 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 98 - 9B | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 9C - 9F | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! A0 - A3 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! A4 - A7 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! A8 - AB | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! AC - AF | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! B0 - B3 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! B4 - B7 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! B8 - BB | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! BC - BF | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! C0 - C3 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! C4 - C7 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! C8 - CB | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! CC - CF | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! D0 - D3 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! D4 - D7 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! D8 - DB | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! DC - DF | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! E0 - E3 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! E4 - E7 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! E8 - EB | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! EC - EF | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! F0 - F3 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! F4 - F7 | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! F8 - FB  | ||||
|   SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! FC - FF | ||||
|  | ||||
|  | ||||
| 	 | ||||
							
								
								
									
										52
									
								
								libgloss/sparc_leon/locore_mvt_reset.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								libgloss/sparc_leon/locore_mvt_reset.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/head.h> | ||||
|                  | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	_hardreset_mvt | ||||
| 	.set	_hardreset_mvt,_hardreset_mvt_ram | ||||
| 	/* ------- */ | ||||
| 	.global	_hardreset | ||||
| 	 | ||||
| _hardreset_mvt_ram:	 | ||||
| 	mov	%psr, %g1 | ||||
| 	srl	%g1, 24, %g1 | ||||
| 	and  	%g1, 3, %g1 | ||||
| 	subcc	%g1, 3, %g0             ! leon2: 0 or 2, leon3:	3 | ||||
| 	bne	.L2 | ||||
| 	 nop | ||||
| 	 | ||||
| 	mov	%asr17, %g1		! set svt | ||||
| 	set     1<<13,%g2 | ||||
| 	andn    %g1,%g2,%g1 | ||||
| 	mov     %g1, %asr17 | ||||
| 	 | ||||
| .L2:	mov	%g0, %g4 | ||||
| 	sethi	%hi(_hardreset), %g4 | ||||
| 	jmp	%g4+%lo(_hardreset); | ||||
|          nop | ||||
|  | ||||
							
								
								
									
										44
									
								
								libgloss/sparc_leon/locore_svt.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								libgloss/sparc_leon/locore_svt.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|   | ||||
| /* The traptable has to be the first code in a boot PROM. */ | ||||
|  | ||||
| #include <asm-leon/head.h> | ||||
|                  | ||||
|   .seg    "text" | ||||
|  | ||||
|   .global _trap_table, _start_svt_weak | ||||
|   .global start | ||||
|    | ||||
|   /* Hardware traps */ | ||||
| 	/* svt code asumes that %g6 is never used in the code */ | ||||
|  | ||||
| start: | ||||
| _trap_table: | ||||
|  | ||||
| 	sethi %hi(_start_svt_weak), %g6 | ||||
| 	jmp %g6+%lo(_start_svt_weak) | ||||
| 	 nop	 | ||||
|  | ||||
							
								
								
									
										62
									
								
								libgloss/sparc_leon/locore_svt_reset.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								libgloss/sparc_leon/locore_svt_reset.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/head.h> | ||||
|                  | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	_hardreset_svt | ||||
| 	.set	_hardreset_svt, __hardreset_svt | ||||
| 	/* ------- */ | ||||
| 	.global	_hardreset, _hardreset_svt_real | ||||
| 	 | ||||
| ! reset entry point for single vector trapping. Try enable svt  | ||||
| _hardreset_svt_real: | ||||
| 	nop | ||||
| __hardreset_svt: | ||||
| 	mov	%psr, %l3 | ||||
| 	srl	%l3, 24, %g5 | ||||
| 	and  	%g5, 3, %g5 | ||||
| 	subcc	%g5, 3, %g0             ! leon2: 0 or 2, leon3:	3 | ||||
| 	bne	.L2 | ||||
| 	nop | ||||
| 	 | ||||
| 	mov	%asr17, %g5		! set svt | ||||
| 	set     1<<13,%g1 | ||||
| 	or      %g5,%g1,%g5 | ||||
| 	mov     %g5, %asr17 | ||||
| 	nop;  nop; nop | ||||
| 	mov	%asr17,%g5 		! check svt | ||||
| 	andcc	%g5, %g1, %g0 | ||||
| 	beq	.L2 | ||||
| 	 nop | ||||
|  | ||||
| 	set _hardreset,%l3 | ||||
| 	jmp %l3 | ||||
|          nop | ||||
| 	 | ||||
| .L2:	ta    0x0			! no svt implemented (ether leon2 or svt != 1) | ||||
|         nop | ||||
|  | ||||
							
								
								
									
										186
									
								
								libgloss/sparc_leon/locore_svtdisp.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								libgloss/sparc_leon/locore_svtdisp.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,186 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|   | ||||
| /* The traptable has to be the first code in a boot PROM. */ | ||||
|  | ||||
| #include <asm-leon/head.h> | ||||
|                  | ||||
| #define TRAP(H)  mov %psr, %l0; sethi %hi(H), %l4; jmp %l4+%lo(H); nop; | ||||
| #define TRAPL(H)  mov %g0, %l0; sethi %hi(H), %l4; jmp %l4+%lo(H); nop; | ||||
| #define TRAP_ENTRY(H) rd %psr, %l0; b H; rd %wim, %l3; nop; | ||||
|  | ||||
| #define WIM_INIT 2 | ||||
| #ifdef _SOFT_FLOAT | ||||
| #define PSR_INIT 0x0e0 | ||||
| #else | ||||
| #define PSR_INIT 0x10e0 | ||||
| #endif | ||||
|  | ||||
| #define NUMREGWINDOWS 8 | ||||
|  | ||||
| /* Unexcpected trap will halt the processor by forcing it to error state */ | ||||
| #define BAD_TRAP ta 0; nop; nop; nop; | ||||
|  | ||||
| /* Software trap. Treat as BAD_TRAP */ | ||||
| #define SOFT_TRAP BAD_TRAP | ||||
|  | ||||
| #define TT_MASK         0xff0   // trap type mask from tbr | ||||
| #define TT_SHL          4       // shift to get a tbr value | ||||
|  | ||||
|   .seg    "text" | ||||
|  | ||||
|    /* ------- */ | ||||
|    .weak  _start_svt_weak | ||||
|    .set	  _start_svt_weak,_start_svt_disp | ||||
|    /* ------- */ | ||||
| 	 | ||||
|   .global _trap_table, cpuinit, _hardreset, _hardreset_svt | ||||
|   .global _fpdis_enable_svt,_fpdis_svt,_window_overflow_svt,_window_underflow_svt | ||||
|   .global _leonbare_irq_entry_svt,_irqcall_svt,_flush_windows_svt,_srmmu_fault_svt,_irqcall_disableirq_svt | ||||
|   .global start, _start_svt_real | ||||
|  | ||||
| _start_svt_real:	 | ||||
| 	nop | ||||
| 	 | ||||
| _start_svt_disp:	 | ||||
| 	rd	%tbr, %l3 | ||||
| 	rd	%psr, %l0 | ||||
| 	! here,locals have been set up as follows: | ||||
| 	! %l0 = psr | ||||
| 	! %l1 = pc	 | ||||
| 	! %l2 = npc | ||||
| 	! %l3 = tbr | ||||
| 	and     %l3,TT_MASK,%l3 | ||||
| 	srl     %l3,TT_SHL,%l3 | ||||
| 	 | ||||
| /* | ||||
| struct get { | ||||
|   int start,end,func; | ||||
| }; | ||||
|  | ||||
| struct get table[3] = { | ||||
|   {0,1,..}, | ||||
|   {0,0,0}, | ||||
| }; | ||||
|  | ||||
| int gettrap(int nr){ | ||||
|   struct get *p = table; | ||||
|   while((p->start) || (p->end) || (p->func)) { | ||||
|     if (p->start <= nr && p->end >= nr) { | ||||
|       return p->func; | ||||
|     } | ||||
|     p++; | ||||
|   } | ||||
|   return 0; | ||||
| } | ||||
| 	 | ||||
| $sparc-elf-gcc -S gettrap.c -o test.S -O2 | ||||
| */ | ||||
| 	 | ||||
| #define loc_o0 l3	 | ||||
| #define loc_o1 l4	 | ||||
| #define loc_o2 l5	 | ||||
| #define loc_o3 l6	 | ||||
| 	 | ||||
|         sethi   %hi(trap_table), %loc_o2 | ||||
|         or      %loc_o2, %lo(trap_table), %loc_o2 | ||||
|         mov     %loc_o0, %loc_o3 | ||||
|         ld      [%loc_o2], %loc_o1 | ||||
| .LL13: | ||||
|         cmp     %loc_o1, %loc_o3 | ||||
| .LL12: | ||||
|         bg,a    .LL11 | ||||
|         add     %loc_o2, 12, %loc_o2 | ||||
|         ld      [%loc_o2+4], %loc_o0 | ||||
|         cmp     %loc_o0, %loc_o3 | ||||
|         bge,a   .LL1 | ||||
|         ld      [%loc_o2+8], %loc_o0 | ||||
|         add     %loc_o2, 12, %loc_o2 | ||||
| .LL11: | ||||
|         ld      [%loc_o2], %loc_o0 | ||||
|         orcc    %loc_o0, 0, %loc_o1 | ||||
|         bne     .LL12 | ||||
|         cmp     %loc_o1, %loc_o3 | ||||
|         ld      [%loc_o2+4], %loc_o0 | ||||
|         cmp     %loc_o0, 0 | ||||
|         bne     .LL12 | ||||
|         cmp     %loc_o1, %loc_o3 | ||||
|         ld      [%loc_o2+8], %loc_o0 | ||||
|         cmp     %loc_o0, 0 | ||||
|         bne     .LL12 | ||||
|         cmp     %loc_o1, %loc_o3 | ||||
| 	 | ||||
| 	!not in table | ||||
| 	BAD_TRAP  | ||||
| 	 | ||||
| .LL1: | ||||
| 	jmp %loc_o0 | ||||
| 	 nop	 | ||||
|  | ||||
| 	 | ||||
|         .global trap_table,svt_trap_table_ext,svt_trap_table_ext_end | ||||
|         .section        ".rodata" | ||||
|         .align 4 | ||||
| trap_table: | ||||
| 	.long 0,0,       _hardreset_svt | ||||
| 	.long 1,1,       _srmmu_fault_svt		! 01 instruction_access_exception (in mmu_asm.S) | ||||
| 	.long 4,4 | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	.long _fpdis_enable_svt				! 04 fp_disabled | ||||
| #else | ||||
| 	.long _fpdis_svt				! 04 fp_disabled | ||||
| #endif | ||||
| #ifndef _FLAT | ||||
| 	.long 5,   5,    _window_overflow_svt		! 05 window_overflow | ||||
| 	.long 6,   6,    _window_underflow_svt		! 06 window_underflow | ||||
| #endif | ||||
| 	.long 9,9,       _srmmu_fault_svt		! 09 data_access_exception (in mmu_asm.S) | ||||
| 	.long 0x11,0x1f, _leonbare_irq_entry_svt	! 11-1f interrupt level | ||||
| 	.long 0x82,0x82, _irqcall_svt			! 82 | ||||
| #ifndef _FLAT | ||||
| 	.long 0x83,0x83, _flush_windows_svt		! 83 | ||||
| #endif | ||||
| 	.long 0x85,0x85, _irqcall_disableirq_svt	! 85 | ||||
| svt_trap_table_ext:	 | ||||
| 	.long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
|         .long   0,0,0 | ||||
| svt_trap_table_ext_end:		 | ||||
|         .long   0,0,0 | ||||
|  | ||||
							
								
								
									
										77
									
								
								libgloss/sparc_leon/locore_var.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								libgloss/sparc_leon/locore_var.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
| 	 | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	_hardreset_custom_weak | ||||
| 	.set	_hardreset_custom_weak,_hardreset_custom_weak_dummy | ||||
| 	/* ------- */ | ||||
| 	.global _nwindows, _leon_version, _nwindows_min1 | ||||
| 	 | ||||
| _hardreset_custom_weak_dummy: | ||||
|  | ||||
| !'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
| ! get nwindows and leon version | ||||
| 			 | ||||
| 	mov	%psr, %l3 | ||||
| 	srl	%l3, 24, %g5 | ||||
| 	and  	%g5, 3, %g5 | ||||
| 	subcc	%g5, 3, %g0             ! leon3:	3 | ||||
| 	bne	1f | ||||
| 	nop | ||||
| 	set     _leon_version,%l0 | ||||
| 	set     3,%l1 | ||||
| 	st      %l1,[%l0] | ||||
| 	mov	%asr17, %g5		! leon3 has nwindows in %asr17 | ||||
| 	ba	2f | ||||
| 1: | ||||
| 	/* other version */ | ||||
| 2: | ||||
| 	and	%g5, 0x1f, %g5 | ||||
| 	set	_nwindows_min1, %l3 | ||||
| 	st	%g5, [%l3] | ||||
| 	add     %g5,1,%g5 | ||||
| 	set	_nwindows, %l3 | ||||
| 	st	%g5, [%l3] | ||||
| 	set	_nwindows_min2, %l3 | ||||
| 	sub     %g5,2,%g5 | ||||
| 	st	%g5, [%l3] | ||||
| 	 | ||||
| !'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
| 	 | ||||
| 	retl | ||||
| 	nop | ||||
|  | ||||
| !'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
| 	.section .data | ||||
| 	.global _nwindows, _leon_version, _nwindows_min1, _nwindows_min2 | ||||
| _nwindows: | ||||
| 	.word 8 | ||||
| _nwindows_min1:	 | ||||
| 	.word 7 | ||||
| _nwindows_min2:	 | ||||
| 	.word 6 | ||||
| _leon_version: | ||||
| 	.word 3 | ||||
							
								
								
									
										37
									
								
								libgloss/sparc_leon/locore_var_svt.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								libgloss/sparc_leon/locore_var_svt.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| 	 | ||||
| 	.section .text | ||||
| 	/* ------- */ | ||||
| 	.weak	_hardreset_custom_svt_weak | ||||
| 	.set	_hardreset_custom_svt_weak,_hardreset_custom_svt_weak_dummy | ||||
| 	/* ------- */ | ||||
| 	 | ||||
|  | ||||
| _hardreset_custom_svt_weak_dummy:		 | ||||
| 	retl | ||||
| 	 nop | ||||
| 	 | ||||
							
								
								
									
										45
									
								
								libgloss/sparc_leon/mmu_asm.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								libgloss/sparc_leon/mmu_asm.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
|          | ||||
|   .seg    "text" | ||||
|  | ||||
|         ! srmmu trap or data access trap | ||||
| 	/* ------- */ | ||||
| 	.weak	_srmmu_fault_svt | ||||
| 	.set	_srmmu_fault_svt,__srmmu_fault_svt | ||||
| 	.weak	_srmmu_fault | ||||
| 	.set	_srmmu_fault,__srmmu_fault | ||||
| 	/* ------- */ | ||||
|  | ||||
| /* 1 (inst) or 9 (data) in %l6 */	 | ||||
| __srmmu_fault_svt: | ||||
| __srmmu_fault:	 | ||||
| 	ta 0; nop; nop; nop; | ||||
|   	jmp  %l1			! Re-execute save. | ||||
|   	rett %l2 | ||||
							
								
								
									
										256
									
								
								libgloss/sparc_leon/mutex.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								libgloss/sparc_leon/mutex.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,256 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/lock.h> | ||||
| #include <asm-leon/queue.h> | ||||
| /*#include <sys/fsu_pthread_mutex.h>*/ | ||||
|  | ||||
| typedef int pthread_protocol_t; | ||||
| typedef | ||||
| TAILQ_HEAD (pthread_queue, pthread) * | ||||
|   pthread_queue_t; | ||||
|  | ||||
| #define pthread_mutex_t_defined | ||||
|      typedef struct pthread_mutex | ||||
|      { | ||||
|        struct pthread_queue queue; | ||||
|        char lock; | ||||
|        struct pthread *owner; | ||||
|        int flags; | ||||
|        int count; | ||||
|        int prioceiling; | ||||
|        pthread_protocol_t protocol; | ||||
|        int prev_max_ceiling_prio; | ||||
|          TAILQ_ENTRY (pthread_mutex) dbglist; | ||||
|        char *dbgname; | ||||
|        int _fitothers[16]; | ||||
|      } pthread_mutex_t; | ||||
|  | ||||
|      typedef struct | ||||
|      { | ||||
|        int flags; | ||||
|        int prioceiling; | ||||
|        pthread_protocol_t protocol; | ||||
|      } pthread_mutexattr_t; | ||||
|  | ||||
|  | ||||
|      int (*__lbst_pthread_mutex_init) (pthread_mutex_t * __mutex, | ||||
| 				       pthread_mutexattr_t * __mutex_attr) = | ||||
|   0; | ||||
|      int (*__lbst_pthread_mutex_destroy) (pthread_mutex_t * __mutex) = 0; | ||||
|      int (*__lbst_pthread_mutex_trylock) (pthread_mutex_t * __mutex) = 0; | ||||
|      int (*__lbst_pthread_mutex_lock) (pthread_mutex_t * __mutex) = 0; | ||||
|      int (*__lbst_pthread_mutex_unlock) (pthread_mutex_t * __mutex) = 0; | ||||
|      int (*__lbst_pthread_mutexattr_init) (pthread_mutexattr_t * __attr) = 0; | ||||
|      int (*__lbst_pthread_mutexattr_destroy) (pthread_mutexattr_t * __attr) = | ||||
|   0; | ||||
|      int (*__lbst_pthread_mutexattr_settype) (pthread_mutexattr_t * __attr, | ||||
| 					      int __kind) = 0; | ||||
|  | ||||
|      int ___st_pthread_mutex_init (mutex, attr) | ||||
|      pthread_mutex_t *mutex; | ||||
|      pthread_mutexattr_t *attr; | ||||
| { | ||||
|   if (__lbst_pthread_mutex_init) | ||||
|     { | ||||
|       return __lbst_pthread_mutex_init (mutex, attr); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ___st_pthread_mutex_destroy (mutex) | ||||
|      pthread_mutex_t *mutex; | ||||
| { | ||||
|   if (__lbst_pthread_mutex_destroy) | ||||
|     { | ||||
|       return __lbst_pthread_mutex_destroy (mutex); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ___st_pthread_mutex_lock (mutex) | ||||
|      pthread_mutex_t *mutex; | ||||
| { | ||||
|   if (__lbst_pthread_mutex_lock) | ||||
|     { | ||||
|       return __lbst_pthread_mutex_lock (mutex); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ___st_pthread_mutex_trylock (mutex) | ||||
|      pthread_mutex_t *mutex; | ||||
| { | ||||
|   if (__lbst_pthread_mutex_trylock) | ||||
|     { | ||||
|       return __lbst_pthread_mutex_trylock (mutex); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ___st_pthread_mutex_unlock (mutex) | ||||
|      pthread_mutex_t *mutex; | ||||
| { | ||||
|   if (__lbst_pthread_mutex_unlock) | ||||
|     { | ||||
|       return __lbst_pthread_mutex_unlock (mutex); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ___st_pthread_mutexattr_init (attr) | ||||
|      pthread_mutexattr_t *attr; | ||||
| { | ||||
|   if (__lbst_pthread_mutexattr_init) | ||||
|     { | ||||
|       return __lbst_pthread_mutexattr_init (attr); | ||||
|     } | ||||
|   return (0); | ||||
| } | ||||
|  | ||||
| int | ||||
| ___st_pthread_mutexattr_destroy (attr) | ||||
|      pthread_mutexattr_t *attr; | ||||
| { | ||||
|   if (__lbst_pthread_mutexattr_destroy) | ||||
|     { | ||||
|       return __lbst_pthread_mutexattr_destroy (attr); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ___st_pthread_mutexattr_settype (attr, kind) | ||||
|      pthread_mutexattr_t *attr; | ||||
|      int kind; | ||||
| { | ||||
|   if (__lbst_pthread_mutexattr_settype) | ||||
|     { | ||||
|       return __lbst_pthread_mutexattr_settype (attr, kind); | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| #include <asm-leon/elfmacro.h> | ||||
|  | ||||
| weak_alias (___st_pthread_mutex_init, __st_pthread_mutex_init) | ||||
| weak_alias (___st_pthread_mutex_destroy, __st_pthread_mutex_destroy) | ||||
| weak_alias (___st_pthread_mutex_trylock, __st_pthread_mutex_trylock) | ||||
| weak_alias (___st_pthread_mutex_lock, __st_pthread_mutex_lock) | ||||
| weak_alias (___st_pthread_mutex_unlock, __st_pthread_mutex_unlock) | ||||
| weak_alias (___st_pthread_mutexattr_init, __st_pthread_mutexattr_init) | ||||
| weak_alias (___st_pthread_mutexattr_destroy, __st_pthread_mutexattr_destroy) | ||||
| weak_alias (___st_pthread_mutexattr_settype, __st_pthread_mutexattr_settype) | ||||
| /* /\* #ifndef weak_extern *\/ */ | ||||
| /* /\* #define weak_extern(symbol) _weak_extern (symbol) *\/ */ | ||||
| /* /\* #define _weak_extern(symbol) asm (".weak " #symbol); *\/ */ | ||||
| /* /\* #endif *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_init) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_destroy) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_lock) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_trylock) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_unlock) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutexattr_init) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutexattr_destroy) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutexattr_settype) *\/ */ | ||||
| /* /\* weak_extern (__pthread_once) *\/ */ | ||||
| /* /\* weak_extern (__pthread_initialize) *\/ */ | ||||
| /* /\* Initialize the named lock variable, leaving it in a consistent, unlocked */ | ||||
| /*    state.  *\/ */ | ||||
| /* #define __libc_lock_init(NAME) \ */ | ||||
| /*   (__pthread_mutex_init != NULL ? __pthread_mutex_init (&(NAME), NULL) : 0); */ | ||||
| /* /\* Same as last but this time we initialize a recursive mutex.  *\/ */ | ||||
| /* #define __libc_lock_init_recursive(NAME) \ */ | ||||
| /*   do {									      \ */ | ||||
| /*     if (__pthread_mutex_init != NULL)					      \ */ | ||||
| /*       {									      \ */ | ||||
| /* 	pthread_mutexattr_t __attr;					      \ */ | ||||
| /* 	__pthread_mutexattr_init (&__attr);				      \ */ | ||||
| /* 	__pthread_mutexattr_settype (&__attr, PTHREAD_MUTEX_RECURSIVE_NP); \ */ | ||||
| /* 	__pthread_mutex_init (&(NAME), &__attr);			      \ */ | ||||
| /* 	__pthread_mutexattr_destroy (&__attr);				      \ */ | ||||
| /*       }									      \ */ | ||||
| /*   } while (0); */ | ||||
| /* /\* Finalize the named lock variable, which must be locked.  It cannot be */ | ||||
| /*    used again until __libc_lock_init is called again on it.  This must be */ | ||||
| /*    called on a lock variable before the containing storage is reused.  *\/ */ | ||||
| /* //#define __libc_lock_fini(NAME)              (__pthread_mutex_destroy != NULL ? __pthread_mutex_destroy (&(NAME)) : 0) */ | ||||
| /* #define __libc_lock_fini(NAME)              (__st_pthread_mutex_destroy (&(NAME))) */ | ||||
| /* /\* Finalize recursive named lock.  *\/ */ | ||||
| /* #define __libc_lock_fini_recursive(NAME)     __libc_lock_fini (NAME) */ | ||||
| /* /\* Lock the named lock variable.  *\/ */ | ||||
| /* //#define __libc_lock_lock(NAME)              (__pthread_mutex_lock != NULL ? __pthread_mutex_lock (&(NAME)) : 0) */ | ||||
| /* #define __libc_lock_lock(NAME)              (__st_pthread_mutex_lock (&(NAME))) */ | ||||
| /* /\* Lock the recursive named lock variable.  *\/ */ | ||||
| /* #define __libc_lock_lock_recursive(NAME)     __libc_lock_lock (NAME) */ | ||||
| /* /\* Try to lock the named lock variable.  *\/ */ | ||||
| /* //#define __libc_lock_trylock(NAME)           (__pthread_mutex_trylock != NULL ? __pthread_mutex_trylock (&(NAME)) : 0) */ | ||||
| /* #define __libc_lock_trylock(NAME)           (__st_pthread_mutex_trylock (&(NAME))) */ | ||||
| /* /\* Try to lock the recursive named lock variable.  *\/ */ | ||||
| /* #define __libc_lock_trylock_recursive(NAME)  __libc_lock_trylock (NAME) */ | ||||
| /* /\* Unlock the named lock variable.  *\/ */ | ||||
| /* //#define __libc_lock_unlock(NAME)            (__pthread_mutex_unlock != NULL ? __pthread_mutex_unlock (&(NAME)) : 0) */ | ||||
| /* #define __libc_lock_unlock(NAME)            (__st_pthread_mutex_unlock (&(NAME))) */ | ||||
| /* /\* Unlock the recursive named lock variable.  *\/ */ | ||||
| /* #define __libc_lock_unlock_recursive(NAME)   __libc_lock_unlock (NAME) */ | ||||
| /* extern int __st_pthread_mutex_init        (pthread_mutex_t *__mutex, pthread_mutexattr_t *__mutex_attr); */ | ||||
| /* extern int __st_pthread_mutex_destroy     (pthread_mutex_t *__mutex); */ | ||||
| /* extern int __st_pthread_mutex_trylock     (pthread_mutex_t *__mutex); */ | ||||
| /* extern int __st_pthread_mutex_lock        (pthread_mutex_t *__mutex); */ | ||||
| /* extern int __st_pthread_mutex_unlock      (pthread_mutex_t *__mutex); */ | ||||
| /* extern int __st_pthread_mutexattr_init    (pthread_mutexattr_t *__attr); */ | ||||
| /* extern int __st_pthread_mutexattr_destroy (pthread_mutexattr_t *__attr); */ | ||||
| /* extern int __st_pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind); */ | ||||
| /* /\* /\\* Functions that are used by this file and are internal to the GNU C library.  *\\/ *\/ */ | ||||
| /* /\* extern int __pthread_mutex_init        (pthread_mutex_t *__mutex, pthread_mutexattr_t *__mutex_attr); *\/ */ | ||||
| /* /\* extern int __pthread_mutex_destroy     (pthread_mutex_t *__mutex); *\/ */ | ||||
| /* /\* extern int __pthread_mutex_trylock     (pthread_mutex_t *__mutex); *\/ */ | ||||
| /* /\* extern int __pthread_mutex_lock        (pthread_mutex_t *__mutex); *\/ */ | ||||
| /* /\* extern int __pthread_mutex_unlock      (pthread_mutex_t *__mutex); *\/ */ | ||||
| /* /\* extern int __pthread_mutexattr_init    (pthread_mutexattr_t *__attr); *\/ */ | ||||
| /* /\* extern int __pthread_mutexattr_destroy (pthread_mutexattr_t *__attr); *\/ */ | ||||
| /* /\* extern int __pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind); *\/ */ | ||||
| /* /\* /\\* Make the pthread functions weak so that we can elide them from *\/ */ | ||||
| /* /\*    single-threaded processes.  *\\/ *\/ */ | ||||
| /* /\* #ifndef weak_extern *\/ */ | ||||
| /* /\* #define weak_extern(symbol) _weak_extern (symbol) *\/ */ | ||||
| /* /\* #define _weak_extern(symbol) asm (".weak " #symbol); *\/ */ | ||||
| /* /\* #endif *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_init) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_destroy) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_lock) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_trylock) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutex_unlock) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutexattr_init) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutexattr_destroy) *\/ */ | ||||
| /* /\* weak_extern (__pthread_mutexattr_settype) *\/ */ | ||||
| /* /\* weak_extern (__pthread_once) *\/ */ | ||||
| /* /\* weak_extern (__pthread_initialize) *\/ */ | ||||
							
								
								
									
										117
									
								
								libgloss/sparc_leon/nocache.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								libgloss/sparc_leon/nocache.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,117 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/elfmacro.h> | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/contextswitch.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
| #include <asm-leon/leonbare_kernel.h> | ||||
|  | ||||
| 	FUNC_EXPORT(leonbare_leon23_loadnocache) | ||||
| 	FUNC_EXPORT(leonbare_leon23_loadnocache16) | ||||
| 	FUNC_EXPORT(leonbare_leon23_loadnocache8) | ||||
|  | ||||
| 	FUNC_EXPORT(leonbare_leon3_loadnocache) | ||||
| 	FUNC_EXPORT(leonbare_leon3_loadnocache16) | ||||
| 	FUNC_EXPORT(leonbare_leon3_loadnocache8) | ||||
|  | ||||
| 	 | ||||
| 	FUNC_EXPORT(leonbare_leon23_storenocache) | ||||
| 	FUNC_EXPORT(leonbare_leon23_storenocache16) | ||||
| 	FUNC_EXPORT(leonbare_leon23_storenocache8) | ||||
| 	 | ||||
| 	FUNC_IMPORT(_leon_version) | ||||
|  | ||||
| 	.text | ||||
|  | ||||
| /* =================================== */	 | ||||
| /* LEON2 / 3 */ | ||||
| /* load with forceing cache miss */	 | ||||
| FUNC_BEGIN(leonbare_leon23_loadnocache)		/* use only %o0,%o1,%o7 */	 | ||||
| 	lda 	[%o0] ASI_LEON3_CACHEMISS, %o0 | ||||
| 	retl | ||||
| 	 nop | ||||
| FUNC_END(leonbare_leon23_loadnocache) | ||||
|  | ||||
| /* load with forceing cache miss */	 | ||||
| FUNC_BEGIN(leonbare_leon23_loadnocache16) | ||||
| 	lduha 	[%o0] ASI_LEON3_CACHEMISS, %o0 | ||||
| 	retl | ||||
| 	 nop | ||||
| FUNC_END(leonbare_leon23_loadnocache16) | ||||
|  | ||||
| /* load with forceing cache miss */	 | ||||
| FUNC_BEGIN(leonbare_leon23_loadnocache8) | ||||
| 	lduba 	[%o0] ASI_LEON3_CACHEMISS, %o0 | ||||
| 	retl | ||||
| 	 nop | ||||
| FUNC_END(leonbare_leon23_loadnocache8) | ||||
|  | ||||
| /* write through cache */ | ||||
| FUNC_BEGIN(leonbare_leon23_storenocache)		/* use only %o0,%o1,%o7 */	 | ||||
| 	st 	%o1, [%o0] | ||||
| 	retl | ||||
| 	 mov 	%o1,%o0 | ||||
| FUNC_END(leonbare_leon23_storenocache) | ||||
| 		 | ||||
| /* write through cache */ | ||||
| FUNC_BEGIN(leonbare_leon23_storenocache16) | ||||
| 	sth 	%o1, [%o0] | ||||
| 	retl | ||||
| 	 mov 	%o1,%o0 | ||||
| FUNC_END(leonbare_leon23_storenocache16) | ||||
|  | ||||
| /* write through cache */ | ||||
| FUNC_BEGIN(leonbare_leon23_storenocache8) | ||||
| 	stb 	%o1, [%o0] | ||||
| 	retl | ||||
| 	 mov 	%o1,%o0 | ||||
| FUNC_END(leonbare_leon23_storenocache8) | ||||
|  | ||||
|  | ||||
|  | ||||
| /* =================================== */	 | ||||
| /* LEON3 only */ | ||||
| /* load with forceing cache miss */	 | ||||
| FUNC_BEGIN(leonbare_leon3_loadnocache)		/* use only %o0,%o1,%o7 */	 | ||||
| 	retl | ||||
| 	 lda 	[%o0] ASI_LEON3_CACHEMISS, %o0 | ||||
| FUNC_END(leonbare_leon3_loadnocache) | ||||
|  | ||||
| /* load with forceing cache miss */	 | ||||
| FUNC_BEGIN(leonbare_leon3_loadnocache16) | ||||
| 	retl | ||||
| 	 lduha 	[%o0] ASI_LEON3_CACHEMISS, %o0 | ||||
| FUNC_END(leonbare_leon3_loadnocache16) | ||||
|  | ||||
| /* load with forceing cache miss */	 | ||||
| FUNC_BEGIN(leonbare_leon3_loadnocache8) | ||||
| 	retl | ||||
| 	 lduba 	[%o0] ASI_LEON3_CACHEMISS, %o0 | ||||
| FUNC_END(leonbare_leon3_loadnocache8) | ||||
| 	 | ||||
|  | ||||
| 	 | ||||
							
								
								
									
										430
									
								
								libgloss/sparc_leon/pnpinit.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										430
									
								
								libgloss/sparc_leon/pnpinit.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,430 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/amba.h> | ||||
| #undef AMBA_TYPE_AHBIO_ADDR | ||||
| #include <asm-leon/lambapp.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #define AMBA_CONF_AREA 0xff000 | ||||
| #define AMBA_AHB_SLAVE_CONF_AREA (1 << 11) | ||||
| #define AMBA_APB_SLAVES 16 | ||||
|  | ||||
| #ifdef PDEBUG | ||||
| #define DPRINTF(p)  printf p | ||||
| #else | ||||
| #define DPRINTF(p) | ||||
| #endif | ||||
|  | ||||
| unsigned int | ||||
| ambapp_addr_from (struct ambapp_mmap *mmaps, unsigned int address) | ||||
| { | ||||
|   /* no translation? */ | ||||
|   if (!mmaps) | ||||
|     return address; | ||||
|  | ||||
|   while (mmaps->size) | ||||
|     { | ||||
|       if ((address >= mmaps->remote_adr) | ||||
| 	  && (address <= (mmaps->remote_adr + (mmaps->size - 1)))) | ||||
| 	{ | ||||
| 	  return (address - mmaps->remote_adr) + mmaps->local_adr; | ||||
| 	} | ||||
|       mmaps++; | ||||
|     } | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
|  | ||||
| static void | ||||
| ambapp_ahb_dev_init (unsigned int ioarea, | ||||
| 		     struct ambapp_mmap *mmaps, | ||||
| 		     struct ambapp_pnp_ahb *ahb, struct ambapp_dev_hdr *dev) | ||||
| { | ||||
|   int bar; | ||||
|   struct ambapp_ahb_info *ahb_info; | ||||
|   unsigned int addr, mask, mbar; | ||||
|  | ||||
|   /* Setup device struct */ | ||||
|   dev->vendor = ambapp_pnp_vendor (ahb->id); | ||||
|   dev->device = ambapp_pnp_device (ahb->id); | ||||
|   ahb_info = dev->devinfo; | ||||
|   ahb_info->ver = ambapp_pnp_ver (ahb->id); | ||||
|   ahb_info->irq = ambapp_pnp_irq (ahb->id); | ||||
|   ahb_info->custom[0] = (unsigned int) ahb->custom[0]; | ||||
|   ahb_info->custom[1] = (unsigned int) ahb->custom[1]; | ||||
|   ahb_info->custom[2] = (unsigned int) ahb->custom[2]; | ||||
|  | ||||
|   DPRINTF (("+AHB device %d:%d\n", dev->device, dev->vendor)); | ||||
|  | ||||
|   /* Memory BARs */ | ||||
|   for (bar = 0; bar < 4; bar++) | ||||
|     { | ||||
|       mbar = ahb->mbar[bar]; | ||||
|       if (mbar == 0) | ||||
| 	{ | ||||
| 	  addr = 0; | ||||
| 	  mask = 0; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  addr = ambapp_pnp_start (mbar); | ||||
| 	  if (ambapp_pnp_mbar_type (mbar) == AMBA_TYPE_AHBIO) | ||||
| 	    { | ||||
| 	      /* AHB I/O area is releative IO_AREA */ | ||||
| 	      addr = AMBA_TYPE_AHBIO_ADDR (addr, ioarea); | ||||
| 	      mask = | ||||
| 		(((unsigned int) (ambapp_pnp_mbar_mask ((~mbar)) << 8) | | ||||
| 		  0xff)) + 1; | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      /* AHB memory area, absolute address */ | ||||
| 	      addr = ambapp_addr_from (mmaps, addr); | ||||
| 	      mask = | ||||
| 		(~((unsigned int) (ambapp_pnp_mbar_mask (mbar) << 20))) + 1; | ||||
| 	    } | ||||
| 	} | ||||
|       ahb_info->start[bar] = addr; | ||||
|       ahb_info->mask[bar] = mask; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| ambapp_apb_dev_init (unsigned int base, | ||||
| 		     struct ambapp_mmap *mmaps, | ||||
| 		     struct ambapp_pnp_apb *apb, struct ambapp_dev_hdr *dev) | ||||
| { | ||||
|   struct ambapp_apb_info *apb_info; | ||||
|  | ||||
|   /* Setup device struct */ | ||||
|   dev->vendor = ambapp_pnp_vendor (apb->id); | ||||
|   dev->device = ambapp_pnp_device (apb->id); | ||||
|   apb_info = dev->devinfo; | ||||
|   apb_info->ver = ambapp_pnp_ver (apb->id); | ||||
|   apb_info->irq = ambapp_pnp_irq (apb->id); | ||||
|   apb_info->start = ambapp_pnp_apb_start (apb->iobar, base); | ||||
|   apb_info->mask = ambapp_pnp_apb_mask (apb->iobar); | ||||
|  | ||||
|   DPRINTF (("+APB device %d:%d\n", dev->device, dev->vendor)); | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| #define MAX_NUM_BUSES 16 | ||||
| static void | ||||
| ambapp_add_scanned_bus (unsigned int *ioareas, unsigned int ioarea) | ||||
| { | ||||
|   int i; | ||||
|   for (i = 0; i < MAX_NUM_BUSES; i++) | ||||
|     { | ||||
|       if (ioareas[i] == 0) | ||||
| 	{ | ||||
| 	  ioareas[i] = ioarea; | ||||
| 	  return; | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| static int | ||||
| ambapp_has_been_scanned (unsigned int *ioareas, unsigned int ioarea) | ||||
| { | ||||
|   int i; | ||||
|   if (!ioareas) | ||||
|     return 0; | ||||
|  | ||||
|   for (i = 0; i < MAX_NUM_BUSES; i++) | ||||
|     { | ||||
|       if (ioareas[i] == 0) | ||||
| 	{ | ||||
| 	  break; | ||||
| 	} | ||||
|       else if (ioareas[i] == ioarea) | ||||
| 	{ | ||||
| 	  return 1; | ||||
| 	} | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| ambapp_find (unsigned int ioarea, | ||||
| 	     struct ambapp_dev_hdr *parent, | ||||
| 	     struct ambapp_mmap *mmaps, | ||||
| 	     void *internal, | ||||
| 	     int (*find_match) (struct ambapp_dev_hdr * dev, void *arg), | ||||
| 	     void *arg, int vendor, int device) | ||||
| { | ||||
|   struct ambapp_pnp_ahb *ahb, ahb_buf; | ||||
|   struct ambapp_pnp_apb *apb, apb_buf; | ||||
|   struct ambapp_dev_hdr *dev, *prev, *prevapb, *apbdev; | ||||
|   struct ambapp_ahb_info *ahb_info; | ||||
|   int maxloops = 64; | ||||
|   unsigned int apbbase, bridge_address; | ||||
|   int i, j; | ||||
|  | ||||
|   DPRINTF (("Scan at 0x%08x\n", ioarea)); | ||||
|  | ||||
|   if (parent) | ||||
|     { | ||||
|       /* scan first bus for 64 devices, rest for 16 devices */ | ||||
|       maxloops = 16; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       if (internal) | ||||
| 	{ | ||||
| 	  ambapp_add_scanned_bus (internal, ioarea); | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   prev = parent; | ||||
|  | ||||
|   /* AHB MASTERS */ | ||||
|   ahb = (struct ambapp_pnp_ahb *) (ioarea | AMBA_CONF_AREA); | ||||
|   for (i = 0; i < maxloops; i++) | ||||
|     { | ||||
|       memcpy (&ahb_buf, ahb, sizeof (struct ambapp_pnp_ahb)); | ||||
|       if (ahb_buf.id != 0) | ||||
| 	{ | ||||
| 	  struct ambapp_dev_hdr _dev; | ||||
| 	  struct ambapp_ahb_info _ahb; | ||||
| 	  memset (&_dev, 0, sizeof (_dev)); | ||||
| 	  memset (&_ahb, 0, sizeof (_ahb)); | ||||
| 	  _dev.devinfo = &_ahb; | ||||
| 	  _dev.dev_type = DEV_AHB_MST; | ||||
| 	  dev = &_dev; | ||||
|  | ||||
| 	  ambapp_ahb_dev_init (ioarea, mmaps, &ahb_buf, dev); | ||||
|  | ||||
| 	  DPRINTF ((" = test %d:%d == %d:%d\n", vendor, device, dev->vendor, | ||||
| 		    dev->device)); | ||||
|  | ||||
| 	  if (vendor == dev->vendor && | ||||
| 	      device == dev->device && find_match (dev, arg)) | ||||
| 	    { | ||||
| 	      return 1; | ||||
| 	    } | ||||
| 	} | ||||
|       ahb++; | ||||
|     } | ||||
|  | ||||
|  | ||||
|   /* AHB SLAVES */ | ||||
|   ahb = | ||||
|     (struct ambapp_pnp_ahb *) (ioarea | AMBA_CONF_AREA | | ||||
| 			       AMBA_AHB_SLAVE_CONF_AREA); | ||||
|   for (i = 0; i < maxloops; i++) | ||||
|     { | ||||
|       memcpy (&ahb_buf, ahb, sizeof (struct ambapp_pnp_ahb)); | ||||
|       if (ahb_buf.id != 0) | ||||
| 	{ | ||||
| 	  struct ambapp_dev_hdr _dev; | ||||
| 	  struct ambapp_ahb_info _ahb; | ||||
| 	  memset (&_dev, 0, sizeof (_dev)); | ||||
| 	  memset (&_ahb, 0, sizeof (_ahb)); | ||||
| 	  _dev.devinfo = &_ahb; | ||||
| 	  _dev.dev_type = DEV_AHB_MST; | ||||
| 	  dev = &_dev; | ||||
|  | ||||
| 	  ambapp_ahb_dev_init (ioarea, mmaps, &ahb_buf, dev); | ||||
|  | ||||
| 	  DPRINTF ((" = test %d:%d == %d:%d\n", vendor, device, dev->vendor, | ||||
| 		    dev->device)); | ||||
|  | ||||
| 	  if (vendor == dev->vendor && | ||||
| 	      device == dev->device && find_match (dev, arg)) | ||||
| 	    { | ||||
| 	      return 1; | ||||
| 	    } | ||||
|  | ||||
| 	  /* Is it a AHB/AHB Bridge ? */ | ||||
| 	  if ((dev->device == GAISLER_AHB2AHB) | ||||
| 	      && (dev->vendor == VENDOR_GAISLER)) | ||||
| 	    { | ||||
| 	      /* AHB/AHB Bridge Found, recurse down the Bridge */ | ||||
| 	      ahb_info = dev->devinfo; | ||||
| 	      if (ahb_info->ver) | ||||
| 		{ | ||||
| 		  bridge_address = | ||||
| 		    ambapp_addr_from (mmaps, ahb_info->custom[1]); | ||||
|  | ||||
| 		  DPRINTF (("+(AHBAHB:0x%x)\n", bridge_address)); | ||||
|  | ||||
| 		  /* Makes sure bus only scanned once */ | ||||
| 		  if (internal == 0 | ||||
| 		      || ambapp_has_been_scanned (internal, | ||||
| 						  bridge_address) == NULL) | ||||
| 		    { | ||||
| 		      if (internal) | ||||
| 			ambapp_add_scanned_bus (internal, bridge_address); | ||||
|  | ||||
| 		      if (ambapp_find (bridge_address, dev, mmaps, internal, | ||||
| 				       find_match, arg, vendor, device)) | ||||
| 			return 1; | ||||
| 		    } | ||||
| 		} | ||||
| 	    } | ||||
| 	  else if ((dev->device == GAISLER_APBMST) | ||||
| 		   && (dev->vendor == VENDOR_GAISLER)) | ||||
| 	    { | ||||
| 	      /* AHB/APB Bridge Found, add the APB devices to this AHB Slave's children */ | ||||
| 	      prevapb = dev; | ||||
| 	      ahb_info = dev->devinfo; | ||||
| 	      apbbase = ahb_info->start[0]; | ||||
| 	      apb = (struct ambapp_pnp_apb *) (apbbase | AMBA_CONF_AREA); | ||||
| 	      for (j = 0; j < AMBA_APB_SLAVES; j++) | ||||
| 		{ | ||||
| 		  memcpy (&apb_buf, apb, sizeof (struct ambapp_pnp_apb)); | ||||
| 		  if (apb_buf.id) | ||||
| 		    { | ||||
| 		      struct ambapp_dev_hdr _apbdev; | ||||
| 		      struct ambapp_apb_info _apb; | ||||
| 		      memset (&_apbdev, 0, sizeof (_apbdev)); | ||||
| 		      memset (&_apb, 0, sizeof (_apb)); | ||||
| 		      _apbdev.devinfo = &_apb; | ||||
| 		      _apbdev.dev_type = DEV_APB_SLV; | ||||
| 		      apbdev = &_apbdev; | ||||
|  | ||||
| 		      ambapp_apb_dev_init (apbbase, mmaps, &apb_buf, apbdev); | ||||
|  | ||||
| 		      DPRINTF ((" = test %d:%d == %d:%d\n", vendor, device, | ||||
| 				apbdev->vendor, apbdev->device)); | ||||
|  | ||||
| 		      if (vendor == apbdev->vendor && | ||||
| 			  device == apbdev->device && | ||||
| 			  find_match (apbdev, arg)) | ||||
| 			{ | ||||
|  | ||||
| 			  return 1; | ||||
| 			} | ||||
| 		    } | ||||
| 		  apb++; | ||||
| 		} | ||||
| 	    } | ||||
| 	} | ||||
|       ahb++; | ||||
|     } | ||||
|  | ||||
|   if (parent == NULL) | ||||
|     { | ||||
|       /*free(internal); */ | ||||
|     } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| struct ambapp_dev_find_match_arg | ||||
| { | ||||
|   int index; | ||||
|   int count; | ||||
|   int type; | ||||
|   void *dev; | ||||
| }; | ||||
|  | ||||
| /* AMBA PP find routines */ | ||||
| static int | ||||
| ambapp_dev_find_match (struct ambapp_dev_hdr *dev, void *arg) | ||||
| { | ||||
|   struct ambapp_dev_find_match_arg *p = arg; | ||||
|  | ||||
|   if (p->index == 0) | ||||
|     { | ||||
|       /* Found controller, stop */ | ||||
|       if (p->type == DEV_APB_SLV) | ||||
| 	{ | ||||
| 	  *(struct ambapp_apb_info *) p->dev = | ||||
| 	    *(struct ambapp_apb_info *) dev->devinfo; | ||||
| 	  p->dev = ((struct ambapp_apb_info *) p->dev) + 1; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  *(struct ambapp_ahb_info *) p->dev = | ||||
| 	    *(struct ambapp_ahb_info *) dev->devinfo; | ||||
| 	  p->dev = ((struct ambapp_ahb_info *) p->dev) + 1; | ||||
| 	} | ||||
|       p->count--; | ||||
|       if (p->count < 1) | ||||
| 	return 1; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       p->index--; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| static int | ||||
| find_apbslvs_next (int vendor, int device, struct ambapp_apb_info *dev, | ||||
| 		   int index, int maxno) | ||||
| { | ||||
|   struct ambapp_dev_find_match_arg arg; | ||||
|   unsigned int busses[MAX_NUM_BUSES]; | ||||
|   memset (busses, 0, sizeof (busses)); | ||||
|  | ||||
|   arg.index = index; | ||||
|   arg.count = maxno; | ||||
|   arg.type = DEV_APB_SLV;	/* APB */ | ||||
|   arg.dev = dev; | ||||
|  | ||||
|   ambapp_find (LEON3_IO_AREA, NULL, NULL, &busses, | ||||
| 	       ambapp_dev_find_match, &arg, vendor, device); | ||||
|  | ||||
|   return maxno - arg.count; | ||||
| } | ||||
|  | ||||
| int | ||||
| find_apbslv (int vendor, int device, struct ambapp_apb_info *dev) | ||||
| { | ||||
|   return find_apbslvs_next (vendor, device, dev, 0, 1); | ||||
| } | ||||
|  | ||||
| struct ambapp_dev_hdr *ambapp_root = NULL; | ||||
| unsigned int busses[MAX_NUM_BUSES]; | ||||
| extern unsigned int console; | ||||
| extern unsigned int rtc; | ||||
| extern unsigned int irqmp; | ||||
|  | ||||
| void | ||||
| pnpinit (void) | ||||
| { | ||||
|   struct ambapp_apb_info dev; | ||||
|   int n; | ||||
|   if ((n = find_apbslv (VENDOR_GAISLER, GAISLER_APBUART, &dev)) == 1) | ||||
|     { | ||||
|       console = dev.start; | ||||
|       DPRINTF (("Found abuart at 0x%x\n", console)); | ||||
|     } | ||||
|   if ((n = find_apbslv (VENDOR_GAISLER, GAISLER_GPTIMER, &dev)) == 1) | ||||
|     { | ||||
|       rtc = dev.start + 0x10; | ||||
|       DPRINTF (("Found rtc at 0x%x\n", rtc)); | ||||
|     } | ||||
|   if ((n = find_apbslv (VENDOR_GAISLER, GAISLER_IRQMP, &dev)) == 1) | ||||
|     { | ||||
|       irqmp = dev.start; | ||||
|       DPRINTF (("Found irqmp at 0x%x\n", rtc)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										679
									
								
								libgloss/sparc_leon/pnpinit_malloc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										679
									
								
								libgloss/sparc_leon/pnpinit_malloc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,679 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/amba.h> | ||||
| #undef AMBA_TYPE_AHBIO_ADDR | ||||
| #include <asm-leon/lambapp.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #define AMBA_CONF_AREA 0xff000 | ||||
| #define AMBA_AHB_SLAVE_CONF_AREA (1 << 11) | ||||
| #define AMBA_APB_SLAVES 16 | ||||
|  | ||||
| #define DPRINTF(p)  printf p | ||||
|  | ||||
| /* Allocate */ | ||||
| struct ambapp_dev_hdr * | ||||
| ambapp_alloc_dev_struct (int dev_type) | ||||
| { | ||||
|   int size = sizeof (struct ambapp_dev_hdr); | ||||
|   struct ambapp_dev_hdr *dev; | ||||
|  | ||||
|   if (dev_type == DEV_APB_SLV) | ||||
|     { | ||||
|       size += sizeof (struct ambapp_apb_info); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       /* AHB */ | ||||
|       size += sizeof (struct ambapp_ahb_info); | ||||
|     } | ||||
|   dev = malloc (size); | ||||
|   if (dev == NULL) | ||||
|     return NULL; | ||||
|   memset (dev, 0, size); | ||||
|   dev->devinfo = (void *) (dev + 1); | ||||
|   dev->dev_type = dev_type; | ||||
|   return dev; | ||||
| } | ||||
|  | ||||
| unsigned int | ||||
| ambapp_addr_from (struct ambapp_mmap *mmaps, unsigned int address) | ||||
| { | ||||
|   /* no translation? */ | ||||
|   if (!mmaps) | ||||
|     return address; | ||||
|  | ||||
|   while (mmaps->size) | ||||
|     { | ||||
|       if ((address >= mmaps->remote_adr) | ||||
| 	  && (address <= (mmaps->remote_adr + (mmaps->size - 1)))) | ||||
| 	{ | ||||
| 	  return (address - mmaps->remote_adr) + mmaps->local_adr; | ||||
| 	} | ||||
|       mmaps++; | ||||
|     } | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| void | ||||
| ambapp_ahb_dev_init (unsigned int ioarea, | ||||
| 		     struct ambapp_mmap *mmaps, | ||||
| 		     struct ambapp_pnp_ahb *ahb, struct ambapp_dev_hdr *dev) | ||||
| { | ||||
|   int bar; | ||||
|   struct ambapp_ahb_info *ahb_info; | ||||
|   unsigned int addr, mask, mbar; | ||||
|  | ||||
|   /* Setup device struct */ | ||||
|   dev->vendor = ambapp_pnp_vendor (ahb->id); | ||||
|   dev->device = ambapp_pnp_device (ahb->id); | ||||
|   ahb_info = dev->devinfo; | ||||
|   ahb_info->ver = ambapp_pnp_ver (ahb->id); | ||||
|   ahb_info->irq = ambapp_pnp_irq (ahb->id); | ||||
|   ahb_info->custom[0] = (unsigned int) ahb->custom[0]; | ||||
|   ahb_info->custom[1] = (unsigned int) ahb->custom[1]; | ||||
|   ahb_info->custom[2] = (unsigned int) ahb->custom[2]; | ||||
|  | ||||
|   DPRINTF (("+AHB device %d:%d\n", dev->device, dev->vendor)); | ||||
|  | ||||
|   /* Memory BARs */ | ||||
|   for (bar = 0; bar < 4; bar++) | ||||
|     { | ||||
|       mbar = ahb->mbar[bar]; | ||||
|       if (mbar == 0) | ||||
| 	{ | ||||
| 	  addr = 0; | ||||
| 	  mask = 0; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  addr = ambapp_pnp_start (mbar); | ||||
| 	  if (ambapp_pnp_mbar_type (mbar) == AMBA_TYPE_AHBIO) | ||||
| 	    { | ||||
| 	      /* AHB I/O area is releative IO_AREA */ | ||||
| 	      addr = AMBA_TYPE_AHBIO_ADDR (addr, ioarea); | ||||
| 	      mask = | ||||
| 		(((unsigned int) (ambapp_pnp_mbar_mask ((~mbar)) << 8) | | ||||
| 		  0xff)) + 1; | ||||
| 	    } | ||||
| 	  else | ||||
| 	    { | ||||
| 	      /* AHB memory area, absolute address */ | ||||
| 	      addr = ambapp_addr_from (mmaps, addr); | ||||
| 	      mask = | ||||
| 		(~((unsigned int) (ambapp_pnp_mbar_mask (mbar) << 20))) + 1; | ||||
| 	    } | ||||
| 	} | ||||
|       ahb_info->start[bar] = addr; | ||||
|       ahb_info->mask[bar] = mask; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| ambapp_apb_dev_init (unsigned int base, | ||||
| 		     struct ambapp_mmap *mmaps, | ||||
| 		     struct ambapp_pnp_apb *apb, struct ambapp_dev_hdr *dev) | ||||
| { | ||||
|   struct ambapp_apb_info *apb_info; | ||||
|  | ||||
|   /* Setup device struct */ | ||||
|   dev->vendor = ambapp_pnp_vendor (apb->id); | ||||
|   dev->device = ambapp_pnp_device (apb->id); | ||||
|   apb_info = dev->devinfo; | ||||
|   apb_info->ver = ambapp_pnp_ver (apb->id); | ||||
|   apb_info->irq = ambapp_pnp_irq (apb->id); | ||||
|   apb_info->start = ambapp_pnp_apb_start (apb->iobar, base); | ||||
|   apb_info->mask = ambapp_pnp_apb_mask (apb->iobar); | ||||
|  | ||||
|   DPRINTF (("+APB device %d:%d\n", dev->device, dev->vendor)); | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| #define MAX_NUM_BUSES 16 | ||||
| void | ||||
| ambapp_add_scanned_bus (unsigned int *ioareas, unsigned int ioarea) | ||||
| { | ||||
|   int i; | ||||
|   for (i = 0; i < MAX_NUM_BUSES; i++) | ||||
|     { | ||||
|       if (ioareas[i] == 0) | ||||
| 	{ | ||||
| 	  ioareas[i] = ioarea; | ||||
| 	  return; | ||||
| 	} | ||||
|     } | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_has_been_scanned (unsigned int *ioareas, unsigned int ioarea) | ||||
| { | ||||
|   int i; | ||||
|   if (!ioareas) | ||||
|     return 0; | ||||
|  | ||||
|   for (i = 0; i < MAX_NUM_BUSES; i++) | ||||
|     { | ||||
|       if (ioareas[i] == 0) | ||||
| 	{ | ||||
| 	  break; | ||||
| 	} | ||||
|       else if (ioareas[i] == ioarea) | ||||
| 	{ | ||||
| 	  return 1; | ||||
| 	} | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_scan (unsigned int ioarea, | ||||
| 	     struct ambapp_dev_hdr *parent, | ||||
| 	     struct ambapp_mmap *mmaps, | ||||
| 	     void *(*memfunc) (void *dest, const void *src, int n), | ||||
| 	     struct ambapp_dev_hdr **root, void *internal) | ||||
| { | ||||
|   struct ambapp_pnp_ahb *ahb, ahb_buf; | ||||
|   struct ambapp_pnp_apb *apb, apb_buf; | ||||
|   struct ambapp_dev_hdr *dev, *prev, *prevapb, *apbdev; | ||||
|   struct ambapp_ahb_info *ahb_info; | ||||
|   int maxloops = 64; | ||||
|   unsigned int apbbase, bridge_address; | ||||
|   int i, j; | ||||
|  | ||||
|   DPRINTF (("Scan at 0x%08x\n", ioarea)); | ||||
|  | ||||
|   /* Default to memcpy() */ | ||||
|   if (!memfunc) | ||||
|     memfunc = (void *(*)(void *dest, const void *src, int n)) memcpy; | ||||
|  | ||||
|   *root = NULL; | ||||
|  | ||||
|   if (parent) | ||||
|     { | ||||
|       /* scan first bus for 64 devices, rest for 16 devices */ | ||||
|       maxloops = 16; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       DPRINTF (("+(malloc:")); | ||||
|       internal = malloc (sizeof (unsigned int) * MAX_NUM_BUSES); | ||||
|       DPRINTF (("0x%x)\n", internal)); | ||||
|  | ||||
|       if (!internal) | ||||
| 	return -1; | ||||
|       memset (internal, 0, sizeof (unsigned int) * MAX_NUM_BUSES); | ||||
|  | ||||
|       ambapp_add_scanned_bus (internal, ioarea); | ||||
|     } | ||||
|  | ||||
|   prev = parent; | ||||
|  | ||||
|   /* AHB MASTERS */ | ||||
|   ahb = (struct ambapp_pnp_ahb *) (ioarea | AMBA_CONF_AREA); | ||||
|   for (i = 0; i < maxloops; i++) | ||||
|     { | ||||
|       memfunc (&ahb_buf, ahb, sizeof (struct ambapp_pnp_ahb)); | ||||
|       if (ahb_buf.id != 0) | ||||
| 	{ | ||||
| 	  /* A AHB device present here */ | ||||
| 	  dev = ambapp_alloc_dev_struct (DEV_AHB_MST); | ||||
| 	  if (!dev) | ||||
| 	    return -1; | ||||
|  | ||||
| 	  ambapp_ahb_dev_init (ioarea, mmaps, &ahb_buf, dev); | ||||
|  | ||||
| 	  if (*root == NULL) | ||||
| 	    *root = dev; | ||||
|  | ||||
| 	  if (prev != parent) | ||||
| 	    prev->next = dev; | ||||
| 	  dev->prev = prev; | ||||
| 	  prev = dev; | ||||
| 	} | ||||
|       ahb++; | ||||
|     } | ||||
|  | ||||
|   /* AHB SLAVES */ | ||||
|   ahb = | ||||
|     (struct ambapp_pnp_ahb *) (ioarea | AMBA_CONF_AREA | | ||||
| 			       AMBA_AHB_SLAVE_CONF_AREA); | ||||
|   for (i = 0; i < maxloops; i++) | ||||
|     { | ||||
|       memfunc (&ahb_buf, ahb, sizeof (struct ambapp_pnp_ahb)); | ||||
|       if (ahb_buf.id != 0) | ||||
| 	{ | ||||
| 	  /* A AHB device present here */ | ||||
| 	  dev = ambapp_alloc_dev_struct (DEV_AHB_SLV); | ||||
| 	  if (!dev) | ||||
| 	    return -1; | ||||
|  | ||||
| 	  ambapp_ahb_dev_init (ioarea, mmaps, &ahb_buf, dev); | ||||
|  | ||||
| 	  if (prev != parent) | ||||
| 	    prev->next = dev; | ||||
| 	  dev->prev = prev; | ||||
| 	  prev = dev; | ||||
|  | ||||
| 	  /* Is it a AHB/AHB Bridge ? */ | ||||
| 	  if ((dev->device == GAISLER_AHB2AHB) | ||||
| 	      && (dev->vendor == VENDOR_GAISLER)) | ||||
| 	    { | ||||
| 	      /* AHB/AHB Bridge Found, recurse down the Bridge */ | ||||
| 	      ahb_info = dev->devinfo; | ||||
| 	      if (ahb_info->ver) | ||||
| 		{ | ||||
| 		  bridge_address = | ||||
| 		    ambapp_addr_from (mmaps, ahb_info->custom[1]); | ||||
|  | ||||
| 		  DPRINTF (("+(AHBAHB:0x%x)\n", bridge_address)); | ||||
|  | ||||
| 		  /* Makes sure bus only scanned once */ | ||||
| 		  if (ambapp_has_been_scanned (internal, bridge_address) == | ||||
| 		      NULL) | ||||
| 		    { | ||||
| 		      ambapp_add_scanned_bus (internal, bridge_address); | ||||
| 		      if (ambapp_scan | ||||
| 			  (bridge_address, dev, mmaps, memfunc, | ||||
| 			   &dev->children, internal)) | ||||
| 			return -1; | ||||
| 		    } | ||||
| 		} | ||||
| 	    } | ||||
| 	  else if ((dev->device == GAISLER_APBMST) | ||||
| 		   && (dev->vendor == VENDOR_GAISLER)) | ||||
| 	    { | ||||
| 	      /* AHB/APB Bridge Found, add the APB devices to this AHB Slave's children */ | ||||
| 	      prevapb = dev; | ||||
| 	      ahb_info = dev->devinfo; | ||||
| 	      apbbase = ahb_info->start[0]; | ||||
| 	      apb = (struct ambapp_pnp_apb *) (apbbase | AMBA_CONF_AREA); | ||||
| 	      for (j = 0; j < AMBA_APB_SLAVES; j++) | ||||
| 		{ | ||||
| 		  memfunc (&apb_buf, apb, sizeof (struct ambapp_pnp_apb)); | ||||
| 		  if (apb_buf.id) | ||||
| 		    { | ||||
| 		      apbdev = ambapp_alloc_dev_struct (DEV_APB_SLV); | ||||
| 		      if (!dev) | ||||
| 			return -1; | ||||
|  | ||||
| 		      ambapp_apb_dev_init (apbbase, mmaps, &apb_buf, apbdev); | ||||
|  | ||||
| 		      if (prevapb != dev) | ||||
| 			prevapb->next = apbdev; | ||||
| 		      else | ||||
| 			dev->children = apbdev; | ||||
| 		      apbdev->prev = prevapb; | ||||
| 		      prevapb = apbdev; | ||||
| 		    } | ||||
| 		  apb++; | ||||
| 		} | ||||
| 	    } | ||||
| 	} | ||||
|       ahb++; | ||||
|     } | ||||
|  | ||||
|   if (parent == NULL) | ||||
|     { | ||||
|       free (internal); | ||||
|     } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| /* Match search options againt device */ | ||||
| int | ||||
| ambapp_dev_match_options (struct ambapp_dev_hdr *dev, unsigned int options, | ||||
| 			  int vendor, int device) | ||||
| { | ||||
|   if ((((options & (OPTIONS_ALL_DEVS)) == OPTIONS_ALL_DEVS) ||	/* Match TYPE */ | ||||
|        ((options & OPTIONS_AHB_MSTS) && (dev->dev_type == DEV_AHB_MST)) || ((options & OPTIONS_AHB_SLVS) && (dev->dev_type == DEV_AHB_SLV)) || ((options & OPTIONS_APB_SLVS) && (dev->dev_type == DEV_APB_SLV))) && ((vendor == -1) || (vendor == dev->vendor)) &&	/* Match ID */ | ||||
|       ((device == -1) || (device == dev->device)) && (((options & OPTIONS_ALL) == OPTIONS_ALL) ||	/* Match Allocated State */ | ||||
| 						      ((options & | ||||
| 							OPTIONS_FREE) | ||||
| 						       && DEV_IS_FREE (dev)) | ||||
| 						      || | ||||
| 						      ((options & | ||||
| 							OPTIONS_ALLOCATED) | ||||
| 						       && | ||||
| 						       DEV_IS_ALLOCATED | ||||
| 						       (dev)))) | ||||
|     { | ||||
|       return 1; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| /* If device is an APB bridge all devices on the APB bridge is processed */ | ||||
| static int | ||||
| ambapp_for_each_apb (struct ambapp_dev_hdr *dev, | ||||
| 		     unsigned int options, | ||||
| 		     int vendor, | ||||
| 		     int device, int maxdepth, ambapp_func_t func, void *arg) | ||||
| { | ||||
|   int index; | ||||
|   struct ambapp_dev_hdr *apbslv; | ||||
|  | ||||
|   if (maxdepth < 0) | ||||
|     return 0; | ||||
|  | ||||
|   if (dev->children && (dev->children->dev_type == DEV_APB_SLV)) | ||||
|     { | ||||
|       /* Found a APB Bridge */ | ||||
|       index = 0; | ||||
|       apbslv = dev->children; | ||||
|       while (apbslv) | ||||
| 	{ | ||||
| 	  if (ambapp_dev_match_options (apbslv, options, vendor, device) == 1) | ||||
| 	    { | ||||
| 	      if (func (apbslv, index, maxdepth, arg) == 1) | ||||
| 		return 1;	/* Signalled stopped */ | ||||
| 	    } | ||||
| 	  index++; | ||||
| 	  apbslv = apbslv->next; | ||||
| 	} | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| /* Traverse the prescanned device information */ | ||||
| int | ||||
| ambapp_for_each (struct ambapp_dev_hdr *root, | ||||
| 		 unsigned int options, | ||||
| 		 int vendor, | ||||
| 		 int device, int maxdepth, ambapp_func_t func, void *arg) | ||||
| { | ||||
|   struct ambapp_dev_hdr *dev; | ||||
|   int ahb_slave = 0; | ||||
|   int index; | ||||
|  | ||||
|   if (maxdepth < 0) | ||||
|     return 0; | ||||
|  | ||||
|   /* Start at device 'root' and process downwards. | ||||
|    * | ||||
|    * Breadth first search, search order | ||||
|    * 1. AHB MSTS | ||||
|    * 2. AHB SLVS | ||||
|    * 3. APB SLVS on primary bus | ||||
|    * 4. AHB/AHB secondary... -> step to 1. | ||||
|    */ | ||||
|  | ||||
|   /* AHB MST / AHB SLV */ | ||||
|   if (options & (OPTIONS_AHB_MSTS | OPTIONS_AHB_SLVS | OPTIONS_DEPTH_FIRST)) | ||||
|     { | ||||
|       index = 0; | ||||
|       dev = root; | ||||
|       while (dev) | ||||
| 	{ | ||||
| 	  if ((dev->dev_type == DEV_AHB_SLV) && !ahb_slave) | ||||
| 	    { | ||||
| 	      /* First AHB Slave */ | ||||
| 	      ahb_slave = 1; | ||||
| 	      index = 0; | ||||
| 	    } | ||||
|  | ||||
| 	  /* Conditions must be fullfilled for function to be called */ | ||||
| 	  if (ambapp_dev_match_options (dev, options, vendor, device) == 1) | ||||
| 	    { | ||||
| 	      /* Correct device and vendor ID */ | ||||
| 	      if (func (dev, index, maxdepth, arg) == 1) | ||||
| 		return 1;	/* Signalled stopped */ | ||||
| 	    } | ||||
|  | ||||
| 	  if ((options & OPTIONS_DEPTH_FIRST) && (options & OPTIONS_APB_SLVS)) | ||||
| 	    { | ||||
| 	      /* Check is APB bridge, and process all APB Slaves in that case */ | ||||
| 	      if (ambapp_for_each_apb | ||||
| 		  (dev, options, vendor, device, (maxdepth - 1), func, | ||||
| 		   arg) == 1) | ||||
| 		return 1;	/* Signalled stopped */ | ||||
| 	    } | ||||
|  | ||||
| 	  if (options & OPTIONS_DEPTH_FIRST) | ||||
| 	    { | ||||
| 	      if (dev->children && (dev->children->dev_type != DEV_APB_SLV)) | ||||
| 		{ | ||||
| 		  /* Found AHB Bridge, recurse */ | ||||
| 		  if (ambapp_for_each | ||||
| 		      (dev->children, options, vendor, device, (maxdepth - 1), | ||||
| 		       func, arg) == 1) | ||||
| 		    return 1; | ||||
| 		} | ||||
| 	    } | ||||
|  | ||||
| 	  index++; | ||||
| 	  dev = dev->next; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   /* Find APB Bridges */ | ||||
|   if ((options & OPTIONS_APB_SLVS) && !(options & OPTIONS_DEPTH_FIRST)) | ||||
|     { | ||||
|       dev = root; | ||||
|       while (dev) | ||||
| 	{ | ||||
| 	  /* Check is APB bridge, and process all APB Slaves in that case */ | ||||
| 	  if (ambapp_for_each_apb | ||||
| 	      (dev, options, vendor, device, (maxdepth - 1), func, arg) == 1) | ||||
| 	    return 1;		/* Signalled stopped */ | ||||
| 	  dev = dev->next; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   /* Find AHB Bridges */ | ||||
|   if (!(options & OPTIONS_DEPTH_FIRST)) | ||||
|     { | ||||
|       dev = root; | ||||
|       while (dev) | ||||
| 	{ | ||||
| 	  if (dev->children && (dev->children->dev_type != DEV_APB_SLV)) | ||||
| 	    { | ||||
| 	      /* Found AHB Bridge, recurse */ | ||||
| 	      if (ambapp_for_each | ||||
| 		  (dev->children, options, vendor, device, (maxdepth - 1), | ||||
| 		   func, arg) == 1) | ||||
| 		return 1; | ||||
| 	    } | ||||
| 	  dev = dev->next; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_alloc_dev (struct ambapp_dev_hdr *dev, void *owner) | ||||
| { | ||||
|   if (dev->owner) | ||||
|     return -1; | ||||
|   dev->owner = owner; | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| ambapp_free_dev (struct ambapp_dev_hdr *dev) | ||||
| { | ||||
|   dev->owner = NULL; | ||||
| } | ||||
|  | ||||
| struct ambapp_dev_find_match_arg | ||||
| { | ||||
|   int index; | ||||
|   int count; | ||||
|   int type; | ||||
|   void *dev; | ||||
| }; | ||||
|  | ||||
| /* AMBA PP find routines */ | ||||
| int | ||||
| ambapp_dev_find_match (struct ambapp_dev_hdr *dev, int index, int maxdepth, | ||||
| 		       void *arg) | ||||
| { | ||||
|   struct ambapp_dev_find_match_arg *p = arg; | ||||
|  | ||||
|   if (p->index == 0) | ||||
|     { | ||||
|       /* Found controller, stop */ | ||||
|       if (p->type == DEV_APB_SLV) | ||||
| 	{ | ||||
| 	  *(struct ambapp_apb_info *) p->dev = | ||||
| 	    *(struct ambapp_apb_info *) dev->devinfo; | ||||
| 	  p->dev = ((struct ambapp_apb_info *) p->dev) + 1; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  *(struct ambapp_ahb_info *) p->dev = | ||||
| 	    *(struct ambapp_ahb_info *) dev->devinfo; | ||||
| 	  p->dev = ((struct ambapp_ahb_info *) p->dev) + 1; | ||||
| 	} | ||||
|       p->count--; | ||||
|       if (p->count < 1) | ||||
| 	return 1; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       p->index--; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_apbslvs_next (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 			  struct ambapp_apb_info *dev, int index, int maxno) | ||||
| { | ||||
|   struct ambapp_dev_find_match_arg arg; | ||||
|  | ||||
|   arg.index = index; | ||||
|   arg.count = maxno; | ||||
|   arg.type = DEV_APB_SLV;	/* APB */ | ||||
|   arg.dev = dev; | ||||
|  | ||||
|   ambapp_for_each (root, (OPTIONS_ALL | OPTIONS_APB_SLVS), vendor, device, 10, | ||||
| 		   ambapp_dev_find_match, &arg); | ||||
|  | ||||
|   return maxno - arg.count; | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_apbslv (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 		    struct ambapp_apb_info *dev) | ||||
| { | ||||
|   return ambapp_find_apbslvs_next (root, vendor, device, dev, 0, 1); | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_apbslv_next (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 			 struct ambapp_apb_info *dev, int index) | ||||
| { | ||||
|   return ambapp_find_apbslvs_next (root, vendor, device, dev, index, 1); | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_apbslvs (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 		     struct ambapp_apb_info *dev, int maxno) | ||||
| { | ||||
|   return ambapp_find_apbslvs_next (root, vendor, device, dev, 0, maxno); | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_ahbslvs_next (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 			  struct ambapp_ahb_info *dev, int index, int maxno) | ||||
| { | ||||
|   struct ambapp_dev_find_match_arg arg; | ||||
|  | ||||
|   arg.index = index; | ||||
|   arg.count = maxno; | ||||
|   arg.type = DEV_AHB_SLV;	/* AHB SLV */ | ||||
|   arg.dev = dev; | ||||
|  | ||||
|   ambapp_for_each (root, (OPTIONS_ALL | OPTIONS_AHB_SLVS), vendor, device, 10, | ||||
| 		   ambapp_dev_find_match, &arg); | ||||
|  | ||||
|   return maxno - arg.count; | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_ahbslv_next (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 			 struct ambapp_ahb_info *dev, int index) | ||||
| { | ||||
|   return ambapp_find_ahbslvs_next (root, vendor, device, dev, index, 1); | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_ahbslv (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 		    struct ambapp_ahb_info *dev) | ||||
| { | ||||
|   return ambapp_find_ahbslvs_next (root, vendor, device, dev, 0, 1); | ||||
| } | ||||
|  | ||||
| int | ||||
| ambapp_find_ahbslvs (struct ambapp_dev_hdr *root, int vendor, int device, | ||||
| 		     struct ambapp_ahb_info *dev, int maxno) | ||||
| { | ||||
|   return ambapp_find_ahbslvs_next (root, vendor, device, dev, 0, maxno); | ||||
| } | ||||
|  | ||||
| struct ambapp_dev_hdr * | ||||
| ambapp_find_parent (struct ambapp_dev_hdr *dev) | ||||
| { | ||||
|   while (dev->prev) | ||||
|     { | ||||
|       if (dev == dev->prev->children) | ||||
| 	{ | ||||
| 	  return dev->prev; | ||||
| 	} | ||||
|       dev = dev->prev; | ||||
|     } | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| struct ambapp_dev_hdr *ambapp_root = NULL; | ||||
| extern unsigned int console; | ||||
| extern unsigned int rtc; | ||||
|  | ||||
| void | ||||
| pnpinit (void) | ||||
| { | ||||
|   struct ambapp_apb_info dev; | ||||
|   int n; | ||||
|   ambapp_scan (LEON3_IO_AREA, NULL, NULL, NULL, &ambapp_root, NULL); | ||||
|   if ((n = | ||||
|        ambapp_find_apbslv (ambapp_root, VENDOR_GAISLER, GAISLER_APBUART, | ||||
| 			   &dev)) == 1) | ||||
|     { | ||||
|       console = dev.start; | ||||
|       DPRINTF (("Found abuart at 0x%x\n", console)); | ||||
|     } | ||||
|   if ((n = | ||||
|        ambapp_find_apbslv (ambapp_root, VENDOR_GAISLER, GAISLER_GPTIMER, | ||||
| 			   &dev)) == 1) | ||||
|     { | ||||
|       rtc = dev.start + 0x10; | ||||
|       DPRINTF (("Found rtc at 0x%x\n", rtc)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										34
									
								
								libgloss/sparc_leon/pnpinit_simple.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								libgloss/sparc_leon/pnpinit_simple.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/amba.h> | ||||
| #undef AMBA_TYPE_AHBIO_ADDR | ||||
| #include <asm-leon/lambapp.h> | ||||
| #include <string.h> | ||||
|  | ||||
| void | ||||
| pnpinit (void) | ||||
| { | ||||
| } | ||||
							
								
								
									
										134
									
								
								libgloss/sparc_leon/regwin.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								libgloss/sparc_leon/regwin.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,134 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
|          | ||||
|   .seg    "text" | ||||
|  | ||||
| 	 | ||||
| /* Number of register windows */ | ||||
| 	.global _nwindows_min1, _nwindows | ||||
| 	 | ||||
|         ! Window overflow trap handler on save. | ||||
|         ! Touches %g1 | ||||
| 	/* ------- */ | ||||
| 	.weak	_window_overflow | ||||
| 	.set	_window_overflow,__window_overflow | ||||
| 	.weak	_window_overflow_svt | ||||
| 	.set	_window_overflow_svt,__window_overflow_svt | ||||
| 	/* ------- */ | ||||
|   	!.global _window_overflow,_window_overflow_svt | ||||
|   	.global __window_overflow_rettseq,__window_overflow_rettseq_ret,__window_overflow_slow1 | ||||
|  | ||||
| __window_overflow_svt:		 | ||||
| __window_overflow: | ||||
| #ifndef _FLAT | ||||
| __window_overflow_rettseq:		 | ||||
|   	mov  %wim, %l3       		! Calculate next WIM | ||||
|   	mov  %g1, %l7            | ||||
|   	srl  %l3, 1, %g1         | ||||
| __window_overflow_rettseq_ret:		 | ||||
| 	sethi %hi(_nwindows_min1), %l4	! NWINDOWS-1 | ||||
| 	ld [%l4+%lo(_nwindows_min1)], %l4 | ||||
| 	 | ||||
| 	sll  %l3, %l4 , %l4 | ||||
|   	or   %l4, %g1, %g1 | ||||
|  | ||||
|   	save                              ! Get into window to be saved. | ||||
|   	mov  %g1, %wim | ||||
|   	nop; nop; nop | ||||
|         std   %l0, [%sp + 0]; | ||||
|         std   %l2, [%sp + 8]; | ||||
|         std   %l4, [%sp + 16];  | ||||
|         std   %l6, [%sp + 24];  | ||||
|         std   %i0, [%sp + 32];  | ||||
|         std   %i2, [%sp + 40];  | ||||
|         std   %i4, [%sp + 48];  | ||||
|         std   %i6, [%sp + 56];  | ||||
|   	restore				! Go back to trap window. | ||||
|   	mov  %l7, %g1 | ||||
| 	 | ||||
|   	jmp  %l1			! Re-execute save. | ||||
|   	rett %l2 | ||||
| 	nop | ||||
| 	 | ||||
| __window_overflow_slow1:		! space for possible stackcheck patch | ||||
| 	nop | ||||
| 	nop | ||||
| #else	 | ||||
| 	ta	0			! halt  | ||||
| __window_overflow_rettseq:		 | ||||
| __window_overflow_rettseq_ret:		 | ||||
| __window_overflow_slow1:		 | ||||
| 	nop | ||||
| 	nop | ||||
| 	nop | ||||
| #endif | ||||
| 	 | ||||
|   /* Window underflow trap handler on restore.  */ | ||||
|  | ||||
|         ! Touches %g1 | ||||
| 	/* ------- */ | ||||
|   	.weak	_window_underflow | ||||
| 	.set	_window_underflow,__window_underflow | ||||
| 	.weak	_window_underflow_svt | ||||
| 	.set	_window_underflow_svt,__window_underflow_svt | ||||
| 	/* ------- */ | ||||
|   	!.global  _window_underflow,_window_underflow_svt | ||||
|  | ||||
| __window_underflow_svt: | ||||
| __window_underflow: | ||||
| #ifndef _FLAT | ||||
| 	mov  %wim, %l3			! Calculate next WIM | ||||
| 	sll  %l3, 1, %l4 | ||||
|  | ||||
| 	sethi %hi(_nwindows_min1), %l5	! NWINDOWS-1 | ||||
| 	ld [%l5+%lo(_nwindows_min1)], %l5 | ||||
| 	 | ||||
| 	srl  %l3, %l5, %l5 | ||||
|   	or   %l5, %l4, %l5 | ||||
|   	mov  %l5, %wim | ||||
|   	nop; nop; nop | ||||
|   	restore				! Two restores to get into the | ||||
|   	restore				! window to restore | ||||
|         ldd   [%sp + 0], %l0; 		! Restore window from the stack | ||||
|         ldd   [%sp + 8], %l2;  | ||||
|         ldd   [%sp + 16], %l4;  | ||||
|         ldd   [%sp + 24], %l6;  | ||||
|         ldd   [%sp + 32], %i0;  | ||||
|         ldd   [%sp + 40], %i2;  | ||||
|         ldd   [%sp + 48], %i4;  | ||||
|         ldd   [%sp + 56], %i6;  | ||||
|   	save				! Get back to the trap window. | ||||
|   	save | ||||
|   	jmp  %l1			! Re-execute restore. | ||||
|   	rett  %l2 | ||||
| #else	 | ||||
| 	ta	0			! halt  | ||||
| #endif | ||||
|  | ||||
| 	 | ||||
							
								
								
									
										82
									
								
								libgloss/sparc_leon/regwin_patch.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								libgloss/sparc_leon/regwin_patch.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
|  | ||||
| extern volatile unsigned int __window_overflow_rettseq[3]; | ||||
| extern volatile unsigned int __window_overflow_slow1[2]; | ||||
|  | ||||
| static unsigned int installed = 0; | ||||
| static unsigned int save__window_overflow_rettseq[3]; | ||||
|  | ||||
| int | ||||
| install_winoverflow_hook (void (*func) (void)) | ||||
| { | ||||
|   if (installed) | ||||
|     { | ||||
|       return 0; | ||||
|     } | ||||
|   if (!installed) | ||||
|     { | ||||
|       /* | ||||
|          a7 50 00 00  rd  %wim, %l3 | ||||
|          ae 10 00 01  mov  %g1, %l7 | ||||
|          83 34 e0 01  srl  %l3, 1, %g1 | ||||
|  | ||||
|          81 c4 40 00  jmp  %l1 | ||||
|          81 cc 80 00  rett  %l2 */ | ||||
|       save__window_overflow_rettseq[0] = __window_overflow_rettseq[0]; | ||||
|       save__window_overflow_rettseq[1] = __window_overflow_rettseq[1]; | ||||
|       save__window_overflow_rettseq[2] = __window_overflow_rettseq[2]; | ||||
|  | ||||
|       /*29 10 00 31   sethi  %hi(0x4000c400), %l4 | ||||
|          81 c5 22 48  jmp  %l4 + 0x248 | ||||
|          01 00 00 00  nop  */ | ||||
|  | ||||
|       __window_overflow_rettseq[0] = ((((unsigned int) func) >> 10) & 0x3fffff) | 0x29000000;	/* upper 22 */ | ||||
|       __window_overflow_rettseq[1] = ((((unsigned int) func)) & 0x03ff) | 0x81c52000;	/* lower 10 */ | ||||
|       __window_overflow_rettseq[2] = 0x01000000;	/* nop */ | ||||
|  | ||||
|       sparc_leon23_icache_flush (); | ||||
|       installed = 1; | ||||
|     } | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void | ||||
| uninstall_winoverflow_hook () | ||||
| { | ||||
|   if (installed) | ||||
|     { | ||||
|       __window_overflow_rettseq[0] = save__window_overflow_rettseq[0]; | ||||
|       __window_overflow_rettseq[1] = save__window_overflow_rettseq[1]; | ||||
|       __window_overflow_rettseq[2] = save__window_overflow_rettseq[2]; | ||||
|  | ||||
|       sparc_leon23_icache_flush (); | ||||
|       installed = 0; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										135
									
								
								libgloss/sparc_leon/regwin_slow.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								libgloss/sparc_leon/regwin_slow.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
|          | ||||
|   .seg    "text" | ||||
|  | ||||
| 	 | ||||
| /* Number of register windows */ | ||||
| 	.global _nwindows_min1, _nwindows | ||||
| 	 | ||||
|         ! Window overflow trap handler on save. | ||||
|         ! Touches %g1 | ||||
| 	/* ------- */ | ||||
| 	.weak	_window_overflow | ||||
| 	.set	_window_overflow,__window_overflow | ||||
| 	.weak	_window_overflow_svt | ||||
| 	.set	_window_overflow_svt,__window_overflow_svt | ||||
| 	/* ------- */ | ||||
|   	!.global _window_overflow,_window_overflow_svt | ||||
|   	.global __window_overflow_rettseq,__window_overflow_rettseq_ret,__window_overflow_slow1 | ||||
|  | ||||
| __window_overflow_svt:		 | ||||
| __window_overflow: | ||||
| #ifndef _FLAT | ||||
| __window_overflow_rettseq:		 | ||||
|   	mov  %wim, %l3       		! Calculate next WIM | ||||
|   	mov  %g1, %l7            | ||||
|   	srl  %l3, 1, %g1         | ||||
| 	 | ||||
| __window_overflow_rettseq_ret:		 | ||||
| 	sethi %hi(_nwindows_min1), %l4	! NWINDOWS-1 | ||||
| 	ld [%l4+%lo(_nwindows_min1)], %l4 | ||||
| 	 | ||||
| 	sll  %l3, %l4 , %l4 | ||||
|   	or   %l4, %g1, %g1 | ||||
|  | ||||
|   	save                              ! Get into window to be saved. | ||||
|   	mov  %g1, %wim | ||||
|   	nop; nop; nop | ||||
|         std   %l0, [%sp + 0]; | ||||
|         std   %l2, [%sp + 8]; | ||||
|         std   %l4, [%sp + 16];  | ||||
|         std   %l6, [%sp + 24];  | ||||
|         std   %i0, [%sp + 32];  | ||||
|         std   %i2, [%sp + 40];  | ||||
|         std   %i4, [%sp + 48];  | ||||
|         std   %i6, [%sp + 56];  | ||||
|   	restore				! Go back to trap window. | ||||
|   	mov  %l7, %g1 | ||||
| 	 | ||||
|   	jmp  %l1			! Re-execute save. | ||||
|   	rett %l2 | ||||
| 	nop | ||||
| 	 | ||||
| __window_overflow_slow1:		! space for possible stackcheck patch | ||||
| 	nop | ||||
| 	nop | ||||
| #else	 | ||||
| 	ta	0			! halt  | ||||
| __window_overflow_rettseq:		 | ||||
| __window_overflow_rettseq_ret:		 | ||||
| __window_overflow_slow1:		 | ||||
| 	nop | ||||
| 	nop | ||||
| 	nop | ||||
| #endif | ||||
| 	 | ||||
|   /* Window underflow trap handler on restore.  */ | ||||
|  | ||||
|         ! Touches %g1 | ||||
| 	/* ------- */ | ||||
|   	.weak	_window_underflow | ||||
| 	.set	_window_underflow,__window_underflow | ||||
| 	.weak	_window_underflow_svt | ||||
| 	.set	_window_underflow_svt,__window_underflow_svt | ||||
| 	/* ------- */ | ||||
|   	!.global  _window_underflow,_window_underflow_svt | ||||
|  | ||||
| __window_underflow_svt: | ||||
| __window_underflow: | ||||
| #ifndef _FLAT | ||||
| 	mov  %wim, %l3			! Calculate next WIM | ||||
| 	sll  %l3, 1, %l4 | ||||
|  | ||||
| 	sethi %hi(_nwindows_min1), %l5	! NWINDOWS-1 | ||||
| 	ld [%l5+%lo(_nwindows_min1)], %l5 | ||||
| 	 | ||||
| 	srl  %l3, %l5, %l5 | ||||
|   	or   %l5, %l4, %l5 | ||||
|   	mov  %l5, %wim | ||||
|   	nop; nop; nop | ||||
|   	restore				! Two restores to get into the | ||||
|   	restore				! window to restore | ||||
|         ldd   [%sp + 0], %l0; 		! Restore window from the stack | ||||
|         ldd   [%sp + 8], %l2;  | ||||
|         ldd   [%sp + 16], %l4;  | ||||
|         ldd   [%sp + 24], %l6;  | ||||
|         ldd   [%sp + 32], %i0;  | ||||
|         ldd   [%sp + 40], %i2;  | ||||
|         ldd   [%sp + 48], %i4;  | ||||
|         ldd   [%sp + 56], %i6;  | ||||
|   	save				! Get back to the trap window. | ||||
|   	save | ||||
|   	jmp  %l1			! Re-execute restore. | ||||
|   	rett  %l2 | ||||
| #else	 | ||||
| 	ta	0			! halt  | ||||
| #endif | ||||
|  | ||||
| 	 | ||||
							
								
								
									
										285
									
								
								libgloss/sparc_leon/regwinflush.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										285
									
								
								libgloss/sparc_leon/regwinflush.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,285 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/asmmacro.h> | ||||
|          | ||||
|         .seg    "data" | ||||
|         .global _lb_spillglobals, _lb_issideflush | ||||
| 	.align  4 | ||||
| _lb_spillglobals: | ||||
| 	.word 0 | ||||
| 	.word 0 | ||||
| 	.word 0 | ||||
| 	.word 0 | ||||
| 	.word 0 | ||||
| 	.word 0 | ||||
| 	.word 0 | ||||
| _lb_issideflush: | ||||
| 	.word 0 /* off: 28 */ | ||||
| 	 | ||||
| 	.seg    "text" | ||||
|  | ||||
| /* =============================================== */ | ||||
| 	 | ||||
| #define _SV	save	%sp, -SF_REGS_SZ, %sp | ||||
| #define _RS     restore  | ||||
|  | ||||
| 	/* ------- */ | ||||
|   	.weak	_flush_windows | ||||
| 	.set	_flush_windows,__flush_windows | ||||
| 	.weak	_flush_windows_svt | ||||
| 	.set	_flush_windows_svt,__flush_windows_svt | ||||
| 	/* ------- */ | ||||
| 	!.global	_flush_windows,_flush_windows_svt | ||||
| __flush_windows_svt: | ||||
| 	rd %wim, %l3 | ||||
|  | ||||
| __flush_windows: | ||||
|         SAVE_ALL | ||||
| 	 | ||||
| #ifndef _FLAT | ||||
|  | ||||
| 	set	_lb_issideflush, %l3 | ||||
| 	st	%l0, [%l3] 	/* mark as inside flush */ | ||||
| 	 | ||||
| 	wr	%l0, SPARC_PSR_ET_MASK, %psr | ||||
| 	nop; nop; nop  | ||||
|  | ||||
| 	_SV; _SV; _SV; _SV; _SV; _SV; _SV;  | ||||
| 	_RS; _RS; _RS; _RS; _RS; _RS; _RS; | ||||
|  | ||||
| 	set	_lb_issideflush, %l3 | ||||
| 	st	%g0, [%l3] 	/* mark as outside flush */ | ||||
| 	 | ||||
| 	/* Advance over the trap instruction. */ | ||||
| 	ld	[%sp + SF_REGS_SZ + PT_NPC], %l1 | ||||
| 	add	%l1, 0x4, %l2 | ||||
| 	st	%l1, [%sp + SF_REGS_SZ + PT_PC] | ||||
| 	st	%l2, [%sp + SF_REGS_SZ + PT_NPC] | ||||
| #endif | ||||
| 	 | ||||
| 	RESTORE_ALL | ||||
|  | ||||
| /* =============================================== */ | ||||
|  | ||||
| _irqcall_flush_windows: | ||||
| #ifndef _FLAT | ||||
| 	set    _lb_spillglobals,%l4 | ||||
| 	st     %g1,[%l4+0] | ||||
| 	st     %g4,[%l4+4] | ||||
| 	st     %l0,[%l4+16] | ||||
| 	st     %l1,[%l4+20] | ||||
| 	st     %l2,[%l4+24] | ||||
| 	st     %l4,[%l4+28] /* mark as inside flush */ | ||||
| 	 | ||||
| 	restore  | ||||
|  | ||||
| 	mov     %psr, %g1 | ||||
| 	or	%g1, SPARC_PSR_PIL_MASK, %g1 | ||||
| 	wr	%g1, SPARC_PSR_ET_MASK, %psr         /* disable irq, enable traps */ | ||||
| 	nop | ||||
| 	nop | ||||
| 	nop | ||||
| 	 | ||||
| 	sethi %hi(_nwindows_min1), %g4               /* flush registers */ | ||||
| 	ld [%g4+%lo(_nwindows_min1)], %g4 | ||||
| 1:	save				             /* NWINDOWS-1 times */ | ||||
| 	sub    %g4,1,%g4 | ||||
|  | ||||
| 	/*****************/ | ||||
| 	andncc   %g4,0xff,%g0 | ||||
| 	be    .lab1 | ||||
| 	 nop | ||||
| 	nop | ||||
| 	 | ||||
| .lab1:	/*****************/ | ||||
| 	 | ||||
| 	cmp    %g4,%g0 | ||||
| 	bne    1b | ||||
| 	 nop | ||||
| 	 | ||||
| 	sethi %hi(_nwindows_min1), %g4 | ||||
| 	ld [%g4+%lo(_nwindows_min1)], %g4 | ||||
| 2:	restore		                             /* NWINDOWS-1 times */ | ||||
| 	  | ||||
| 	/*****************/ | ||||
| 	andncc   %g4,0xff,%g0 | ||||
| 	be    .lab2 | ||||
| 	 nop | ||||
| 	nop | ||||
| 	 | ||||
| .lab2:	/*****************/ | ||||
| 	 | ||||
| 	sub    %g4,1,%g4 | ||||
| 	cmp    %g4,%g0 | ||||
| 	bne    2b | ||||
| 	 nop | ||||
|  | ||||
| 	save | ||||
|  | ||||
| 	set    _lb_spillglobals,%l4 | ||||
| 	ld     [%l4+4], %g4 | ||||
| 	ld     [%l4+0], %g1 | ||||
| 	ld     [%l4+16],%l0 | ||||
| 	ld     [%l4+20],%l1 | ||||
| 	ld     [%l4+24],%l2 | ||||
| 	st     %g0,[%l4+28] /* clean inside flush mark */ | ||||
| 	 | ||||
| #endif | ||||
| 	 | ||||
| 	wr	%l0, 0, %psr                         /* restore psr */ | ||||
| 	nop | ||||
| 	nop | ||||
| 	nop  | ||||
| 	 | ||||
|         jmpl    %l2, %g0 | ||||
|         rett    %l2 + 4 | ||||
|  | ||||
| /* =============================================== */ | ||||
|  | ||||
| 	/* ------- */ | ||||
|   	.weak	_irqcall_disableirq | ||||
| 	.set	_irqcall_disableirq,__irqcall_disableirq | ||||
| 	.weak	_irqcall_disableirq_svt | ||||
| 	.set	_irqcall_disableirq_svt,__irqcall_disableirq_svt | ||||
| 	/* ------- */ | ||||
| 	 | ||||
| __irqcall_disableirq:	 | ||||
| __irqcall_disableirq_svt:	 | ||||
| 	or    	%l0, SPARC_PSR_PIL_MASK, %l0 | ||||
| 	mov   	%l0, %psr | ||||
| 	nop; nop; nop | ||||
|         jmpl    %l2, %g0 | ||||
|         rett    %l2 + 4 | ||||
|  | ||||
| /* =============================================== */ | ||||
| 	 | ||||
|         /* | ||||
|          *  system call (ta 0x2):        | ||||
|          *  2: irq_disable: | ||||
|          *      o1 = 2 | ||||
|          *  3: irq_enable: | ||||
|          *      o0 = old_flags | ||||
|          *      o1 = 3 | ||||
|          *  4: enter supervisor mode (from user mode): | ||||
|          *      o1 = 4 | ||||
|          *  5: enter user mode: | ||||
|          *      o1 = 5 | ||||
| 	 *  6: flush windows | ||||
|          * | ||||
|          *  On entry: | ||||
|          * | ||||
|          *    l0 = psr (from trap table) | ||||
|          *    l1 = pc | ||||
|          *    l2 = npc | ||||
|          *    i0 = system call id | ||||
|          */ | ||||
|  | ||||
| 	/* ------- */ | ||||
|   	.weak	_irqcall | ||||
| 	.set	_irqcall,__irqcall | ||||
| 	.weak	_irqcall_svt | ||||
| 	.set	_irqcall_svt,__irqcall_svt | ||||
| 	/* ------- */ | ||||
|         !.global _irqcall,_irqcall_svt | ||||
| __irqcall_svt:	 | ||||
| __irqcall: | ||||
|  | ||||
| 	subcc   %i1, 2, %g0		! syscall 2, disable interrupts | ||||
| 	bne 	3f | ||||
| 	or    	%l0, 0x0f00, %l4	! set PIL=15 | ||||
| 	mov   	%l4, %psr | ||||
|         or	%l0, SPARC_PSR_ET_MASK, %i0	! return old psr with ET=1 | ||||
| 	ba,a	9f | ||||
| 3: | ||||
| 	subcc   %i1, 3, %g0		! syscall 3, enable interrupts | ||||
| 	bne 	4f | ||||
| 	and	%i0, SPARC_PSR_PIL_MASK, %l4 | ||||
| 	andn	%l0, SPARC_PSR_PIL_MASK, %l5 | ||||
| 	or	%l5, %l4, %l4 | ||||
| 	mov   	%l4, %psr | ||||
|         ba,a	9f		 | ||||
| 4:	 | ||||
| 	subcc   %i1, 4, %g0		! syscall 4, enter supervisor | ||||
| 	bne 	5f | ||||
| 	 | ||||
| 	mov	%psr, %l4 | ||||
|         or      %l4,SPARC_PSR_PS_MASK,%l4 | ||||
| 	mov     %l4, %psr		! set previous supervisor %psr | ||||
| 	nop; nop; nop | ||||
|         ba,a	9f | ||||
|          | ||||
| 5:	 | ||||
| 	subcc   %i1, 5, %g0		! syscall 5, enter user | ||||
| 	bne 	6f | ||||
| 	 | ||||
| 	mov	%psr, %l4 | ||||
|         andn    %l4,SPARC_PSR_PS_MASK,%l4 | ||||
| 	mov     %l4, %psr		! clear previous supervisor %psr, return to user mode | ||||
| 	nop; nop; nop | ||||
| 	ba,a	9f | ||||
| 	 | ||||
| 6:	 | ||||
| 	subcc   %i1, 6, %g0		! syscall 6,  flush windows | ||||
| 	bne 	1f | ||||
| 	 nop | ||||
| 	 | ||||
| 	ba,a	_irqcall_flush_windows | ||||
| 	 | ||||
| 1:					 | ||||
| 	ta	0			! halt  | ||||
| 9:					! leave | ||||
|         jmpl    %l2, %g0 | ||||
|         rett    %l2 + 4 | ||||
|  | ||||
| /* =============================================== */ | ||||
| 	 | ||||
| 	/* call _irqcall through trap */ | ||||
| 	.global leonbare_enable_traps !void leonbare_enable_traps(unsigned long old_flags);  | ||||
| leonbare_enable_traps: | ||||
|         set 3,%o1 | ||||
|         retl | ||||
|         ta 0x2 | ||||
|          | ||||
| /* =============================================== */ | ||||
| 	 | ||||
| 	/* call _irqcall through trap */ | ||||
|         .global leonbare_disable_traps !unsigned long leonbare_disable_traps();  | ||||
| leonbare_disable_traps: | ||||
|         set 2,%o1 | ||||
|         retl | ||||
|         ta 0x2         | ||||
|  | ||||
| /* =============================================== */ | ||||
| 	 | ||||
| 	/* flush all windows */ | ||||
|         .global leonbare_flush_windows !void leonbare_flush_windows();  | ||||
| leonbare_flush_windows: | ||||
|         set 6,%o1 | ||||
|         retl | ||||
|          ta 0x2         | ||||
|  | ||||
							
								
								
									
										26
									
								
								libgloss/sparc_leon/rtc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								libgloss/sparc_leon/rtc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| int *rtc = (int *) 0x80000310; | ||||
							
								
								
									
										132
									
								
								libgloss/sparc_leon/rtrap.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								libgloss/sparc_leon/rtrap.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
|                          | ||||
| /* Registers to not touch at all. */ | ||||
| #define t_psr     l0 | ||||
| #define t_pc      l1 | ||||
| #define t_npc     l2 | ||||
| #define t_wim     l3 | ||||
| #define twin_tmp1 l4 | ||||
| #define glob_tmp  g4 | ||||
| #define curptr    g6 | ||||
|  | ||||
| 	/* Number of register windows */ | ||||
| 	.global _nwindows_min1, _nwindows | ||||
|  | ||||
|         .text | ||||
| 	.align 4 | ||||
| 	.globl	leonbare_trapreturn, schedule_callback | ||||
|  | ||||
| leonbare_trapreturn: | ||||
|  | ||||
|         /* a optional scheduler can be called here */ | ||||
|         set schedule_callback, %g2 | ||||
|         ld [%g2], %g2 | ||||
|         cmp %g2,%g0 | ||||
|         beq 3f | ||||
|          nop | ||||
|                   | ||||
|         jmpl %g2,%o7 | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	 add	%sp, FW_REGS_SZ + 8 + SF_REGS_SZ , %o1	! pt_regs ptr | ||||
| #else | ||||
| 	 add	%sp, SF_REGS_SZ , %o1		   ! pt_regs ptr | ||||
| #endif | ||||
| 	 | ||||
| 3: | ||||
| 	 | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	ld [%sp + (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ - 4)],%g2 | ||||
| 	sethi %hi(fpustate_current), %g3  | ||||
| 	st %g2, [%g3+%lo(fpustate_current)] | ||||
| #endif | ||||
| 		 | ||||
| 	wr	%t_psr, 0x0, %psr       ! enable nesting again, clear ET | ||||
| 	 | ||||
| #ifndef _FLAT | ||||
| 	/* Will the rett land us in the invalid window? */ | ||||
| 	mov	2, %g1 | ||||
| 	sll	%g1, %t_psr, %g1 | ||||
|  | ||||
| 	sethi %hi(_nwindows), %g2	!NWINDOWS | ||||
| 	ld [%g2+%lo(_nwindows)], %g2 | ||||
| 	 | ||||
|        	srl	%g1, %g2, %g2 | ||||
| 	or	%g1, %g2, %g1 | ||||
| 	rd	%wim, %g2 | ||||
| 	andcc	%g2, %g1, %g0 | ||||
| 	be	1f		! Nope, just return from the trap | ||||
| 	 sll	%g2, 0x1, %g1 | ||||
|  | ||||
|         	/* We have to grab a window before returning. */ | ||||
| 		sethi %hi(_nwindows_min1), %g3	!NWINDOWS-1 | ||||
| 		ld [%g3+%lo(_nwindows_min1)], %g3 | ||||
|  | ||||
|                 srl	%g2, %g3,  %g2 | ||||
|                 or	%g1, %g2, %g1 | ||||
|                 and	%g1, 0xff, %g1 | ||||
|  | ||||
|                 wr	%g1, 0x0, %wim | ||||
|  | ||||
|         	/* Grrr, make sure we load from the right %sp... */ | ||||
|                 PT_LOAD_ALL(sp, t_psr, t_pc, t_npc, g1) | ||||
|          | ||||
|                 restore	%g0, %g0, %g0 | ||||
|                 RW_LOAD(sp) | ||||
|                 b	2f | ||||
|                  save	%g0, %g0, %g0 | ||||
|  | ||||
| 	/* Reload the entire frame in case this is from a | ||||
| 	 * kernel system call or whatever... | ||||
| 	 */ | ||||
| 1: | ||||
| #endif | ||||
|  	PT_LOAD_ALL(sp, t_psr, t_pc, t_npc, g1) | ||||
| 2: | ||||
|  | ||||
| #ifdef _FLAT | ||||
| 	restore | ||||
| 	RW_LOAD(sp) | ||||
| 	save | ||||
| #endif | ||||
| 	 | ||||
| 	wr	%t_psr, 0x0, %psr | ||||
| 	nop; nop; nop   | ||||
|  | ||||
| 	jmp	%t_pc | ||||
| 	rett	%t_npc | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|          | ||||
| #ifdef _FLAT | ||||
| #warning _FLAT not implemented | ||||
| #endif | ||||
|          | ||||
|  | ||||
							
								
								
									
										158
									
								
								libgloss/sparc_leon/rtrap_fast.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								libgloss/sparc_leon/rtrap_fast.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,158 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <asm-leon/leonstack.h> | ||||
| #include <asm-leon/winmacros.h> | ||||
|                           | ||||
| /* Registers to not touch at all. */ | ||||
| #define t_psr     l0 | ||||
| #define t_pc      l1 | ||||
| #define t_npc     l2 | ||||
| #define t_wim     l3 | ||||
| #define twin_tmp1 l4 | ||||
| #define glob_tmp  g4 | ||||
| #define curptr    g6 | ||||
|  | ||||
| 	/* Number of register windows */ | ||||
| 	.global _nwindows_min1, _nwindows | ||||
|  | ||||
|         .text | ||||
| 	.align 4 | ||||
| 	.globl	leonbare_trapreturn_fast, schedule_callback | ||||
|  | ||||
|  | ||||
| /* rtap return special for irqtrap.S */ | ||||
| leonbare_trapreturn_fast: | ||||
|  | ||||
|         /* a optional scheduler can be called here */ | ||||
|         set schedule_callback, %g2 | ||||
|         ld [%g2], %g2 | ||||
|         cmp %g2,%g0 | ||||
|         beq 3f | ||||
|          nop | ||||
|                   | ||||
|         jmpl %g2,%o7 | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	 add	%sp, FW_REGS_SZ + 8 + SF_REGS_SZ , %o1	! pt_regs ptr | ||||
| #else | ||||
| 	 add	%sp, SF_REGS_SZ , %o1		   ! pt_regs ptr | ||||
| #endif | ||||
| 	 | ||||
| 3: | ||||
| 	 | ||||
| #ifndef _SOFT_FLOAT | ||||
| 	ld [%sp + (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ - 4)],%g2 | ||||
| 	sethi %hi(fpustate_current), %g3  | ||||
| 	st %g2, [%g3+%lo(fpustate_current)] | ||||
| 	sethi	%hi(fpustate_owner), %g3 | ||||
| 	ld	[%g3+%lo(fpustate_owner)], %g3 | ||||
| 	cmp	%g2, %g3 | ||||
| 	bne	didusefpu | ||||
| 	 nop | ||||
| 	 | ||||
| 	/* avoid fpu exception */ | ||||
| 	ld 	[%sp + (SF_REGS_SZ + PT_REGS_SZ + FW_REGS_SZ - 8)], %g2 | ||||
| 	set	SPARC_PSR_EF_MASK, %g3 | ||||
| 	and 	%g2, %g3, %g2 | ||||
| 	andn	%t_psr, %g3, %t_psr | ||||
| 	or	%t_psr, %g2, %t_psr | ||||
| 	ba,a	1f | ||||
| 	 | ||||
| didusefpu: | ||||
| 	add 	%sp,SF_REGS_SZ + PT_REGS_SZ,%g2 | ||||
| 	cmp	%g2, %g3 | ||||
| 	bne	1f | ||||
|  | ||||
| 	sethi	%hi(fpustate_owner), %g3 | ||||
| 	st	%g0, [%g3+%lo(fpustate_owner)] | ||||
| 	 | ||||
| 1:	 | ||||
| #endif | ||||
| 		 | ||||
| 	wr	%t_psr, 0x0, %psr       ! enable nesting again, clear ET | ||||
| 	 | ||||
| #ifndef _FLAT | ||||
| 	/* Will the rett land us in the invalid window? */ | ||||
| 	mov	2, %g1 | ||||
| 	sll	%g1, %t_psr, %g1 | ||||
|  | ||||
| 	sethi %hi(_nwindows), %g2	!NWINDOWS | ||||
| 	ld [%g2+%lo(_nwindows)], %g2 | ||||
| 	 | ||||
|        	srl	%g1, %g2, %g2 | ||||
| 	or	%g1, %g2, %g1 | ||||
| 	rd	%wim, %g2 | ||||
| 	andcc	%g2, %g1, %g0 | ||||
| 	be	1f		! Nope, just return from the trap | ||||
| 	 sll	%g2, 0x1, %g1 | ||||
|  | ||||
|         	/* We have to grab a window before returning. */ | ||||
| 		sethi %hi(_nwindows_min1), %g3	!NWINDOWS-1 | ||||
| 		ld [%g3+%lo(_nwindows_min1)], %g3 | ||||
|  | ||||
|                 srl	%g2, %g3,  %g2 | ||||
|                 or	%g1, %g2, %g1 | ||||
|                 and	%g1, 0xff, %g1 | ||||
|  | ||||
|                 wr	%g1, 0x0, %wim | ||||
|  | ||||
|         	/* Grrr, make sure we load from the right %sp... */ | ||||
|                 PT_LOAD_ALL_FAST(sp, t_psr, t_pc, t_npc, g1) | ||||
| 	 | ||||
|         	restore	%g0, %g0, %g0 | ||||
|                 RW_LOAD(sp) | ||||
|                 b	2f | ||||
|                  save	%g0, %g0, %g0 | ||||
|  | ||||
| 	/* Reload the entire frame in case this is from a | ||||
| 	 * kernel system call or whatever... | ||||
| 	 */ | ||||
| 1: | ||||
| #endif | ||||
|  	PT_LOAD_ALL_FAST(sp, t_psr, t_pc, t_npc, g1) | ||||
| 	 | ||||
| 2:      /*PT_LOAD_GLOBALS(sp)*/ | ||||
|  | ||||
| #ifdef _FLAT | ||||
| 	restore | ||||
| 	RW_LOAD(sp) | ||||
| 	save | ||||
| #endif | ||||
| 	 | ||||
| 	wr	%t_psr, 0x0, %psr | ||||
| 	nop; nop; nop   | ||||
|  | ||||
| 	jmp	%t_pc | ||||
| 	rett	%t_npc | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|          | ||||
| #ifdef _FLAT | ||||
| #warning _FLAT not implemented | ||||
| #endif | ||||
|          | ||||
|  | ||||
							
								
								
									
										31
									
								
								libgloss/sparc_leon/stop.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								libgloss/sparc_leon/stop.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| 	.seg    "text" | ||||
| 	.global _leonbase_Stop | ||||
|  | ||||
| _leonbase_Stop: | ||||
| 	ta 0 | ||||
| 	 nop | ||||
							
								
								
									
										146
									
								
								libgloss/sparc_leon/timer.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								libgloss/sparc_leon/timer.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| /* | ||||
|  * Copyright (c) 2011 Aeroflex Gaisler | ||||
|  * | ||||
|  * BSD license: | ||||
|  * | ||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
|  * of this software and associated documentation files (the "Software"), to deal | ||||
|  * in the Software without restriction, including without limitation the rights | ||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
|  * copies of the Software, and to permit persons to whom the Software is | ||||
|  * furnished to do so, subject to the following conditions: | ||||
|  * | ||||
|  * The above copyright notice and this permission notice shall be included in | ||||
|  * all copies or substantial portions of the Software. | ||||
|  * | ||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||||
|  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||
|  * THE SOFTWARE. | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/errno.h> | ||||
| #include <asm-leon/leon.h> | ||||
| #include <asm-leon/irq.h> | ||||
| #include <asm-leon/timer.h> | ||||
| #include <asm-leon/leoncompat.h> | ||||
|  | ||||
| // ''''''''''''''''''''''''''''''''''''''''''''''''''''' | ||||
|  | ||||
| TAILQ_HEAD (timer_queue, timerevent) timers = TAILQ_HEAD_INITIALIZER (timers); | ||||
|  | ||||
|      int | ||||
|      addtimer (struct timerevent *e) | ||||
| { | ||||
|   struct timerevent *next; | ||||
|   unsigned long old = leonbare_disable_traps (); | ||||
|   TAILQ_FOREACH (next, &timers, n) | ||||
|   { | ||||
|     if (!GT_TIMESPEC (e->expire, next->expire)) | ||||
|       break; | ||||
|   } | ||||
|   if (next) | ||||
|     { | ||||
|       TAILQ_INSERT_BEFORE (next, e, n); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       TAILQ_INSERT_TAIL (&timers, e, n); | ||||
|     } | ||||
|   leonbare_enable_traps (old); | ||||
| } | ||||
|  | ||||
| extern unsigned long noalarm; | ||||
| void | ||||
| settimer () | ||||
| { | ||||
|   struct timeval tv, te; | ||||
|   struct timerevent *e = TAILQ_FIRST (&timers), *n; | ||||
|   while (e) | ||||
|     { | ||||
|       n = TAILQ_NEXT (e, n); | ||||
|       te.tv_sec = e->expire.tv_sec; | ||||
|       te.tv_usec = e->expire.tv_nsec / NSEC_PER_USEC; | ||||
|       do_gettimeofday (&tv); | ||||
|       if (GT_TIMEVAL (te, tv)) | ||||
| 	{ | ||||
| 	  MINUS_TIMEVAL (te, te, tv); | ||||
| 	  if (!tv.tv_sec || te.tv_usec <= tick_usec) | ||||
| 	    { | ||||
| 	      if (!noalarm) | ||||
| 		{ | ||||
| 		  //--------------------- | ||||
| 		  switch (LEONCOMPAT_VERSION) | ||||
| 		    { | ||||
| 		    case 3: | ||||
| 		    default: | ||||
| 		      LEON3_GpTimer_Regs->e[1].val = 0; | ||||
| 		      LEON3_GpTimer_Regs->e[1].rld = te.tv_usec - 1; | ||||
| 		      LEON3_GpTimer_Regs->e[1].ctrl = 0; | ||||
| 		      LEON3_GpTimer_Regs->e[1].ctrl = | ||||
| 			LEON3_GPTIMER_EN | | ||||
| 			LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN; | ||||
| 		      break; | ||||
| 		    } | ||||
| 		} | ||||
| 	      //--------------------- | ||||
| 	    } | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  unsigned long old = leonbare_disable_traps (); | ||||
| 	  TAILQ_REMOVE (&timers, e, n); | ||||
| 	  e->handler (e->arg); | ||||
| 	  leonbare_enable_traps (old); | ||||
| 	} | ||||
|       e = n; | ||||
|     } | ||||
| } | ||||
|  | ||||
| int | ||||
| Timer_getTimer1 (unsigned int **count, unsigned int **reload, | ||||
| 		 unsigned int **ctrl) | ||||
| { | ||||
|   //--------------------- | ||||
|   switch (LEONCOMPAT_VERSION) | ||||
|     { | ||||
|     case 3: | ||||
|     default: | ||||
|       amba_init (); | ||||
|       *count = (unsigned int *) &(LEON3_GpTimer_Regs->e[0].val); | ||||
|       *reload = (unsigned int *) &(LEON3_GpTimer_Regs->e[0].rld); | ||||
|       *ctrl = (unsigned int *) &(LEON3_GpTimer_Regs->e[0].ctrl); | ||||
|       break; | ||||
|     } | ||||
|   //--------------------- | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
| int | ||||
| Timer_getTimer2 (unsigned int **count, unsigned int **reload, | ||||
| 		 unsigned int **ctrl) | ||||
| { | ||||
|   //--------------------- | ||||
|   switch (LEONCOMPAT_VERSION) | ||||
|     { | ||||
|     case 3: | ||||
|     default: | ||||
|       amba_init (); | ||||
|       if (!noalarm) | ||||
| 	{ | ||||
| 	  *count = (unsigned int *) &(LEON3_GpTimer_Regs->e[1].val); | ||||
| 	  *reload = (unsigned int *) &(LEON3_GpTimer_Regs->e[1].rld); | ||||
| 	  *ctrl = (unsigned int *) &(LEON3_GpTimer_Regs->e[1].ctrl); | ||||
| 	  break; | ||||
| 	} | ||||
|       return 0; | ||||
|     } | ||||
|   //--------------------- | ||||
|   return 1; | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user