Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #include <asm/core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #include <asm/regs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include <asm/asmmacro.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include <asm/cacheasm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 	 * RB-Data: RedBoot data/bss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 	 * P:	    Boot-Parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 	 * L:	    Kernel-Loader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 	 * The Linux-Kernel image including the loader must be loaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 	 * to a position so that the kernel and the boot parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 	 * can fit in the space before the load address.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 	 *  ______________________________________________________
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	 * |_RB-Data_|_P_|__________|_L_|___Linux-Kernel___|______|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 	 *                          ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) 	 *                          ^ Load address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	 *  ______________________________________________________
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	 * |___Linux-Kernel___|_P_|_L_|___________________________|
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	 * The loader copies the parameter to the position that will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	 * be the end of the kernel and itself to the end of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	 * parameter list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) /* Make sure we have enough space for the 'uncompressor' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define STACK_SIZE 32768
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define HEAP_SIZE (131072*4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	# a2: Parameter list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	# a3: Size of parameter list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	.section .start, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	.globl __start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	/* this must be the first byte of the loader! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) __start:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	entry	sp, 32		# we do not intend to return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	_call0	_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) __start_a0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	.align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	.section .text, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	.literal_position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	.begin literal_prefix .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	/* put literals in here! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	.globl _start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) _start:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	/* 'reset' window registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	movi	a4, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	wsr	a4, ps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	rsync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	rsr	a5, windowbase
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	ssl	a5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	sll	a4, a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	wsr	a4, windowstart
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	rsync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	movi	a4, 0x00040000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	wsr	a4, ps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	rsync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	/* copy the loader to its address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	 * Note: The loader itself is a very small piece, so we assume we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	 *       don't partially overlap. We also assume (even more important)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	 *	 that the kernel image is out of the way. Usually, when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	 *	 load address of this image is not at an arbitrary address,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	 *	 but aligned to some 10K's we shouldn't overlap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	/* Note: The assembler cannot relax "addi a0, a0, ..." to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	   l32r, so we load to a4 first. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	# addi	a4, a0, __start - __start_a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	# mov	a0, a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	movi	a4, __start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	movi	a5, __start_a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	add	a4, a0, a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	sub	a0, a4, a5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	movi	a4, __start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	movi	a5, __reloc_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	# a0: address where this code has been loaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	# a4: compiled address of __start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	# a5: compiled end address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	mov.n	a7, a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	mov.n	a8, a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	l32i	a10, a7, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	l32i	a11, a7, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	s32i	a10, a8, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	s32i	a11, a8, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	l32i	a10, a7, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	l32i	a11, a7, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	s32i	a10, a8, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	s32i	a11, a8, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	addi	a8, a8, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	addi	a7, a7, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	blt	a8, a5, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	/* We have to flush and invalidate the caches here before we jump. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #if XCHAL_DCACHE_IS_WRITEBACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	___flush_dcache_all a5 a6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	___invalidate_icache_all a5 a6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	isync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	movi	a11, _reloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	jx	a11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	.globl _reloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) _reloc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	/* RedBoot is now at the end of the memory, so we don't have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	 * to copy the parameter list. Keep the code around; in case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	 * we need it again. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	# a0: load address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	# a2: start address of parameter list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	# a3: length of parameter list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	# a4: __start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	/* copy the parameter list out of the way */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	movi	a6, _param_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	add	a3, a2, a3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	l32i	a8, a2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	s32i	a8, a6, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	addi	a2, a2, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	addi	a6, a6, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	blt	a2, a3, 2b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	/* clear BSS section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	movi	a6, __bss_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	movi	a7, __bss_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	movi.n	a5, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	s32i	a5, a6, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	addi	a6, a6, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	blt	a6, a7, 3b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	movi	a5, -16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	movi	a1, _stack + STACK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	and	a1, a1, a5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	/* Uncompress the kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	# a0: load address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	# a2: boot parameter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	# a4: __start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	movi	a3, __image_load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	sub	a4, a3, a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	add	a8, a0, a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	# a1  Stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	# a8(a4)  Load address of the image
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	movi	a6, _image_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	movi	a10, _image_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	movi	a7, 0x1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	sub	a11, a10, a6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	movi	a9, complen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	s32i	a11, a9, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	movi	a0, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	# a6 destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	# a7 maximum size of destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	# a8 source
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	# a9 ptr to length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	.extern gunzip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	movi	a4, gunzip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	beqz	a4, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	callx4	a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	j	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	# a6 destination start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	# a7 maximum size of destination
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	# a8 source start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	# a9 ptr to length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	# a10 destination end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)         l32i    a9, a8, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)         l32i    a11, a8, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)         s32i    a9, a6, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)         s32i    a11, a6, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)         l32i    a9, a8, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)         l32i    a11, a8, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)         s32i    a9, a6, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)         s32i    a11, a6, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)         addi    a6, a6, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)         addi    a8, a8, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)         blt     a6, a10, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	/* jump to the kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #if XCHAL_DCACHE_IS_WRITEBACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	___flush_dcache_all a5 a6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	___invalidate_icache_all a5 a6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	isync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	# a2  Boot parameter list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	movi	a0, _image_start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	jx	a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	.align 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	.data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	.globl avail_ram
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) avail_ram:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	.long	_heap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	.globl end_avail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) end_avail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	.long	_heap + HEAP_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	.comm _stack, STACK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	.comm _heap, HEAP_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	.globl end_avail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	.comm complen, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	.end	literal_prefix