/SPARTAN/trunk/arch/ia32/include/types.h |
---|
40,7 → 40,7 |
typedef __u32 __address; |
typedef __u32 pri_t; |
typedef __u32 ipl_t; |
typedef __u32 __native; |
/SPARTAN/trunk/arch/ia32/include/asm.h |
---|
131,13 → 131,15 |
*/ |
static inline __u32 inl(__u16 port) { __u32 val; __asm__ volatile ("inl %w1, %l0 \n" : "=a" (val) : "d" (port) ); return val; } |
/** Set priority level low |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline pri_t cpu_priority_low(void) { |
pri_t v; |
static inline ipl_t interrupts_enable(void) { |
ipl_t v; |
__asm__ volatile ( |
"pushf\n\t" |
"popl %0\n\t" |
147,13 → 149,15 |
return v; |
} |
/** Set priority level high |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline pri_t cpu_priority_high(void) { |
pri_t v; |
static inline ipl_t interrupts_disable(void) { |
ipl_t v; |
__asm__ volatile ( |
"pushf\n\t" |
"popl %0\n\t" |
163,24 → 167,26 |
return v; |
} |
/** Restore priority level |
/** Restore interrupt priority level. |
* |
* Restore EFLAGS. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void cpu_priority_restore(pri_t pri) { |
static inline void interrupts_restore(ipl_t ipl) { |
__asm__ volatile ( |
"pushl %0\n\t" |
"popf\n" |
: : "r" (pri) |
: : "r" (ipl) |
); |
} |
/** Return raw priority level |
/** Return interrupt priority level. |
* |
* Return EFLAFS. |
* @return EFLAFS. |
*/ |
static inline pri_t cpu_priority_read(void) { |
pri_t v; |
static inline ipl_t interrupts_read(void) { |
ipl_t v; |
__asm__ volatile ( |
"pushf\n\t" |
"popl %0\n" |
/SPARTAN/trunk/arch/ia32/include/context.h |
---|
52,7 → 52,7 |
__u32 esi; |
__u32 edi; |
__u32 ebp; |
__u32 pri; |
ipl_t ipl; |
} __attribute__ ((packed)); |
#endif |
/SPARTAN/trunk/arch/ia32/src/userspace.c |
---|
41,9 → 41,9 |
*/ |
void userspace(void) |
{ |
pri_t pri; |
ipl_t ipl; |
pri = cpu_priority_high(); |
ipl = interrupts_disable(); |
__asm__ volatile ( |
/* CLNT */ |
60,7 → 60,7 |
"pushl %4\n" |
"iret" |
: |
: "i" (selector(UDATA_DES) | PL_USER), "r" (USTACK_ADDRESS+(THREAD_STACK_SIZE)), "r" (pri), "i" (selector(UTEXT_DES) | PL_USER), "i" (UTEXT_ADDRESS) |
: "i" (selector(UDATA_DES) | PL_USER), "r" (USTACK_ADDRESS+(THREAD_STACK_SIZE)), "r" (ipl), "i" (selector(UTEXT_DES) | PL_USER), "i" (UTEXT_ADDRESS) |
: "eax"); |
/* Unreachable */ |
/SPARTAN/trunk/arch/ia32/src/interrupt.c |
---|
79,7 → 79,7 |
/* |
* Called directly from the assembler code. |
* CPU is cpu_priority_high(). |
* CPU is interrupts_disable()'d. |
*/ |
void trap_dispatcher(__u8 n, __native stack[]) |
{ |
/SPARTAN/trunk/arch/ia32/src/drivers/ega.c |
---|
80,9 → 80,9 |
void ega_putchar(const char ch) |
{ |
pri_t pri; |
ipl_t ipl; |
pri = cpu_priority_high(); |
ipl = interrupts_disable(); |
spinlock_lock(&egalock); |
switch (ch) { |
101,7 → 101,7 |
ega_move_cursor(); |
spinlock_unlock(&egalock); |
cpu_priority_restore(pri); |
interrupts_restore(ipl); |
} |
void ega_move_cursor(void) |