blob: e26ef89000a812729400db1c683e27265335fdb2 [file] [log] [blame]
#ifndef _ASMARM_PROCESSOR_H_
#define _ASMARM_PROCESSOR_H_
/*
* Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
*
* This work is licensed under the terms of the GNU LGPL, version 2.
*/
#include <asm/ptrace.h>
#include <asm/sysreg.h>
#include <asm/barrier.h>
#define CTR_DMINLINE_SHIFT 16
#define CTR_DMINLINE_MASK (0xf << 16)
#define CTR_DMINLINE(x) \
(((x) & CTR_DMINLINE_MASK) >> CTR_DMINLINE_SHIFT)
enum vector {
EXCPTN_RST,
EXCPTN_UND,
EXCPTN_SVC,
EXCPTN_PABT,
EXCPTN_DABT,
EXCPTN_ADDREXCPTN,
EXCPTN_IRQ,
EXCPTN_FIQ,
EXCPTN_MAX,
};
typedef void (*irq_handler_fn)(struct pt_regs *regs);
typedef void (*exception_fn)(struct pt_regs *);
extern void install_exception_handler(enum vector v, exception_fn fn);
extern void show_regs(struct pt_regs *regs);
static inline unsigned long current_cpsr(void)
{
unsigned long cpsr;
asm volatile("mrs %0, cpsr" : "=r" (cpsr));
return cpsr;
}
#define current_mode() (current_cpsr() & MODE_MASK)
static inline void local_irq_enable(void)
{
asm volatile("cpsie i" : : : "memory", "cc");
}
static inline void local_irq_disable(void)
{
asm volatile("cpsid i" : : : "memory", "cc");
}
#define MPIDR __ACCESS_CP15(c0, 0, c0, 5)
static inline uint64_t get_mpidr(void)
{
return read_sysreg(MPIDR);
}
#define MPIDR_HWID_BITMASK 0xffffff
extern int mpidr_to_cpu(uint64_t mpidr);
#define MPIDR_LEVEL_SHIFT(level) \
(((1 << level) >> 1) << 3)
#define MPIDR_AFFINITY_LEVEL(mpidr, level) \
((mpidr >> MPIDR_LEVEL_SHIFT(level)) & 0xff)
extern void start_usr(void (*func)(void *arg), void *arg, unsigned long sp_usr);
extern bool is_user(void);
#define CNTVCT __ACCESS_CP15_64(1, c14)
#define CNTFRQ __ACCESS_CP15(c14, 0, c0, 0)
#define CTR __ACCESS_CP15(c0, 0, c0, 1)
static inline u64 get_cntvct(void)
{
isb();
return read_sysreg(CNTVCT);
}
static inline u32 get_cntfrq(void)
{
return read_sysreg(CNTFRQ);
}
static inline u32 get_ctr(void)
{
return read_sysreg(CTR);
}
extern u32 dcache_line_size;
#endif /* _ASMARM_PROCESSOR_H_ */