blob: efa8416f6bca4dcfdce68b59b1b428a92c70afb8 [file] [log] [blame]
##############################################################################
#
# (c) Copyright 2011 Xilinx, Inc. All rights reserved.
#
# This file contains confidential and proprietary information of Xilinx, Inc.
# and is protected under U.S. and international copyright and other
# intellectual property laws.
#
# DISCLAIMER
# This disclaimer is not a license and does not grant any rights to the
# materials distributed herewith. Except as otherwise provided in a valid
# license issued to you by Xilinx, and to the maximum extent permitted by
# applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
# FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
# IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
# MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
# and (2) Xilinx shall not be liable (whether in contract or tort, including
# negligence, or under any other theory of liability) for any loss or damage
# of any kind or nature related to, arising under or in connection with these
# materials, including for any direct, or any indirect, special, incidental,
# or consequential loss or damage (including loss of data, profits, goodwill,
# or any type of loss or damage suffered as a result of any action brought by
# a third party) even if such damage or loss was reasonably foreseeable or
# Xilinx had been advised of the possibility of the same.
#
# CRITICAL APPLICATIONS
# Xilinx products are not designed or intended to be fail-safe, or for use in
# any application requiring fail-safe performance, such as life-support or
# safety devices or systems, Class III medical devices, nuclear facilities,
# applications related to the deployment of airbags, or any other applications
# that could lead to death, personal injury, or severe property or
# environmental damage (individually and collectively, "Critical
# Applications"). Customer assumes the sole risk and liability of any use of
# Xilinx products in Critical Applications, subject only to applicable laws
# and regulations governing limitations on product liability.
#
# THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
# AT ALL TIMES.
#
# This file is part of FreeRTOS.
#
# $Id: freertos_v2_1_0.tcl,v 1.1.2.8 2010/12/10 07:27:08 svemula Exp $
###############################################################################
# standalone bsp version. set this to the latest "ACTIVE" version.
set standalone_version standalone_v3_01_a
proc kernel_drc {os_handle} {
set sw_proc_handle [xget_libgen_proc_handle]
set hw_proc_handle [xget_handle $sw_proc_handle "IPINST"]
set proctype [xget_value $hw_proc_handle "OPTION" "IPNAME"]
set compiler [xget_value $sw_proc_handle "PARAMETER" "COMPILER"]
# check for valid compiler
if { [string first "mb-gcc" $compiler] == 0 && [string first "mb-g++" $compiler] == 0} {
error "Wrong compiler requested. FreeRTOS can be compiled only with the GNU compiler for MicroBlaze." "" "mdt_error"
}
# check for valid stdio parameters
set stdin [xget_value $os_handle "PARAMETER" "STDIN"]
set stdout [xget_value $os_handle "PARAMETER" "STDOUT"]
if { $stdin == "none" || $stdout == "none" } {
error "The STDIN/STDOUT parameters are not set. FreeRTOS requires stdin/stdout to be set." "" "mdt_error"
}
# check if the design has a intc
set intr_port [xget_value $hw_proc_handle "PORT" "Interrupt"]
if { [llength $intr_port] == 0 } {
error "CPU has no connection to Interrupt controller." "" "mdt_error"
}
# support only AXI/PLB
set interconnect [xget_value $hw_proc_handle "PARAMETER" "C_INTERCONNECT"]
if { $interconnect == 1 } {
set bus_name [xget_hw_busif_value $hw_proc_handle "DPLB"]
} elseif { $interconnect == 2 } {
set bus_name [xget_hw_busif_value $hw_proc_handle "M_AXI_DP"]
} else {
error "FreeRTOS supports Microblaze with only a AXI or PLB interconnect" "" "mdt_error"
}
# obtain handles to all the peripherals in the design
set mhs_handle [xget_hw_parent_handle $hw_proc_handle]
set slave_ifs [xget_hw_connected_busifs_handle $mhs_handle $bus_name "slave"]
set timer_count 0
set timer_has_intr 0
# check for a valid timer
foreach if $slave_ifs {
set ip_handle [xget_hw_parent_handle $if]
if {$ip_handle != $hw_proc_handle} {
set type [xget_hw_value $ip_handle]
if { $type == "xps_timer" || $type == "axi_timer" } {
incr timer_count
# check if the timer interrupts are enabled
set intr_port [xget_value $ip_handle "PORT" "Interrupt"]
if { [llength $intr_port] != 0 } {
set timer_has_intr 1
}
}
}
}
if { $timer_count == 0 } {
error "FreeRTOS for Microblaze requires an axi_timer or xps_timer. The HW platform doesn't have a valid timer." "" "mdt_error"
}
if { $timer_has_intr == 0 } {
error "FreeRTOS for Microblaze requires interrupts enabled for a timer." "" "mdt_error"
}
set systmr_interval_ms [xget_value $os_handle "PARAMETER" "systmr_interval"]
if { $systmr_interval_ms <= 0 } {
error "Invalid value for parameter systmr_interval specified. Please specify a positive value." "" "mdt_error"
}
### ToDo: Add DRC specific to FreeRTOS
}
proc generate {os_handle} {
variable standalone_version
set sw_proc_handle [xget_libgen_proc_handle]
set hw_proc_handle [xget_handle $sw_proc_handle "IPINST"]
set proctype [xget_value $hw_proc_handle "OPTION" "IPNAME"]
set procver [xget_value $hw_proc_handle "PARAMETER" "HW_VER"]
set need_config_file "false"
# proctype should be "microblaze"
set mbsrcdir "../${standalone_version}/src/microblaze"
set commondir "../${standalone_version}/src/common"
set datadir "../${standalone_version}/data"
foreach entry [glob -nocomplain [file join $commondir *]] {
file copy -force $entry [file join ".." "${standalone_version}" "src"]
}
# proctype should be "microblaze"
switch -regexp $proctype {
"microblaze" {
foreach entry [glob -nocomplain [file join $mbsrcdir *]] {
if { [string first "microblaze_interrupt_handler" $entry] == -1 } { ;# Do not copy over the Standalone BSP exception handler
file copy -force $entry [file join ".." "${standalone_version}" "src"]
}
}
set need_config_file "true"
}
"default" {puts "unknown processor type $proctype\n"}
}
# Write the config.make file
set makeconfig [open "../standalone_v3_01_a/src/config.make" w]
xprint_generated_header_tcl $makeconfig "Configuration parameters for Standalone Makefile"
if { $proctype == "microblaze" } {
if { [mb_has_exceptions $hw_proc_handle] } {
puts $makeconfig "LIBSOURCES = *.s *.c *.S"
} else {
puts $makeconfig "LIBSOURCES = *.s *.c"
}
}
puts $makeconfig "LIBS = standalone_libs"
close $makeconfig
# Remove microblaze directories...
file delete -force $mbsrcdir
# copy required files to the main src directory
file copy -force [file join src Source tasks.c] src
file copy -force [file join src Source queue.c] src
file copy -force [file join src Source list.c] src
file copy -force [file join src Source timers.c] src
file copy -force [file join src Source portable MemMang heap_3.c] src
file copy -force [file join src Source portable GCC MicroBlazeV8 port.c] src
file copy -force [file join src Source portable GCC MicroBlazeV8 port_exceptions.c] src
file copy -force [file join src Source portable GCC MicroBlazeV8 portasm.S] src
file copy -force [file join src Source portable GCC MicroBlazeV8 portmacro.h] src
set headers [glob -join ./src/Source/include *.\[h\]]
foreach header $headers {
file copy -force $header src
}
file delete -force [file join src Source]
file delete -force [file join src Source]
# Handle stdin and stdout
xhandle_stdin $os_handle
xhandle_stdout $os_handle
# Create config file for microblaze interrupt handling
if {[string compare -nocase $need_config_file "true"] == 0} {
xhandle_mb_interrupts
}
# Create config files for Microblaze exception handling
if { $proctype == "microblaze" && [mb_has_exceptions $hw_proc_handle] } {
xcreate_mb_exc_config_file
}
# Create bspconfig file
set bspcfg_fn [file join ".." "${standalone_version}" "src" "bspconfig.h"]
file delete $bspcfg_fn
set bspcfg_fh [open $bspcfg_fn w]
xprint_generated_header $bspcfg_fh "Configurations for Standalone BSP"
if { $proctype == "microblaze" && [mb_has_pvr $hw_proc_handle] } {
set pvr [xget_value $hw_proc_handle "PARAMETER" "C_PVR"]
switch $pvr {
"0" {
puts $bspcfg_fh "#define MICROBLAZE_PVR_NONE"
}
"1" {
puts $bspcfg_fh "#define MICROBLAZE_PVR_BASIC"
}
"2" {
puts $bspcfg_fh "#define MICROBLAZE_PVR_FULL"
}
"default" {
puts $bspcfg_fh "#define MICROBLAZE_PVR_NONE"
}
}
}
close $bspcfg_fh
# ToDO: FreeRTOS does not handle the following, refer xilkernel TCL script
# - MPU settings
set config_file [xopen_new_include_file "./src/FreeRTOSConfig.h" "FreeRTOS Configuration parameters"]
puts $config_file "\#include \"xparameters.h\" \n"
set val [xget_value $os_handle "PARAMETER" "use_preemption"]
if {$val == "false"} {
xput_define $config_file "configUSE_PREEMPTION" "0"
} else {
xput_define $config_file "configUSE_PREEMPTION" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_mutexes"]
if {$val == "false"} {
xput_define $config_file "configUSE_MUTEXES" "0"
} else {
xput_define $config_file "configUSE_MUTEXES" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_recursive_mutexes"]
if {$val == "false"} {
xput_define $config_file "configUSE_RECURSIVE_MUTEXES" "0"
} else {
xput_define $config_file "configUSE_RECURSIVE_MUTEXES" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_counting_semaphores"]
if {$val == "false"} {
xput_define $config_file "configUSE_COUNTING_SEMAPHORES" "0"
} else {
xput_define $config_file "configUSE_COUNTING_SEMAPHORES" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_timers"]
if {$val == "false"} {
xput_define $config_file "configUSE_TIMERS" "0"
} else {
xput_define $config_file "configUSE_TIMERS" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_idle_hook"]
if {$val == "false"} {
xput_define $config_file "configUSE_IDLE_HOOK" "0"
} else {
xput_define $config_file "configUSE_IDLE_HOOK" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_tick_hook"]
if {$val == "false"} {
xput_define $config_file "configUSE_TICK_HOOK" "0"
} else {
xput_define $config_file "configUSE_TICK_HOOK" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_malloc_failed_hook"]
if {$val == "false"} {
xput_define $config_file "configUSE_MALLOC_FAILED_HOOK" "0"
} else {
xput_define $config_file "configUSE_MALLOC_FAILED_HOOK" "1"
}
set val [xget_value $os_handle "PARAMETER" "use_trace_facility"]
if {$val == "false"} {
xput_define $config_file "configUSE_TRACE_FACILITY" "0"
} else {
xput_define $config_file "configUSE_TRACE_FACILITY" "1"
}
xput_define $config_file "configUSE_16_BIT_TICKS" "0"
xput_define $config_file "configUSE_APPLICATION_TASK_TAG" "0"
xput_define $config_file "configUSE_CO_ROUTINES" "0"
# System timer tick rate (Microblaze only. kernel DRC ensures this)
set systmr_interval [xget_value $os_handle "PARAMETER" "systmr_interval"]
xput_define $config_file "configTICK_RATE_HZ" $systmr_interval
set max_priorities [xget_value $os_handle "PARAMETER" "max_priorities"]
xput_define $config_file "configMAX_PRIORITIES" $max_priorities
xput_define $config_file "configMAX_CO_ROUTINE_PRIORITIES" "2"
set min_stack [xget_value $os_handle "PARAMETER" "minimal_stack_size"]
set min_stack [expr [expr $min_stack + 3] & 0xFFFFFFFC]
xput_define $config_file "configMINIMAL_STACK_SIZE" $min_stack
set total_heap_size [xget_value $os_handle "PARAMETER" "total_heap_size"]
set total_heap_size [expr [expr $total_heap_size + 3] & 0xFFFFFFFC]
xput_define $config_file "configTOTAL_HEAP_SIZE" $total_heap_size
set max_task_name_len [xget_value $os_handle "PARAMETER" "max_task_name_len"]
xput_define $config_file "configMAX_TASK_NAME_LEN" $max_task_name_len
set val [xget_value $os_handle "PARAMETER" "idle_yield"]
if {$val == "false"} {
xput_define $config_file "configIDLE_SHOULD_YIELD" "0"
} else {
xput_define $config_file "configIDLE_SHOULD_YIELD" "1"
}
set val [xget_value $os_handle "PARAMETER" "check_for_stack_overflow"]
if {$val == "false"} {
xput_define $config_file "configCHECK_FOR_STACK_OVERFLOW" "0"
} else {
xput_define $config_file "configCHECK_FOR_STACK_OVERFLOW" "2"
}
set val [xget_value $os_handle "PARAMETER" "queue_registry_size"]
if {$val == "false"} {
xput_define $config_file "configQUEUE_REGISTRY_SIZE" "0"
} else {
xput_define $config_file "configQUEUE_REGISTRY_SIZE" "10"
}
xput_define $config_file "configGENERATE_RUN_TIME_STATS" "0"
set val [xget_value $os_handle "PARAMETER" "timer_task_priority"]
if {$val == "false"} {
xput_define $config_file "configTIMER_TASK_PRIORITY" "0"
} else {
xput_define $config_file "configTIMER_TASK_PRIORITY" "10"
}
set val [xget_value $os_handle "PARAMETER" "timer_command_queue_length"]
if {$val == "false"} {
xput_define $config_file "configTIMER_QUEUE_LENGTH" "0"
} else {
xput_define $config_file "configTIMER_QUEUE_LENGTH" "10"
}
set val [xget_value $os_handle "PARAMETER" "timer_task_stack_depth"]
if {$val == "false"} {
xput_define $config_file "configTIMER_TASK_STACK_DEPTH" "0"
} else {
xput_define $config_file "configTIMER_TASK_STACK_DEPTH" $min_stack
}
if { [mb_has_exceptions $hw_proc_handle] } {
xput_define $config_file "configINSTALL_EXCEPTION_HANDLERS" "1"
} else {
xput_define $config_file "configINSTALL_EXCEPTION_HANDLERS" "0"
}
xput_define $config_file "configINTERRUPT_CONTROLLER_TO_USE" "XPAR_INTC_SINGLE_DEVICE_ID"
xput_define $config_file "INCLUDE_vTaskCleanUpResources" "0"
xput_define $config_file "INCLUDE_vTaskDelay" "1"
xput_define $config_file "INCLUDE_vTaskDelayUntil" "1"
xput_define $config_file "INCLUDE_vTaskDelete" "1"
xput_define $config_file "INCLUDE_xTaskGetCurrentTaskHandle" "1"
xput_define $config_file "INCLUDE_xTaskGetIdleTaskHandle" "1"
xput_define $config_file "INCLUDE_xTaskGetSchedulerState" "1"
xput_define $config_file "INCLUDE_xTimerGetTimerDaemonTaskHandle" "1"
xput_define $config_file "INCLUDE_uxTaskGetStackHighWaterMark" "1"
xput_define $config_file "INCLUDE_uxTaskPriorityGet" "1"
xput_define $config_file "INCLUDE_vTaskPrioritySet" "1"
xput_define $config_file "INCLUDE_xTaskResumeFromISR" "1"
xput_define $config_file "INCLUDE_vTaskSuspend" "1"
xput_define $config_file "INCLUDE_pcTaskGetTaskName" "1"
xput_define $config_file "INCLUDE_xTaskGetIdleTaskHandle" "1"
xput_define $config_file "INCLUDE_xTimerGetTimerDaemonTaskHandle" "1"
# complete the header protectors
puts $config_file "\#endif"
close $config_file
}
proc xopen_new_include_file { filename description } {
set inc_file [open $filename w]
xprint_generated_header $inc_file $description
set newfname [string map {. _} [lindex [split $filename {\/}] end]]
puts $inc_file "\#ifndef _[string toupper $newfname]"
puts $inc_file "\#define _[string toupper $newfname]\n\n"
return $inc_file
}
proc xadd_define { config_file os_handle parameter } {
set param_value [xget_value $os_handle "PARAMETER" $parameter]
puts $config_file "#define [string toupper $parameter] $param_value\n"
# puts "creating #define [string toupper $parameter] $param_value\n"
}
proc xput_define { config_file parameter param_value } {
puts $config_file "#define $parameter $param_value\n"
# puts "creating #define [string toupper $parameter] $param_value\n"
}
# args field of the array
proc xadd_extern_fname {initfile oshandle arrayname arg} {
set arrhandle [xget_handle $oshandle "ARRAY" $arrayname]
set elements [xget_handle $arrhandle "ELEMENTS" "*"]
set count 0
set max_count [llength $elements]
foreach ele $elements {
incr count
set arg_value [xget_value $ele "PARAMETER" $arg]
puts $initfile "extern void $arg_value\(\)\;"
}
puts $initfile ""
}
# args is variable no - fields of the array
proc xadd_struct {initfile oshandle structtype structname arrayname args} {
set arrhandle [xget_handle $oshandle "ARRAY" $arrayname]
set elements [xget_handle $arrhandle "ELEMENTS" "*"]
set count 0
set max_count [llength $elements]
puts $initfile "struct $structtype $structname\[$max_count\] = \{"
foreach ele $elements {
incr count
puts -nonewline $initfile "\t\{"
foreach field $args {
set field_value [xget_value $ele "PARAMETER" $field]
# puts "$arrayname ( $count )->$field is $field_value"
puts -nonewline $initfile "$field_value"
if { $field != [lindex $args end] } {
puts -nonewline $initfile ","
}
}
if {$count < $max_count} {
puts $initfile "\},"
} else {
puts $initfile "\}"
}
}
puts $initfile "\}\;"
}
# return the sum of all the arg field values in arrayname
proc get_field_sum {oshandle arrayname arg} {
set arrhandle [xget_handle $oshandle "ARRAY" $arrayname]
set elements [xget_handle $arrhandle "ELEMENTS" "*"]
set count 0
set max_count [llength $elements]
foreach ele $elements {
set field_value [xget_value $ele "PARAMETER" $arg]
set count [expr $field_value+$count]
}
return $count
}
# return the sum of the product of field values in arrayname
proc get_field_product_sum {oshandle arrayname field1 field2} {
set arrhandle [xget_handle $oshandle "ARRAY" $arrayname]
set elements [xget_handle $arrhandle "ELEMENTS" "*"]
set count 0
set max_count [llength $elements]
foreach ele $elements {
set field1_value [xget_value $ele "PARAMETER" $field1]
set field2_value [xget_value $ele "PARAMETER" $field2]
set incr_value [expr $field1_value*$field2_value]
set count [expr $count+$incr_value]
}
return $count
}
proc xhandle_mb_interrupts {} {
set default_interrupt_handler "XNullHandler"
set default_arg "XNULL"
set source_interrupt_handler $default_interrupt_handler
set source_handler_arg $default_arg
# Handle the interrupt pin
set sw_proc_handle [xget_libgen_proc_handle]
set periph [xget_handle $sw_proc_handle "IPINST"]
set source_ports [xget_interrupt_sources $periph]
if {[llength $source_ports] > 1} {
error "Too many interrupting ports on the MicroBlaze. Should only find 1" "" "libgen_error"
return
}
if {[llength $source_ports] == 1} {
set source_port [lindex $source_ports 0]
if {[llength $source_port] != 0} {
set source_port_name [xget_value $source_port "VALUE"]
set source_periph [xget_handle $source_port "PARENT"]
set source_name [xget_value $source_periph "NAME"]
set source_driver [xget_sw_driver_handle_for_ipinst $sw_proc_handle $source_name]
if {[string compare -nocase $source_driver ""] != 0} {
set int_array [xget_handle $source_driver "ARRAY" "interrupt_handler"]
if {[llength $int_array] != 0} {
set int_array_elems [xget_handle $int_array "ELEMENTS" "*"]
if {[llength $int_array_elems] != 0} {
foreach int_array_elem $int_array_elems {
set int_port [xget_value $int_array_elem "PARAMETER" "int_port"]
if {[llength $int_port] != 0} {
if {[string compare -nocase $int_port $source_port_name] == 0 } {
set source_interrupt_handler [xget_value $int_array_elem "PARAMETER" "int_handler"]
set source_handler_arg [xget_value $int_array_elem "PARAMETER" "int_handler_arg"]
if {[string compare -nocase $source_handler_arg DEVICE_ID] == 0 } {
set source_handler_arg [xget_name $source_periph "DEVICE_ID"]
} else {
if {[string compare -nocase "global" [xget_port_type $source_port]] == 0} {
set source_handler_arg $default_arg
} else {
set source_handler_arg [xget_name $source_periph "C_BASEADDR"]
}
}
break
}
}
}
}
}
}
}
}
# Generate microblaze_interrupts_g.c file...
xcreate_mb_intr_config_file $source_interrupt_handler $source_handler_arg
}
proc xcreate_mb_intr_config_file {handler arg} {
set mb_table "MB_InterruptVectorTable"
set filename [file join "../standalone_v3_01_a/src" "microblaze_interrupts_g.c"]
file delete $filename
set config_file [open $filename w]
xprint_generated_header $config_file "Interrupt Handler Table for MicroBlaze Processor"
puts $config_file "#include \"microblaze_interrupts_i.h\""
puts $config_file "#include \"xparameters.h\""
puts $config_file "\n"
puts $config_file [format "extern void %s (void *);" $handler]
puts $config_file "\n/*"
puts $config_file "* The interrupt handler table for microblaze processor"
puts $config_file "*/\n"
puts $config_file [format "%sEntry %s\[\] =" $mb_table $mb_table]
puts $config_file "\{"
puts -nonewline $config_file [format "\{\t%s" $handler]
puts -nonewline $config_file [format ",\n\t(void*) %s\}" $arg]
puts -nonewline $config_file "\n\};"
puts $config_file "\n"
close $config_file
}
# -------------------------------------------
# Tcl procedure xcreate_mb_exc_config file
# -------------------------------------------
proc xcreate_mb_exc_config_file { } {
set hfilename [file join "src" "microblaze_exceptions_g.h"]
file delete $hfilename
set hconfig_file [open $hfilename w]
xprint_generated_header $hconfig_file "Exception Handling Header for MicroBlaze Processor"
puts $hconfig_file "\n"
set sw_proc_handle [xget_libgen_proc_handle]
set hw_proc_handle [xget_handle $sw_proc_handle "IPINST"]
set procver [xget_value $hw_proc_handle "PARAMETER" "HW_VER"]
if { ![mb_has_exceptions $hw_proc_handle]} { ;# NO exceptions are enabled
close $hconfig_file ;# Do not generate any info in either the header or the C file
return
}
puts $hconfig_file "\#define MICROBLAZE_EXCEPTIONS_ENABLED 1"
if { [mb_can_handle_exceptions_in_delay_slots $procver] } {
puts $hconfig_file "#define MICROBLAZE_CAN_HANDLE_EXCEPTIONS_IN_DELAY_SLOTS"
}
close $hconfig_file
}
# --------------------------------------
# Tcl procedure post_generate
# This proc removes from libxil.a the basic
# and standalone BSP versions of
# _interrupt_handler and _hw_exception_handler
# routines
# --------------------------------------
proc post_generate {os_handle} {
set sw_proc_handle [xget_libgen_proc_handle]
set hw_proc_handle [xget_handle $sw_proc_handle "IPINST"]
set proctype [xget_value $hw_proc_handle "OPTION" "IPNAME"]
set procname [xget_value $hw_proc_handle "NAME"]
set procdrv [xget_sw_driver_handle_for_ipinst $sw_proc_handle $procname]
set archiver [xget_value $procdrv "PARAMETER" "archiver"]
if {[string compare -nocase $proctype "microblaze"] == 0 } {
# Remove _interrupt_handler.o from libxil.a for FreeRTOS
set libxil_a [file join .. .. lib libxil.a]
exec $archiver -d $libxil_a _interrupt_handler.o
# We have linkage problems due to how these platforms are defined. Can't do this right now.
# # Remove _exception_handler.o from libxil.a for FreeRTOS
# exec bash -c "$archiver -d ../../lib/libxil.a _exception_handler.o"
# Remove _hw_exception_handler.o from libxil.a for microblaze cores with exception support
if {[mb_has_exceptions $hw_proc_handle]} {
exec $archiver -d ../../lib/libxil.a _hw_exception_handler.o
}
}
}
# --------------------------------------
# Tcl procedure execs_generate
# This proc removes from libxil.a all
# the stuff that we are overriding
# with xilkernel
# We currently override,
# MicroBlaze
# - Dummy _interrupt_hander and _hw_exception_handler
# (in post_generate)
# PPC
# - xvectors.o; sleep.o (IF config_time is true)
# Common to all processors
# - errno.o
# --------------------------------------
proc execs_generate {os_handle} {
set sw_proc_handle [xget_libgen_proc_handle]
set hw_proc_handle [xget_handle $sw_proc_handle "IPINST"]
set proctype [xget_value $hw_proc_handle "OPTION" "IPNAME"]
set procname [xget_value $hw_proc_handle "NAME"]
set procdrv [xget_sw_driver_handle_for_ipinst $sw_proc_handle $procname]
# Remove _interrupt_handler.o from libxil.a for mb-gcc
set archiver [xget_value $procdrv "PARAMETER" "archiver"]
set libxil_a [file join .. .. lib libxil.a]
# exec $archiver -d $libxil_a errno.o
# We have linkage problems due to how these platforms are defined. Can't do this right now.
# exec "$archiver -d $libxil_a microblaze_interrupt_handler.o"
}
# --------------------------------------
# Return true if this MB has
# exception handling support
# --------------------------------------
proc mb_has_exceptions { hw_proc_handle } {
# Check if the following parameters exist on this MicroBlaze's MPD
set ee [xget_value $hw_proc_handle "PARAMETER" "C_UNALIGNED_EXCEPTIONS"]
if { $ee != "" } {
return true
}
set ee [xget_value $hw_proc_handle "PARAMETER" "C_ILL_OPCODE_EXCEPTION"]
if { $ee != "" } {
return true
}
set ee [xget_value $hw_proc_handle "PARAMETER" "C_IOPB_BUS_EXCEPTION"]
if { $ee != "" } {
return true
}
set ee [xget_value $hw_proc_handle "PARAMETER" "C_DOPB_BUS_EXCEPTION"]
if { $ee != "" } {
return true
}
set ee [xget_value $hw_proc_handle "PARAMETER" "C_DIV_BY_ZERO_EXCEPTION"]
if { $ee != "" } {
return true
}
set ee [xget_value $hw_proc_handle "PARAMETER" "C_DIV_ZERO_EXCEPTION"]
if { $ee != "" } {
return true
}
set ee [xget_value $hw_proc_handle "PARAMETER" "C_FPU_EXCEPTION"]
if { $ee != "" } {
return true
}
set ee [xget_value $hw_proc_handle "PARAMETER" "C_USE_MMU"]
if { $ee != "" && $ee != 0 } {
return true
}
return false
}
# --------------------------------------
# Return true if this MB has
# FPU exception handling support
# --------------------------------------
proc mb_has_fpu_exceptions { hw_proc_handle } {
# Check if the following parameters exist on this MicroBlaze's MPD
set ee [xget_value $hw_proc_handle "PARAMETER" "C_FPU_EXCEPTION"]
if { $ee != "" } {
return true
}
return false
}
# --------------------------------------
# Return true if this MB has PVR support
# --------------------------------------
proc mb_has_pvr { hw_proc_handle } {
# Check if the following parameters exist on this MicroBlaze's MPD
set pvr [xget_value $hw_proc_handle "PARAMETER" "C_PVR"]
if { $pvr != "" } {
return true
}
return false
}
# --------------------------------------
# Return true if MB ver 'procver' has
# support for handling exceptions in
# delay slots
# --------------------------------------
proc mb_can_handle_exceptions_in_delay_slots { procver } {
if { [string compare -nocase $procver "5.00.a"] >= 0 } {
return true
} else {
return false
}
}
# --------------------------------------------------------------------------
# Gets all the handles that are memory controller cores.
# --------------------------------------------------------------------------
proc xget_memory_controller_handles { mhs } {
set ret_list ""
# Gets all MhsInsts in the system
set mhsinsts [xget_hw_ipinst_handle $mhs "*"]
# Loop thru each MhsInst and determine if have "ADDR_TYPE = MEMORY" in
# the parameters.
foreach mhsinst $mhsinsts {
# Gets all parameters of the component
set params [xget_hw_parameter_handle $mhsinst "*"]
# Loop thru each param and find tag "ADDR_TYPE = MEMORY"
foreach param $params {
if {$param == 0} {
continue
} elseif {$param == ""} {
continue
}
set addrTypeValue [ xget_hw_subproperty_value $param "ADDR_TYPE" ]
# Found tag! Add MhsInst to list and break to go to next MhsInst
if {[string compare -nocase $addrTypeValue "MEMORY"] == 0} {
lappend ret_list $mhsinst
break
}
}
}
return $ret_list
}