/* SPDX-License-Identifier: GPL-2.0 */
/*
 * include/asm-h8300/processor.h
 *
 * Copyright (C) 2002 Yoshinori Sato
 *
 * Based on: linux/asm-m68nommu/processor.h
 *
 * Copyright (C) 1995 Hamish Macdonald
 */

#ifndef __ASM_H8300_PROCESSOR_H
#define __ASM_H8300_PROCESSOR_H

#include <linux/compiler.h>
#include <asm/ptrace.h>
#include <asm/current.h>

static inline unsigned long rdusp(void)
{
	extern unsigned int	_sw_usp;

	return _sw_usp;
}

static inline void wrusp(unsigned long usp)
{
	extern unsigned int	_sw_usp;

	_sw_usp = usp;
}

/*
 * User space process size: 3.75GB. This is hardcoded into a few places,
 * so don't change it unless you know what you are doing.
 */
#define TASK_SIZE	(0xFFFFFFFFUL)

#ifdef __KERNEL__
#define STACK_TOP	TASK_SIZE
#define STACK_TOP_MAX	STACK_TOP
#endif

/*
 * This decides where the kernel will search for a free chunk of vm
 * space during mmap's. We won't be using it
 */
#define TASK_UNMAPPED_BASE	0

struct thread_struct {
	unsigned long  ksp;		/* kernel stack pointer */
	unsigned long  usp;		/* user stack pointer */
	unsigned long  ccr;		/* saved status register */
	unsigned long  esp0;            /* points to SR of stack frame */
	struct {
		unsigned short *addr;
		unsigned short inst;
	} breakinfo;
};

#define INIT_THREAD  {						\
	.ksp  = sizeof(init_stack) + (unsigned long)init_stack, \
	.usp  = 0,						\
	.ccr  = PS_S,						\
	.esp0 = 0,						\
	.breakinfo = {						\
		.addr = (unsigned short *)-1,			\
		.inst = 0					\
	}							\
}

/*
 * Do necessary setup to start up a newly executed thread.
 *
 * pass the data segment into user programs if it exists,
 * it can't hurt anything as far as I can tell
 */
#if defined(CONFIG_CPU_H8300H)
#define start_thread(_regs, _pc, _usp)				\
do {								\
	(_regs)->pc = (_pc);					\
	(_regs)->ccr = 0x00;	   /* clear all flags */	\
	(_regs)->er5 = current->mm->start_data;	/* GOT base */	\
	(_regs)->sp = ((unsigned long)(_usp)) - sizeof(unsigned long) * 3; \
} while (0)
#endif
#if defined(CONFIG_CPU_H8S)
#define start_thread(_regs, _pc, _usp)				\
do {								\
	(_regs)->pc = (_pc);					\
	(_regs)->ccr = 0x00;	   /* clear kernel flag */	\
	(_regs)->exr = 0x78;	   /* enable all interrupts */	\
	(_regs)->er5 = current->mm->start_data;	/* GOT base */	\
	/* 14 = space for retaddr(4), vector(4), er0(4) and exr(2) on stack */ \
	(_regs)->sp = ((unsigned long)(_usp)) - 14;		\
} while (0)
#endif

/* Forward declaration, a strange C thing */
struct task_struct;

/* Free all resources held by a thread. */
static inline void release_thread(struct task_struct *dead_task)
{
}

unsigned long __get_wchan(struct task_struct *p);

#define	KSTK_EIP(tsk)	\
	({			 \
		unsigned long eip = 0;	      \
		if ((tsk)->thread.esp0 > PAGE_SIZE &&	\
		    MAP_NR((tsk)->thread.esp0) < max_mapnr)	 \
			eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \
		eip; })

#define	KSTK_ESP(tsk)	((tsk) == current ? rdusp() : (tsk)->thread.usp)

#define cpu_relax()    barrier()

#define HARD_RESET_NOW() ({		\
	local_irq_disable();		\
	asm("jmp @@0");			\
})

#endif
