Blackfin: convert irq/process to asm-generic
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
415f92da75
commit
d5ce528c8e
4 changed files with 30 additions and 75 deletions
|
@ -1,47 +1,11 @@
|
||||||
#ifndef __BFIN_HARDIRQ_H
|
#ifndef __BFIN_HARDIRQ_H
|
||||||
#define __BFIN_HARDIRQ_H
|
#define __BFIN_HARDIRQ_H
|
||||||
|
|
||||||
#include <linux/cache.h>
|
|
||||||
#include <linux/threads.h>
|
|
||||||
#include <asm/irq.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int __softirq_pending;
|
|
||||||
unsigned int __syscall_count;
|
|
||||||
struct task_struct *__ksoftirqd_task;
|
|
||||||
} ____cacheline_aligned irq_cpustat_t;
|
|
||||||
|
|
||||||
#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We put the hardirq and softirq counter into the preemption
|
|
||||||
* counter. The bitmask has the following meaning:
|
|
||||||
*
|
|
||||||
* - bits 0-7 are the preemption count (max preemption depth: 256)
|
|
||||||
* - bits 8-15 are the softirq count (max # of softirqs: 256)
|
|
||||||
* - bits 16-23 are the hardirq count (max # of hardirqs: 256)
|
|
||||||
*
|
|
||||||
* - ( bit 26 is the PREEMPT_ACTIVE flag. )
|
|
||||||
*
|
|
||||||
* PREEMPT_MASK: 0x000000ff
|
|
||||||
* HARDIRQ_MASK: 0x0000ff00
|
|
||||||
* SOFTIRQ_MASK: 0x00ff0000
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if NR_IRQS > 256
|
|
||||||
#define HARDIRQ_BITS 9
|
|
||||||
#else
|
|
||||||
#define HARDIRQ_BITS 8
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NR_IRQS
|
|
||||||
# if (1 << HARDIRQ_BITS) < NR_IRQS
|
|
||||||
# error HARDIRQ_BITS is too low!
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __ARCH_IRQ_EXIT_IRQS_DISABLED 1
|
#define __ARCH_IRQ_EXIT_IRQS_DISABLED 1
|
||||||
|
|
||||||
extern void ack_bad_irq(unsigned int irq);
|
extern void ack_bad_irq(unsigned int irq);
|
||||||
|
#define ack_bad_irq ack_bad_irq
|
||||||
|
|
||||||
|
#include <asm-generic/hardirq.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -45,9 +45,6 @@
|
||||||
: "d" (bfin_irq_flags) \
|
: "d" (bfin_irq_flags) \
|
||||||
)
|
)
|
||||||
|
|
||||||
static inline int irq_canonicalize(int irq)
|
#include <asm-generic/irq.h>
|
||||||
{
|
|
||||||
return irq;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _BFIN_IRQ_H_ */
|
#endif /* _BFIN_IRQ_H_ */
|
||||||
|
|
|
@ -7,9 +7,8 @@
|
||||||
*/
|
*/
|
||||||
#define current_text_addr() ({ __label__ _l; _l: &&_l;})
|
#define current_text_addr() ({ __label__ _l; _l: &&_l;})
|
||||||
|
|
||||||
|
#include <asm/ptrace.h>
|
||||||
#include <asm/blackfin.h>
|
#include <asm/blackfin.h>
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <linux/compiler.h>
|
|
||||||
|
|
||||||
static inline unsigned long rdusp(void)
|
static inline unsigned long rdusp(void)
|
||||||
{
|
{
|
||||||
|
@ -59,36 +58,8 @@ struct thread_struct {
|
||||||
PS_S, 0, 0 \
|
PS_S, 0, 0 \
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
|
||||||
* Do necessary setup to start up a newly executed thread.
|
unsigned long new_sp);
|
||||||
*
|
|
||||||
* pass the data segment into user programs if it exists,
|
|
||||||
* it can't hurt anything as far as I can tell
|
|
||||||
*/
|
|
||||||
#ifndef CONFIG_SMP
|
|
||||||
#define start_thread(_regs, _pc, _usp) \
|
|
||||||
do { \
|
|
||||||
set_fs(USER_DS); \
|
|
||||||
(_regs)->pc = (_pc); \
|
|
||||||
if (current->mm) \
|
|
||||||
(_regs)->p5 = current->mm->start_data; \
|
|
||||||
task_thread_info(current)->l1_task_info.stack_start \
|
|
||||||
= (void *)current->mm->context.stack_start; \
|
|
||||||
task_thread_info(current)->l1_task_info.lowest_sp = (void *)(_usp); \
|
|
||||||
memcpy(L1_SCRATCH_TASK_INFO, &task_thread_info(current)->l1_task_info, \
|
|
||||||
sizeof(*L1_SCRATCH_TASK_INFO)); \
|
|
||||||
wrusp(_usp); \
|
|
||||||
} while(0)
|
|
||||||
#else
|
|
||||||
#define start_thread(_regs, _pc, _usp) \
|
|
||||||
do { \
|
|
||||||
set_fs(USER_DS); \
|
|
||||||
(_regs)->pc = (_pc); \
|
|
||||||
if (current->mm) \
|
|
||||||
(_regs)->p5 = current->mm->start_data; \
|
|
||||||
wrusp(_usp); \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Forward declaration, a strange C thing */
|
/* Forward declaration, a strange C thing */
|
||||||
struct task_struct;
|
struct task_struct;
|
||||||
|
|
|
@ -160,6 +160,29 @@ pid_t kernel_thread(int (*fn) (void *), void *arg, unsigned long flags)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kernel_thread);
|
EXPORT_SYMBOL(kernel_thread);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
|
||||||
|
{
|
||||||
|
set_fs(USER_DS);
|
||||||
|
regs->pc = new_ip;
|
||||||
|
if (current->mm)
|
||||||
|
regs->p5 = current->mm->start_data;
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
task_thread_info(current)->l1_task_info.stack_start =
|
||||||
|
(void *)current->mm->context.stack_start;
|
||||||
|
task_thread_info(current)->l1_task_info.lowest_sp = (void *)new_sp;
|
||||||
|
memcpy(L1_SCRATCH_TASK_INFO, &task_thread_info(current)->l1_task_info,
|
||||||
|
sizeof(*L1_SCRATCH_TASK_INFO));
|
||||||
|
#endif
|
||||||
|
wrusp(new_sp);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(start_thread);
|
||||||
|
|
||||||
void flush_thread(void)
|
void flush_thread(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue