^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