#ifndef _ARCH_CPU_H
#define _ARCH_CPU_H

#include <stdalign.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

struct arch_regs {
	/* General purpose registers. */
	uint64_t r[31];
	uint64_t pc;
	uint64_t spsr;

	struct {
		uint64_t vmpidr_el2;
		uint64_t csselr_el1;
		uint64_t sctlr_el1;
		uint64_t actlr_el1;
		uint64_t cpacr_el1;
		uint64_t ttbr0_el1;
		uint64_t ttbr1_el1;
		uint64_t tcr_el1;
		uint64_t esr_el1;
		uint64_t afsr0_el1;
		uint64_t afsr1_el1;
		uint64_t far_el1;
		uint64_t mair_el1;
		uint64_t vbar_el1;
		uint64_t contextidr_el1;
		uint64_t tpidr_el0;
		uint64_t tpidrro_el0;
		uint64_t tpidr_el1;
		uint64_t amair_el1;
		uint64_t cntkctl_el1;
		uint64_t sp_el0;
		uint64_t sp_el1;
		uint64_t par_el1;
		uint64_t hcr_el2;
	} lazy;
};

struct arch_page_table {
	alignas(4096) uint64_t first[512];
	alignas(4096) uint64_t entry0[512];
	alignas(4096) uint64_t entry1[512];
};

static inline struct cpu *cpu(void)
{
	struct cpu *p;
	__asm volatile("mrs %0, tpidr_el2" : "=r"(p));
	return p;
}

static inline void arch_irq_disable(void)
{
	__asm volatile("msr DAIFSet, #0xf");
}

static inline void arch_irq_enable(void)
{
	__asm volatile("msr DAIFClr, #0xf");
}

static inline void arch_regs_init(struct arch_regs *r, size_t pc, size_t arg,
				  bool is_primary)
{
	/* TODO: Use constant here. */
	r->spsr = 5 |	 /* M bits, set to EL1h. */
		  (0xf << 6); /* DAIF bits set; disable interrupts. */
	r->pc = pc;
	r->r[0] = arg;
	r->lazy.hcr_el2 = (1u << 31) | /* RW bit. */
			  (1u << 2) |  /* PTW, Protected Table Walk. */
			  (1u << 0);   /* VM: enable stage-2 translation. */

	if (!is_primary)
		r->lazy.hcr_el2 |= (7u << 3) | /* AMO, IMO, FMO bits. */
				   (3u << 13); /* TWI, TWE bits. */
}

static inline void arch_regs_set_retval(struct arch_regs *r, size_t v)
{
	r->r[0] = v;
}

static inline void arch_regs_set_irq(struct arch_regs *r)
{
	/* Set the VI bit. */
	r->lazy.hcr_el2 |= (1u << 7);
}

static inline void arch_regs_clear_irq(struct arch_regs *r)
{
	/* Clear the VI bit. */
	r->lazy.hcr_el2 &= ~(1u << 7);
}

/* TODO: Figure out what to do with this. */
int32_t smc(size_t arg0, size_t arg1, size_t arg2, size_t arg3);

static inline void arch_cpu_on(size_t id, void *ctx)
{
	void cpu_entry(void *ctx);
	int32_t ret;

	/*
	 * There's a race when turning a CPU on when it's in the process of
	 * turning off. We need to loop here while it is reported that the CPU
	 * is on (because it's about to turn itself off).
	 */
	do {
		/* CPU_ON */
		ret = smc(0xC4000003, id, (size_t)&cpu_entry, (size_t)ctx);
	} while (ret == -4); /* ALREADY_ON */
}

static inline void arch_cpu_off(void)
{
	/* CPU_OFF */
	smc(0xC4000002, 0, 0, 0);
}

static inline void arch_set_vm_mm(struct arch_page_table *table)
{
	__asm volatile("msr vttbr_el2, %0" : : "r"((size_t)table));
}

void arch_vptable_init(struct arch_page_table *table);

#endif /* _ARCH_CPU_H */
