/*
 * Copyright (c) 2020, Shenzhen Academy of Aerospace Technology
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-10-16     Dystopia     the first version
 */

#define SPARC_PSR_PIL_MASK 0x00000F00
#define SPARC_PSR_ET_MASK 0x00000020

/*
 * rt_base_t rt_hw_interrupt_disable();
 */
.globl rt_hw_interrupt_disable
rt_hw_interrupt_disable:
	mov %psr, %o0
	or %o0, SPARC_PSR_PIL_MASK, %o1
	mov %o1, %psr
	nop
	nop
	nop
	retl
	nop

/*
 * void rt_hw_interrupt_enable(rt_base_t level);
 */
.globl rt_hw_interrupt_enable
rt_hw_interrupt_enable:
	mov %o0, %psr
	nop
	nop
	nop
	retl
	nop

/*
 * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
 * o0 --> from
 * o1 --> to
 */
.globl rt_hw_context_switch
rt_hw_context_switch:
	ta 2
	retl
	nop
	
/*
 * void rt_hw_context_switch_to(rt_uint32 to);
 * o0 --> to
 */
.globl rt_hw_context_switch_to
rt_hw_context_switch_to:
	mov %o0, %o1
	ta 3
	retl
	nop
	
/*
 * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
 */
.globl rt_thread_switch_interrupt_flag
.globl rt_interrupt_from_thread
.globl rt_interrupt_to_thread
.globl rt_hw_context_switch_interrupt
rt_hw_context_switch_interrupt:
	set rt_thread_switch_interrupt_flag, %o2
	ld [%o2], %o3
	cmp %o3, 1
	be _reswitch
	nop
	mov 1, %o3
	st %o3, [%o2]
	set rt_interrupt_from_thread, %o2
	st %o0, [%o2]
_reswitch:
	set rt_interrupt_to_thread, %o2
	st %o1, [%o2]
	retl
	nop