/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Minimal LoongArch system boot code.
 *
 * Copyright (c) 2021 Loongson Technology Corporation Limited
 */

#include "regdef.h"

	.global _start
	.align 16
_start:
	la.local t0, stack_end
	move sp, t0
	bl main

	.type _start 2
	.size _start, .-_start

	.global _exit
	.align 16
_exit:
2:      /* QEMU ACPI poweroff */
	li.w  t0, 0xff
	li.w  t1, 0x10080010
	st.w  t0, t1, 0
	idle  0
	bl    2b

	.type _exit 2
	.size _exit, .-_exit

	.global __sys_outc
__sys_outc:
	li.d t1, 1000000
loop:
	lu12i.w	t2, 0x1fe00
	ori	t0, t2, 0x1e5
	ld.bu	t0, t0, 0
	andi	t0, t0, 0x20
	ext.w.b	t0, t0
	bnez	t0, in
	addi.w	t1, t1, -1
	bnez	t1, loop
in:
	ext.w.b	a0, a0
	lu12i.w	t0, 0x1fe00
	ori	t0, t0, 0x1e0
	st.b	a0, t0, 0
	jirl	$r0, ra, 0

	.data
	.align 4
stack:
	.space	65536
stack_end:
