提交 d5ce528c 编写于 作者: M Mike Frysinger

Blackfin: convert irq/process to asm-generic

Signed-off-by: NMike Frysinger <vapier@gentoo.org>
上级 415f92da
#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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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) ...@@ -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)
{ {
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册