/*****************************************************************************
 * MODIFICATION HISTORY:
 *
 * Ver   Who  Date     Changes
 * ----- ---- -------- ---------------------------------------------------
  * 3.02a sdm  05/30/11 Added Xuint64 typedef and XUINT64_MSW/XUINT64_LSW macros
 * 3.02a sdm  06/27/11 Added INST_SYNC and DATA_SYNC macros for all the CPUs
 * 3.02a sdm  07/07/11 Updated ppc440 boot.S to set guarded bit for all but
 *                     cacheable regions
 *                     Update ppc440/xil_cache.c to use CACHEABLE_REGION_MASK
 *                     generated by the cpu driver, for enabling caches
 * 3.02a sdm  07/08/11 Updated microblaze cache flush APIs based on write-back/
 *                     write-thru caches
 * 3.03a sdm  08/20/11 Updated the tag/data RAM latency values for L2CC
 *		       Updated the MMU table to mark OCM in high address space
 *		       as inner cacheable and reserved space as Invalid
 * 3.03a sdm  08/20/11 Changes to support FreeRTOS
 *		       Updated the MMU table to mark upper half of the DDR as
 *		       non-cacheable
 *		       Setup supervisor and abort mode stacks
 *		       Do not initialize/enable L2CC in case of AMP
 *		       Initialize UART1 for 9600bps in case of AMP
 * 3.03a sdm  08/27/11 Setup abort and supervisor mode stacks and don't init SMC
 *		       in case of AMP
 * 3.03a sdm  09/14/11 Added code for performance monitor and L2CC event
 *		       counters
 * 3.03a sdm  11/08/11 Updated microblaze xil_cache.h file to include
 *		       xparameters.h file for CR630532 -  Xil_DCacheFlush()/
 *		       Xil_DCacheFlushRange() functions in standalone BSP v3_02a
 *		       for MicroBlaze will invalidate data in the cache instead
 *		       of flushing it for writeback caches
 * 3.04a sdm  11/21/11 Updated to initialize stdio device for 115200bps, for PS7
 * 3.04a sdm  01/02/12 Updated to clear cp15 regs with unknown reset values
 *		       Remove redundant dsb/dmb instructions in cache maintenance
 *		       APIs
 *		       Remove redundant dsb in mcr instruction
 * 3.04a sdm  01/13/12 Updated MMU table to mark DDR memory as Shareable
 * 3.05a sdm  02/02/12 Removed some of the defines as they are being generated through
 *                     driver tcl in xparameters.h. Update the gcc/translationtable.s
 *                     for the QSPI complete address range - DT644567
 *                     Removed profile directory for armcc compiler and changed
 *                     profiling setting to false in standalone_v2_1_0.tcl file
 *                     Deleting boot.S file after preprocessing for armcc compiler
 * 3.05a asa  03/11/12 Updated the function Xil_EnableMMU in file xil_mmu.c to
 *		       invalidate the caches before enabling back the MMU and
 *		       D cache.
 * 3.05a asa  04/15/12 Updated the function Xil_SetTlbAttributes in file
 *		       xil_mmu.c. Now we invalidate UTLB, Branch predictor
 *		       array, flush the D-cache before changing the attributes
 *		       in translation table. The user need not call Xil_DisableMMU
 *		       before calling Xil_SetTlbAttributes.
 * 3.06a asa/ 06/17/12 Removed the UART initialization for Zynq. For PEEP, the UART
 *	 sgd	       initialization is present. Changes for this were done in
 *		       uart.c and xil-crt0.s.
 *		       Made changes in xil_io.c to use volatile pointers.
 *		       Made changes in xil_mmu.c to correct the function
 *		       Xil_SetTlbAttributes.
 *		       Changes are made xil-crt0.s to initialize the static
 *		       C++ constructors.
 *		       Changes are made in boot.s, to fix the TTBR settings,
 *		       correct the L2 Cache Auxiliary register settings, L2 cache
 *		       latency settings.
 * 3.07a asa/ 07/16/12 Made changes in cortexa9/xtime_l.c, xtime_l.h, sleep.c
 *	 sgd	       usleep.c to use global timer intstead of CP15.
 *		       Made changes in cortexa9/gcc/translation_table.s to map
 *		       the peripheral devices as shareable device memory.
 *		       Made changes in cortexa9/gcc/xil-crt0.s to initialize
 *		       the global timer.
 *		       Made changes in cortexa9/armcc/boot.S to initialize
 *		       the global timer.
 *		       Made changes in cortexa9/armcc/translation_table.s to
 *		       map the peripheral devices as shareable device memory.
 *		       Made changes in cortexa9/gcc/boot.S to optimize the
 *		       L2 cache settings. Changes the section properties for
 *		       ".mmu_tbl" and ".boot" sections in cortexa9/gcc/boot.S
 *			and cortexa9/gcc/translation_table.S.
 *		       Made changes in cortexa9/xil_cache.c to change the
 *		       cache invalidation order.
 * 3.07a asa  08/17/12 Made changes across files for Cortexa9 to remove
 *		       compilation/linking issues for C++ compiler.
 *		       Made changes in mb_interface.h to remove compilation/
 *		       linking issues for C++ compiler.
 *		       Added macros for swapb and swaph microblaze instructions
 *		       mb_interface.h
 *		       Remove barrier usage (SYNCHRONIZE_IO) from xil_io.c
 *		       for CortexA9.
 * 3.07a asa  08/30/12 Updated for CR 675636 to provide the L2 Base Address
 * 3.07a asa  08/31/12 Added xil_printf.h include
 * 3.07a sgd  09/18/12 Corrected the L2 cache enable settings
 *				Corrected L2 cache sequence disable sequence
 * 3.07a sgd  10/19/12 SMC NOR and SRAM initialization with compiler option
 * 3.09a asa  01/25/13 Updated to push and pop neon registers into stack for
 *		       irq/fiq handling.
 *		       Relocated COUNTS_PER_SECOND from sleep.c to xtime_l.h. This
 *		       fixes the CR #692094.
 * 3.09a sgd  02/14/13 Fix for CRs 697094 (SI#687034) and 675552.
 * 3.10a srt  04/18/13 Implemented ARM Erratas.
 *		       Cortex A9 Errata - 742230, 743622, 775420, 794073
 *		       L2Cache PL310 Errata - 588369, 727915, 759370
 *		       Please refer to file 'xil_errata.h' for errata
 *		       description.
 * 3.10a asa  05/04/13 Added support for L2 cache in MicroBlaze BSP. The older
 *		       cache APIs were corresponding to only Layer 1 cache
 *		       memories. New APIs were now added and the existing cache
 *		       related APIs were changed to provide a uniform interface
 *		       to flush/invalidate/enable/disable the complete cache
 *		       system which includes both L1 and L2 caches. The changes
 *		       for these were done in:
 *		       src/microblaze/xil_cache.c and src/microblaze/xil_cache.h
 *		       files.
 *		       Four new files were added for supporting L2 cache. They are:
 *		       microblaze_flush_cache_ext.S-> Flushes L2 cache
 *		       microblaze_flush_cache_ext_range.S -> Flushes a range of
 *		       memory in L2 cache.
 *		       microblaze_invalidate_cache_ext.S-> Invalidates L2 cache
 *		       microblaze_invalidate_cache_ext_range -> Invalidates a
 *		       range of memory in L2 cache.
 *		       These changes are done to implement PR #697214.
 * 3.10a  asa 05/13/13 Modified cache disable APIs at src/cortexa9/xil_cache.c to
 *		       fix the CR #706464. L2 cache disabling happens independent
 *		       of L1 data cache disable operation. Changes are done in the
 *		       same file in cache handling APIs to do a L2 cache sync
 *		       (poll reg7_?cache_?sync). This fixes CR #700542.
 * 3.10a asa  05/20/13 Added API/Macros for enabling and disabling nested
 *		       interrupts for ARM. These are done to fix the CR#699680.
 * 3.10a srt  05/20/13 Made changes in cache maintenance APIs to do a proper cach
 *		       sync operation. This fixes the CR# 716781.
 * 3.11a asa  09/07/13 Updated armcc specific BSP files to have proper support
 *		       for armcc toolchain.
 *		       Modified asm_vectors.S (gcc) and asm_vectors.s (armcc) to
 *		       fix issues related to NEON context saving. The assembly
 *		       routines for IRQ and FIQ handling are modified.
 *		       Deprecated the older BSP (3.10a).
 * 3.11a asa  09/22/13 Fix for CR#732704. Cache APIs are modified to avoid
 *		       various potential issues. Made changes in the function
 *		       Xil_SetAttributes in file xil_mmu.c.
 * 3.11a asa  09/23/13 Added files xil_misc_psreset_api.c and xil_misc_psreset_api.h
 *		       in src\cortexa9 and src\microblaze folders.
 * 3.11a asa  09/28/13 Modified the cache APIs (src\cortexa9) to fix handling of
 *		       L2 cache sync operation and to fix issues around complete
 *		       L2 cache flush/invalidation by ways.
 * 3.12a asa  10/22/13 Modified the files xpseudo_asm_rvct.c and xpseudo_asm_rvct.h
 *		       to fix linking issues with armcc/DS-5. Modified the armcc
 *		       makefile to fix issues.
 * 3.12a asa  11/15/13 Fix for CR#754800. It fixes issues around profiling for MB.
 * 4.0   hk   12/13/13 Added check for STDOUT_BASEADDRESS where outbyte is used.
 * 4.0 	 pkp  22/01/14 Modified return addresses for interrupt handlers (DataAbortHandler
 *		       and SWIHandler) in asm_vector.S (src\cortexa9\gcc\ and
 *		       src\cortexa9\armcc\) to fix CR#767251
 * 4.0	 pkp  24/01/14 Modified cache APIs (Xil_DCacheInvalidateRange and
 *		       Xil_L1DCacheInvalidate) in xil_cache.c (src\cortexa9) to fix the bugs.
 *		       Few cache lines were missed to invalidate when unaligned address
 *		       invalidation was accommodated in Xil_DCacheInvalidateRange.
 *		       In Xil_L1DCacheInvalidate, while invalidating all L1D cache
 *		       stack memory (which contains return address) was invalidated. So
 *		       stack memory is flushed first and then L1D cache is invalidated.
 *		       This is done to fix CR #763829
 * 4.0 adk   22/02/2014 Fixed the CR:775379 removed unnecessay _t(unit32_t etc) from
 *			mblaze_nt_types.h file and replace uint32_t with u32 in the
 *			profile_hist.c to fix the above CR.
 * 4.1 bss   04/14/14  Updated driver tcl to remove _interrupt_handler.o from libgloss.a
 * 		       instead of libxil.a and added prototypes for
 *		       microblaze_invalidate_cache_ext and microblaze_flush_cache_ext in
 *		       mb_interface.h
 * 4.1 hk    04/18/14  Add sleep function.
 * 4.1 asa   04/21/14  Fix for CR#764881. Added support for msrset and msrclr. Renamed
 *		       some of the *.s files inMB BSP source to *.S.
 * 4.1 asa   04/28/14  Fix for CR#772280. Made changes in file cortexa9/gcc/read.c.
 * 4.1 bss   04/29/14  Modified driver tcl to use libxil.a if libgloss.a does not exist
 *			CR#794205
 * 4.1 asa   05/09/14  Fix for CR#798230. Made changes in cortexa9/xil_cache.c and
 *		       common/xil_testcache.c
 *	               Fix for CR#764881.
 * 4.1 srt   06/27/14  Remove '#undef DEBUG' from src/common/xdebug.h, which allows to
 *                     output the DEBUG logs when -DDEBUG flag is enabled in BSP.
 * 4.2 pkp   06/27/14  Added support for IAR compiler in src/cortexa9/iccarm.
 *		       Also added explanatory notes in cortexa9/xil_cache.c for CR#785243.
 * 4.2 pkp   06/19/14  Asynchronous abort has been enabled into cortexa9/gcc/boot.s and
 *		       cortexa9/armcc/boot.s. Added default exception handlers for data
 *		       abort and prefetch abort using handlers called
 *		       DataAbortHandler and PrefetchAbortHandler respectively in
 *		       cortexa9/xil_exception.c to fix CR#802862.
 * 4.2 pkp   06/30/14  MakeFile for cortexa9/armcc has been changed to fixes the
 *		       issue of improper linking of translation_table.s
 * 4.2 pkp   07/04/14  added weak attribute for the function in BSP which are also present
 *		       in tool chain to avoid conflicts into some special cases
 * 4.2 pkp   07/21/14  Corrected reset value of event counter in function
 *		       Xpm_ResetEventCounters in src/cortexa9/xpm_counter.c to fix CR#796275
 * 4.2 pkp   07/21/14  Included xil_types.h file in xil_mmu.h which had contained a function
 * 		       containing type def u32 defined in xil_types.g to resolve issue of
 *		       CR#805869
 * 4.2 pkp   08/04/14  Removed unimplemented nanosleep routine from cortexa9/usleep.c as
 *		       it is not possible to generate timer in nanosecond due to limited
 *		       cpu frequency
 * 4.2 pkp   08/04/14  Removed PEEP board related code which contained initialization of
 *		       uart, smc nor and sram from cortexa9/gcc/xil-crt0.s and armcc/boot.s
 *		       and iccarm/boot.s. Also uart.c and smc.c have been removed. Also
 *		       removed function definition of XSmc_NorInit and XSmc_NorInit from
 *		       cortexa9/smc.h
 * 4.2 bss   08/11/14  Added microblaze_flush_cache_ext_range and microblaze_invalidate_
 *		       cache_ext_range declarations in mb_interface.h CR#783821.
 *		       Modified profile_mcount_mb.S to fix CR#808412.
 * 4.2 pkp   08/21/14  modified makefile of iccarm for proper linking of objectfiles in
 *		       cortexa9/iccarm to fix CR#816701
 * 4.2 pkp   09/02/14  modified translation table entries in cortexa9/gcc/translation_table.s,
 *		       armcc/translation_table.s and iccarm/translation_table.s
 *		       to properly defined reserved entries according to address map for
 *		       fixing CR#820146
 * 4.2 pkp   09/11/14  modified translation table entries in cortexa9/iccarm/translation_table.s
 *		       and  cortexa9/armcc/translation_table.s to resolve compilation
 *		       error for solving CR#822897
 * 5.0 kvn   12/9/14   Support for Zync Ultrascale Mp.Also modified code for
 *                     MISRA-C:2012 compliance.
 * 5.0 pkp   12/15/14  Added APIs to get information about the platforms running the code by
 *		       adding src/common/xplatform_info.*s
 * 5.0 pkp   16/12/14  Modified boot code to enable scu after MMU is enabled and
 *		       removed incorrect initialization of TLB lockdown register to fix
 *		       CR#830580 in cortexa9/gcc/boot.S & cpu_init.S, armcc/boot.S
 *		       and iccarm/boot.s
 * 5.0 pkp   25/02/15  Modified floating point flag to vfpv3 from vfpv3_d16 in BSP MakeFile
 *		       for iccarm and armcc compiler of cortexA9
 * 5.1 pkp   05/13/15  Changed the initialization order in cortexa9/gcc/boot.S, iccarm/boot.s
 *		       and armcc/boot.s so to first invalidate caches and TLB, enable MMU and
 *		       caches, then enable SMP bit in ACTLR. L2Cache invalidation and enabling
 *		       of L2Cache is done later.
 * 5.1 pkp   12/05/15  Modified cortexa9/xil_cache.c to modify Xil_DCacheInvalidateRange and
 *		       Xil_DCacheFlushRange to remove unnecessary dsb which is unnecessarily
 *		       taking long time to fix CR#853097. L2CacheSync is added into
 *		       Xil_L2CacheInvalidateRange API. Xil_L1DCacheInvalidate and
 *		       Xil_L2CacheInvalidate APIs are modified to flush the complete stack
 *		       instead of just System Stack
 * 5.1 pkp   14/05/15  Modified cortexa9/gcc/Makefile to keep a correct check of a compiler
 *		       to update ECC_FLAGS and also take the compiler and archiver as specified
 *		       in settings instead of hardcoding it.
 * 5.2 pkp   06/08/15  Modified cortexa9/gcc/translation_table.S to put a check for
 *		       XPAR_PS7_DDR_0_S_AXI_BASEADDR to confirm if DDR is present or not and
 *		       accordingly generate the	translation table
 * 5.2 pkp   23/07/15  Modified cortexa9/gcc/Makefile to keep a correct check of a compiler
 *		       to update ECC_FLAGS to fix a bug introduced during new version creation
 *		       of BSP.
 * 5.3 pkp   10/07/15  Modified cortexa9/xil_cache.c file to change cache API so that L2 Cache
 *		       functionalities are avoided for the OpenAMP slave application(when
 *		       USE_AMP flag is defined for BSP) as master CPU would be utilizing L2
 *		       cache for its operation. Also file operations such as read, write,
 *		       close, open are also avoided for OpenAMP support(when USE_AMP flag is
 *		       defined for BSP) because XilOpenAMP library contains own file operation.
 *		       The xil-crt0.S file is modified for not initializing global timer for
 *		       OpenAMP application as it might be already in use by master CPU
 * 5.3 pkp   10/09/15  Modified cortexa9/iccarm/xpseudo_asm_iccarm.h file to change function
 *		       definition for dsb, isb and dmb to fix the compilation error when used
 *     kvn   16/10/15  Encapsulated assembly code into macros for R5 xil_cache file.
 * 5.4 pkp   09/11/15  Modified cortexr5/gcc/boot.S to disable ACTLR.DBWR bit to avoid potential
 *		       R5 deadlock for errata 780125
 * 5.4 pkp   09/11/15  Modified cortexa53/32bit/gcc/boot.S to enable I-Cache and D-Cache for a53
 *		       32 bit BSP in the initialization
 * 5.4 pkp   09/11/15  Modified cortexa9/xil_misc_psreset_api.c file to change the description
 *		       for XOcm_Remap function
 * 5.4 pkp   16/11/15  Modified microblaze/xil_misc_psreset_api.c file to change the description
 *		       for XOcm_Remap function
 *     kvn   21/11/15  Added volatile keyword for ADDR varibles in Xil_Out API
 *     kvn   21/11/15  Changed ADDR variable type from u32 to UINTPTR. This is
 *                     required for MISRA-C:2012 Compliance.
 * 5.4 pkp   23/11/15  Added attribute definitions for Xil_SetTlbAttributes API of Cortex-A9
 *		       in cortexa9/xil_mmu.h
 * 5.4 pkp   23/11/15  Added default undefined exception handler for Cortex-A9
 * 5.4 pkp   11/12/15  Modified common/xplatform_info.h to add #defines for silicon for
 *		       checking the current executing platform
 * 5.4 pkp   18/12/15  Modified cortexa53/32bit/gcc/xil-crt0.S and 64bit/gcc/xil-crt0.S
 *		       to initialize global constructor for C++ applications
 * 5.4 pkp   18/12/15  Modified cortexr5/gcc/xil-crt0.S to initialize global constructor for
 *		       C++ applications
 * 5.4 pkp   18/12/15  Modified cortexa53/32bit/gcc/translation_table.S and 64bit/gcc/
 *		       translation_table.S to update the translation table according to proper
 *		       address map
 * 5.4 pkp   18/12/15  Modified cortexar5/mpu.c to initialize the MPU according to proper
 *		       address map
 * 5.4	pkp  05/01/16  Modified cortexa53/64bit/boot.S to set the reset vector register RVBAR
 *		       equivalent to vector table base address
 * 5.4 pkp   08/01/16  Modified cortexa9/gcc/Makefile to update the extra compiler flag
 *		       as per the toolchain update
 * 5.4 pkp   12/01/16  Changed common/xplatform_info.* to add platform information support
 *		       for Cortex-A53 32bit mode
 * 5.4 pkp   28/01/16  Modified cortexa53/32bit/sleep.c and usleep.c & cortexa53/64bit/sleep.c
 *		       and usleep.c to correct routines to avoid hardcoding the timer frequency,
 *		       instead take it from xparameters.h to properly configure the timestamp
 *		       clock frequency
 * 5.4 asa   29/01/16  Modified microblaze/mb_interface.h to add macros that support the
 *		       new instructions for MB address extension feature
 * 5.4 kvn   30/01/16  Modified xparameters_ps.h file to add interrupt ID number for
 *		       system monitor.
 * 5.4 pkp   04/02/16  Modified cortexr5/gcc/boot.S to enable fault log for lock-step mode
 * 5.4 pkp   19/02/16  Modified cortexr5/xtime_l.c to add an API XTime_StartTimer and updated
 *		       cortexr5/xil-crt0.S to configure the TTC3 timer when present. Modified
 *		       cortexr5/sleep.c, cortexr5/usleep.c to use TTC3 when present otherwise
 *		       use set of assembly instructions to provide required delay to fix
 *		       CR#913249.
 * 5.4 asa   25/02/16  Made changes in xil-crt0.S for R5, A53 64 and 32 bit BSPs, to replace
 *		       _exit with exit. We should not be directly calling _exit and should
 *		       always use the library exit. This fixes the CR#937036.
 * 5.4 pkp   25/02/16  Made change to cortexr5/gcc/boot.S to initialize the floating point
 *		       registers, banked registers for various modes and enabled
 *		       the cache ECC check before enabling the fault log for lock step mode
 *		       Also modified the cortexr5/gcc/Makefile to support floating point
 *		       registers initialization in boot code.
 * 5.4 pkp   03/01/16  Updated the exit function in cortexr5/gcc/_exit.c to enable the debug
 *		       logic in case of lock-step mode when fault log is enabled to fix
 *		       CR#938281
 * 5.4 pkp   03/02/16  Modified cortexa9/iccarm/xpseudo_asm_iccarm.h file to include
 *		       header file instrinsics.h which contains assembly instructions
 *		       definitions which can be used by C
 * 5.4 asa   03/02/16  Added print.c in MB BSP. Made other cosmetic changes to have uniform
 *                     proto for all print.c across the BSPs. This patch fixes CR#938738.
 * 5.4 pkp   03/09/16  Modified cortexr5/sleep.c and usleep.c to avoid disabling the
 *		       interrupts when sleep/usleep is being executed using assembly
 *		       instructions to fix CR#913249.
 * 5.4 pkp   03/11/16  Modified cortexr5/xtime_l.c to avoid enabling overflow interrupt,
 *		       instead modified cortexr5/sleep.c and usleep.c to poll the counter
 *		       value and compare it with previous value to detect the overflow
 *		       to fix CR#940209.
 * 5.4 pkp   03/24/16  Modified cortexr5/boot.S to reset the dbg_lpd_reset before enabling
 *		       the fault log to avoid intervention for lock-step mode and cortexr5/
 *		       _exit.c to enable the dbg_lpd_reset once the fault log is disabled
 *		       to fix CR#947335
 * 5.5 pkp   04/11/16  Modified cortexr5/boot.S to enable comparators for non-JTAG bootmode
 *		       in lock-step to avoid resetting the debug logic which restricts the
 *		       access for debugger and removed enabling back of debug modules in
 *		       cortexr5/_exit.c
 * 5.5 pkp   04/13/16  Modified cortexa9/gcc/read.c to return correct number of bytes when
 *		       read buffer is filled and removed the redundant NULL checking for
 *		       buffer to simplify the code
 * 5.5 pkp   04/13/16  Modified cortexa53/64bit/gcc/read.c and cortexa53/32bit/gcc/read.c
 *		       to return correct number of bytes when read buffer is filled and
 *		       removed the redundant NULL checking for buffer to simplify the code
 * 5.5 pkp   04/13/16  Modified cortexr5/gcc/read.c to return correct number of bytes when
 *		       read buffer is filled and removed the redundant NULL checking for
 *		       buffer to simplify the code
 * 5.5 pkp   04/13/16  Modified cortexa53/64bit/xpseudo_asm_gcc.h to add volatile to asm
 *		       instruction macros to disable certain optimizations which may move
 *		       code out of loops if optimizers believe that the code will always
 *		       return the same result or discard asm statements if optimizers
 *		       determine there is no need for the output variables
 * 5.5 pkp   04/13/16  Modified cortexa53/64bit/xtime_l.c to add XTime_StartTimer which
 *		       starts the timer if it is disabled and modified XTime_GetTime to
 *		       enable the timer if it is not enabled. Also modified cortexa53/64bit/
 *		       sleep.c and cortexa53/64bit/usleep.c to enable the timer if it is
 *		       disabled and read the counter value directly from register instead
 *		       of using XTime_GetTime for optimization
 * 5.5 pkp   04/13/16  Modified cortexa53/32bit/xtime_l.c to add XTime_StartTimer which
 *		       starts the timer if it is disabled and modified XTime_GetTime to
 *		       enable the timer if it is not enabled. Also modified cortexa53/32bit/
 *		       sleep.c and cortexa53/32bit/usleep.c to enable the timer if it is
 *		       disabled and read the counter value directly from register instead
 *		       of using XTime_GetTime for optimization
 * 5.5 pkp   04/13/16  Modified cortexa53/32bit/xil_cache.c and cortexa53/64bit/xil_cache.c
 *		       to update the Xil_DCacheInvalidate, Xil_DCacheInvalidateLine and
 * 		       Xil_DCacheInvalidateRange functions description for proper
 *		       explaination to fix CR#949801
 * 5.5 asa   04/20/16  Added missing macros for hibernate and suspend in Microblaze BSP
 *                     file mb_interface.h. This fixes the CR#949503.
 * 5.5 asa   04/29/16  Fix for CR#951080. Updated cache APIs for HW designs where cache
 *                     memory is not included for MicroBlaze.
 * 5.5 pkp   05/06/16  Modified the cortexa9/xil_exception.h to update the macros
 *		       Xil_EnableNestedInterrupts and Xil_DisableNestedInterrupts for fixing
 *		       the issue of lr being corrupted to resolve CR#950468
 * 5.5 pkp   05/06/16  Modified the cortexr5/xil_exception.h to update the macros
 *		       Xil_EnableNestedInterrupts and Xil_DisableNestedInterrupts for fixing
 *		       the issue of lr being corrupted to resolve CR#950468
 * 6.0 kvn   05/31/16  Make Xil_AsserWait a global variable
 * 6.0 pkp   06/27/16  Updated cortexr5/mpu.c to move the code related to Init_MPU to .boot
 *		       section since it is part of boot process to fix CR#949555
 *     hk    07/12/16  Correct masks for IOU SLCR GEM registers
 * 6.0 pkp   07/25/16  Program the counter frequency in boot code for CortexA53
 * 6.0 asa   08/03/16  Updated sleep_common function in microblaze_sleep.c to improve the
 *                     the accuracy of MB sleep functionality. This fixes the CR#954191.
 * 6.0 mus   08/03/16  Restructured the BSP to avoid code duplication across all BSPs.
 *                     Source code directories specific to ARM processor's are moved to src/arm
 *                     directory(i.e. src/cortexa53,src/cortexa9 and src/cortexr5 moved to src/arm/cortexa53,
 *                     src/arm/cortexa9 and src/arm/cortexr5 respectively).Files xil_printf.c,xil_printf.h,
 *                     print.c,xil_io.c and xil_io.h are consolidated across all BSPs into common file each and
 *                     consolidated files are kept at src/common directory.Files putnum.c,vectors.c,vectors.h,
 *                     xil_exception.c and xil_exception.h are consolidated across all ARM BSPs
 *                     into common file each and consolidated files are kept at src/arm/common directory.
 *                     GCC source files related to file  operations are consolidated and kept
 *                     at src/arm/common/gcc directory.
 *                     All io interfacing functions (i.e. All variants of xil_out, xil_in )
 *                     are made as static inline and implementation is kept in consolidated common/xil_io.h,
 *                     xil_io.h must be included as a header file to access io interfacing functions.
 *                     Added undefined exception handler for A53 32 bit and R5 processor
 * 6.0 mus   08/11/16  Updated xtime_l.c in R5 BSP to remove implementation of XTime_SetTime API, since
 *                     TTC counter value register is read only.
 * 6.0 asa   08/15/16  Modified the signatures for functions sleep and usleep. This fixes
 *                     the CR#956899.
 * 6.0 mus   08/18/16  Defined ARMA53_32 flag in cortexa53/32bit/xparameters_ps.h and ARMR5 flag
 *                     in cortexr5/xparameters_ps.h
 * 6.0 mus   08/18/16  Added support for the the Zynq 7000s devices
 * 6.0 mus   08/18/16  Removed unused variables from xil_printf.c and xplatform_info.c
 * 6.0 mus   08/19/16  Modified xil_io.h to remove __LITTLE_ENDIAN__ flag check for all ARM processors
 * 6.1 mus   11/03/16  Added APIs handle_stdin_parameter and handle_stdout_parameter in standalone tcl.
 *                     ::hsi::utils::handle_stdin and ::hsi::utils::handle_stdout are taken as a base for
 *                     these APIs and modifications are done on top of it to handle stdout/stdin
 *                     parameters for design which doesnt have UART.It fixes CR#953681
 * 6.1 nsk   11/07/16  Added two new files xil_mem.c and xil_mem.h for xil_memcpy
 * 6.2 pkp   12/14/16  Updated cortexa53/64bit/translation_table.S for upper ps DDR. The 0x800000000 -
 *		       0xFFFFFFFFF range is marked normal memory for the DDR size defined in hdf
 *		       and rest of the memory in that 32GB region is marked as reserved to avoid
 *		       any speculative access
 * 6.2 pkp   12/23/16  Added support for floating point operation to Cortex-A53 64bit mode. It modified
 *		       asm_vectors.S to implement lazy floating point context saving i.e. floating point
 *		       access is enabled if there is any floating point operation, it is disabled by
 *		       default. Also FPU is initally disabled for IRQ and none of the floating point
 *		       registers are saved during normal context saving. If IRQ handler does not require
 *		       floating point operation, the floating point registers are untouched and no need
 *		       for saving/restoring. If IRQ handler uses any floating point operation, then floating
 *		       point registers are saved and FPU is enabled for IRQ handler. Then floating point
 *		       registers are restored back after servicing IRQ during normal context restoring.
 * 6.2 mus   01/01/17  Updated makefiles of R5 and a53 64 bit/32 bit processors to fix error in clean
 *                     target.It fixes the CR#966900
 * 6.2 pkp   01/22/17  Added support for EL1 non-secure execution and Hypervisor Baremetal for Cortex-A53
 *		       64bit Mode. If Hypervisor_guest is selected as true in BSP settings, BSP will be built
 *		       for EL1 Non-secure, else BSP will be built for EL3. By default hypervisor_guest is
 *		       as false i.e. default bsp is EL3.
 * 6.2 pkp   01/24/17  Updated cortexa53/64bit/boot.S to clear FPUStatus variable to make sure that it
 *		       contains initial status of FPU i.e. disabled. In case of a warm restart execution
 *		       when bss sections are not cleared, it may contain previously updated value which
 *		       does not hold true once processor resumes. This fixes CR#966826.
 * 6.2 asa   01/31/17  The existing Xil_DCacheDisable API first flushes the
 *		       D caches and then disables it. The problem with that is,
 *		       potentially there will be a small window after the cache
 *		       flush operation and before the we disable D caches where
 *		       we might have valid data in cache lines. In such a
 *		       scenario disabling the D cache can lead to unknown behavior.
 *		       The ideal solution to this is to use assembly code for
 *		       the complete API and avoid any memory accesses. But with
 *		       that we will end up having a huge amount on assembly code
 *		       which is not maintainable. Changes are done to use a mix
 *		       of assembly and C code. All local variables are put in
 *		       registers. Also function calls are avoided in the API to
 *		       avoid using stack memory.
 * 6.2 mus   02/13/17 A53 CPU cache system can pre-fetch catch lines.So there are
 *                    scenarios when an invalidated cache line can get pre fetched to cache.
 *                    If that happens, the coherency between cache and memory is lost
 *                    resulting in lost data. To avoid this kind of issue either
 *                    user has to use dsb() or disable pre-fetching for L1 cache
 *                    or else reduce maximum number of outstanding data prefetches allowed.
 *                    Using dsb() while comparing data costing more performance compared to
 *                    disabling pre-fetching/reducing maximum number of outstanding data
 *                    prefetches for L1 Cache.The new api Xil_ConfigureL1Prefetch is added
 *                    to disable pre-fetching/configure maximum number of outstanding data
 *                    prefetches allowed in L1 cache system.This fixes CR#967864.
 * 6.2 pkp   02/16/17 Added xil_smc.c file to provide a C wrapper for smc calling which can be
 *		      used by cortex-A53 64bit EL1 Non-secure application.
 * 6.2 kvn   03/03/17 Added support thumb mode
 * 6.2 mus   03/13/17 Fixed MISRA C mandatory standard violations in ARM cortexr5 and cortexa53 BSP.
 *                    It fixes CR#970543
 * 6.2 asa   03/16/17 Fix for CR#970859. For Mcroblaze BSP, when we enable intrusive
 *                    profiling we see a crash. That is because the the tcl uses invalid
 *                    HSI command. This change fixes it.
 * 6.2 mus   03/22/17 Updated standalone tcl to generate xparameter XPAR_FPD_IS_CACHE_COHERENT, if
 *                    any FPD peripheral is configured to use CCI.It fixes CR#972638
 * 6.3 mus   03/20/17 Updated cortex-r5 BSP, to add hard floating point support.
 * 6.3 mus   04/17/17 Updated Cortex-a53 32 bit BSP boot code to fix bug in
 *                    the HW coherency enablement. It fixes the CR#973287
 * 6.3 mus   04/20/17 Updated Cortex-A53 64 bit BSP boot code, to remove redundant write to the
 *                    L2CTLR_EL1 register. It fixes the CR#974698
 * 6.4 mus   06/08/17 Updated arm/common/xil_exception.c to fix warnings in C level exception handlers
 *                    of ARM 32 bit processor's.
 * 6.4 mus   06/14/17 Updated cortexa53/64bit/gcc/asm_vectors.S to fix bug in  IRQInterruptHandler code
 *                    snippet, which checks for the FPEN bit of CPACR_EL1 register.
 * 6.4 ms    05/23/17 Added PSU_PMU macro in xplatform_info.c, xparameters.h to support
 *                    XGetPSVersion_Info function for PMUFW.
 *     ms    06/13/17 Added PSU_PMU macro in xplatform_info.c to support XGetPlatform_Info
 *                    function for PMUFW.
 * 6.4 mus   07/05/17 Updated Xil_In32BE function in xil_io.h to fix bug.It fixes CR#979740.
 * 6.4 mus   07/25/17 Updated a53 32 bit boot code and vectors to support hard floating point
 *                    operations.Now,VFP is being enabled in FPEXC register, through boot code
 *                    and FPU registers are being saved/restored when irq/fiq vector is invoked.
 * 6.4 adk   08/01/17 Updated standalone tcl to generate xparameter XPAR_PL_IS_CACHE_COHERENT,
 * 		      if h/w design configured with HPC port.
 * 6.4 mus   08/10/17 Updated a53 64 bit translation table to mark  memory as a outer shareable for
 *                    EL1 NS execution. This change has been done to support CCI enabled IP's.
 * 6.4 mus   08/11/17 Updated a53 64 bit boot code to implement ARM erratum 855873.This fixes
 *                    CR#982209.
 * 6.4 asa   08/16/17 Made several changes in the R5 MPU handling logic. Added new APIs to
 *                    make RPU MPU handling user-friendly. This also fixes the CR-981028.
 * 6.4 mus   08/17/17 Updated XGet_Zynq_UltraMp_Platform_info and XGetPSVersion_Info APIs to read
 *                    version register through SMC call, over EL1 NS mode. This change has been done to
 *                    support these APIs over EL1 NS mode.
 * 6.5 mus   10/20/17 Updated standalone.tcl to fix bug in mb_can_handle_exceptions_in_delay_slots proc,
 *                    it fixes CR#987464.
 * 6.6 mus   12/07/17 Updated cortexa9/xil_errata.h and cortexa9/xil_cache.c to remove Errata 753970.
 *                    It fixes CR#989132.
 *     srm   10/18/17 Updated all the sleep routines in a9,a53,R5,microblaze. Now the sleep routines
 *		      will use the timer specified by the user to provide delay. A9 and A53 can use
 *                    Global timer or TTC. R5 can use TTC or the machine cycles. Microblaze can use
 *                    machine cycles or Axi timer. Updated standalone.tcl and standalone.mld files
 *		      to support the sleep configuration Added new API's for the Axi timer in
 *		      microblaze and TTC in ARM. Added two new files, xil_sleeptimer.c and
 *		      xil_sleeptimer.h in ARM for the common sleep routines and 1 new file,
 *		      xil_sleepcommon.c in Standalone-common for sleep/usleep API's.
 * 6.6 hk    12/15/17 Export platform macros to bspconfig.h based on the processor.
 * 6.6 asa   1/16/18  Ensure C stack information for A9 are flushed out from L1 D cache
 *                    or L2 cache only when the respective caches are enabled. This fixes CR-922023.
 * 6.6 mus   01/19/18 Updated asm_vectors.S and boot.S in Cortexa53 64 bit BSP, to add isb
 *                    after writing to cpacr_el1/cptr_el3 registers. It would ensure
 *                    disabling/enabling of floating-point unit, before any subsequent
 *                    instruction.
 * 6.6 mus   01/30/18 Updated hypervisor enabled Cortexa53 64 bit BSP, to add xen PV console
 *                    support. Now, xil_printf would use PV console instead of UART in case of
 *                    hypervisor enabled BSP.
 * 6.6 mus   02/02/18 Updated get_connected_if proc in standalone tcl to detect the HPC port 
 *                    configured with smart interconnect.It fixes CR#990318.
 * 6.6 srm   02/10/18 Updated csu_wdt interrupt to the correct value. Fixes CR#992229
 * 6.6 asa   02/12/18 Fix for heap handling for ARM platforms. CR#993932.
 * 6.6 mus   02/19/18 Updated standalone.tcl to fix bug in handle_profile_opbtimer proc,
 *                    CR#995014.
 * 6.6 mus   02/23/18 Presently Cortex R5 BSP boot code is disabling the debug logic in
*		      non-JTAG boot mode, when processor is in lockstep configuration.
*		      This behavior is restricting application debugging in non-JTAG boot
*		      mode.  To get rid of this restriction, added new mld parameter 
*		      "lockstep_mode_debug", to enable/disable debug logic from BSP 
*		      settings. Now, debug logic can be enabled through BSP settings, 
*		      by modifying value of parameter "lockstep_mode_debug" as "true".
*		      It fixes CR#993896.
 * 6.6.mus   02/27/18  Updated Xil_DCacheInvalidateRange and
*		       Xil_ICacheInvalidateRange APIs in Cortexa53 64 bit BSP, to fix  bug
*		       in handling upper DDR addresses.It fixes CR#995581.
* 6.6 mus    03/12/18  Updated makefile of Cortexa53 32bit BSP to add includes_ps directory
*		       in the list of include paths. This change allows applications/BSP
*		       files to include .h files in include_ps directory.
* 6.6 mus    03/16/18  By default CPUACTLR_EL1 is accessible only from EL3, it
*		       results into abort if accessed from EL1 non secure privilege
*		       level. Updated Xil_ConfigureL1Prefetch function in Cortexa53 64 bit BSP
*		       to avoid CPUACTLR_EL1 access from privile levels other than EL3.
* 6.6 mus    03/16/18  Updated hypervisor enabled BSP to use PV console, based on the
*		       XEN_USE_PV_CONSOLE flag. By deafault hypervisor enabled BSP would
*		       use UART console, PV console can be enabled by appending
		       "-DXEN_USE_PV_CONSOLE" to the BSP extra compiler flags.
 *
 *****************************************************************************************/
