1129198Scognet/* $NetBSD: cpu.h,v 1.2 2001/02/23 21:23:52 reinoud Exp $ */
2129198Scognet/* $FreeBSD$ */
3129198Scognet
4129198Scognet#ifndef MACHINE_CPU_H
5129198Scognet#define MACHINE_CPU_H
6129198Scognet
7278684Sian#include <machine/acle-compat.h>
8129198Scognet#include <machine/armreg.h>
9259329Sian#include <machine/frame.h>
10129198Scognet
11236524Simpvoid	cpu_halt(void);
12236524Simpvoid	swi_vm(void *);
13129198Scognet
14253750Savg#ifdef _KERNEL
15278684Sian#if __ARM_ARCH >= 6
16278684Sian#include <machine/cpu-v6.h>
17278684Sian#endif
18129198Scognetstatic __inline uint64_t
19129198Scognetget_cyclecount(void)
20129198Scognet{
21278684Sian#if __ARM_ARCH >= 6
22278684Sian	return cp15_pmccntr_get();
23278680Sian#else /* No performance counters, so use binuptime(9). This is slooooow */
24137223Scognet	struct bintime bt;
25137223Scognet
26137223Scognet	binuptime(&bt);
27219653Sjkim	return ((uint64_t)bt.sec << 56 | bt.frac >> 8);
28278680Sian#endif
29129198Scognet}
30253750Savg#endif
31129198Scognet
32129198Scognet#define TRAPF_USERMODE(frame)	((frame->tf_spsr & PSR_MODE) == PSR_USR32_MODE)
33129198Scognet
34129198Scognet#define TRAPF_PC(tfp)		((tfp)->tf_pc)
35129198Scognet
36236524Simp#define cpu_getstack(td)	((td)->td_frame->tf_usr_sp)
37236524Simp#define cpu_setstack(td, sp)	((td)->td_frame->tf_usr_sp = (sp))
38133084Smux#define cpu_spinwait()		/* nothing */
39129198Scognet
40129198Scognet#define ARM_NVEC		8
41129198Scognet#define ARM_VEC_ALL		0xffffffff
42129198Scognet
43129198Scognetextern vm_offset_t vector_page;
44129198Scognet
45266194Sian/*
46266194Sian * Params passed into initarm. If you change the size of this you will
47266194Sian * need to update locore.S to allocate more memory on the stack before
48266194Sian * it calls initarm.
49266194Sian */
50236524Simpstruct arm_boot_params {
51236524Simp	register_t	abp_size;	/* Size of this structure */
52236524Simp	register_t	abp_r0;		/* r0 from the boot loader */
53236524Simp	register_t	abp_r1;		/* r1 from the boot loader */
54236524Simp	register_t	abp_r2;		/* r2 from the boot loader */
55236524Simp	register_t	abp_r3;		/* r3 from the boot loader */
56266160Sian	vm_offset_t	abp_physaddr;	/* The kernel physical address */
57266194Sian	vm_offset_t	abp_pagetable;	/* The early page table */
58236524Simp};
59236524Simp
60141094Snjlvoid	arm_vector_init(vm_offset_t, int);
61141094Snjlvoid	fork_trampoline(void);
62141094Snjlvoid	identify_arm_cpu(void);
63236524Simpvoid	*initarm(struct arm_boot_params *);
64129198Scognet
65129198Scognetextern char btext[];
66129198Scognetextern char etext[];
67236524Simpint badaddr_read(void *, size_t, void *);
68129198Scognet#endif /* !MACHINE_CPU_H */
69