mirror of
https://github.com/drasko/codezero.git
synced 2026-01-13 11:23:16 +01:00
Fixed few more anomalies with threaded irqs.
There is a bug that causes the sleeping irq thread to never wake up. Investigating.
This commit is contained in:
@@ -42,17 +42,20 @@ static inline void disable_irqs()
|
||||
/* Disable the irqs unconditionally, but also keep the previous state such that
|
||||
* if it was already disabled before the call, the restore call would retain
|
||||
* this state. */
|
||||
static inline void irq_local_disable_save(unsigned long *state)
|
||||
void irq_local_disable_save(unsigned long *state);
|
||||
#if 0
|
||||
{
|
||||
unsigned long temp;
|
||||
__asm__ __volatile__ (
|
||||
"mrs %0, cpsr_fc\n"
|
||||
"orr %1, %0, #0x80\n"
|
||||
"msr cpsr_fc, %1\n"
|
||||
"orr %2, %0, #0x80\n"
|
||||
"msr cpsr_fc, %2\n"
|
||||
: "=r" (*state)
|
||||
: "r" (*state),"r" (temp)
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Simply change it back to original state supplied in @flags. This might enable
|
||||
* or retain disabled state of the irqs for example. Useful for nested calls. */
|
||||
static inline void irq_local_restore(unsigned long state)
|
||||
|
||||
11
include/l4/arch/arm/v5/irq.h
Normal file
11
include/l4/arch/arm/v5/irq.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef __ARM_V5_IRQ_H__
|
||||
#define __ARM_V5_IRQ_H__
|
||||
|
||||
/*
|
||||
* Destructive atomic-read.
|
||||
*
|
||||
* Write 0 to byte at @location as its contents are read back.
|
||||
*/
|
||||
char l4_atomic_dest_readb(void *location);
|
||||
|
||||
#endif
|
||||
@@ -73,7 +73,8 @@
|
||||
#define MR0_REGISTER r3
|
||||
#define MR_RETURN_REGISTER r3
|
||||
|
||||
#define TASK_NOTIFY_MAX 8
|
||||
#define TASK_NOTIFY_SLOTS 8
|
||||
#define TASK_NOTIFY_MAXVALUE 255
|
||||
|
||||
/* Primaries aren't used for memcopy. Those ops use this as a parameter */
|
||||
#define L4_UTCB_FULL_BUFFER_SIZE (MR_REST * sizeof(int))
|
||||
@@ -85,7 +86,7 @@ struct utcb {
|
||||
u32 mr[MR_TOTAL]; /* MRs that are mapped to real registers */
|
||||
u32 saved_tag; /* Saved tag field for stacked ipcs */
|
||||
u32 saved_sender; /* Saved sender field for stacked ipcs */
|
||||
u8 notify[TASK_NOTIFY_MAX]; /* Irq notification slots */
|
||||
u8 notify[TASK_NOTIFY_SLOTS]; /* Irq notification slots */
|
||||
u32 mr_rest[MR_REST]; /* Complete the utcb for up to 64 words */
|
||||
};
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user