git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.5.x5
[linux-2.6.git]
/
arch
/
i386
/
kernel
/
vm86.c
diff --git
a/arch/i386/kernel/vm86.c
b/arch/i386/kernel/vm86.c
index
483e9b2
..
2dd216a
100644
(file)
--- a/
arch/i386/kernel/vm86.c
+++ b/
arch/i386/kernel/vm86.c
@@
-137,6
+137,7
@@
struct pt_regs * fastcall save_v86_state(struct kernel_vm86_regs * regs)
static void mark_screen_rdonly(struct task_struct * tsk)
{
pgd_t *pgd;
static void mark_screen_rdonly(struct task_struct * tsk)
{
pgd_t *pgd;
+ pud_t *pud;
pmd_t *pmd;
pte_t *pte, *mapped;
int i;
pmd_t *pmd;
pte_t *pte, *mapped;
int i;
@@
-151,7
+152,15
@@
static void mark_screen_rdonly(struct task_struct * tsk)
pgd_clear(pgd);
goto out;
}
pgd_clear(pgd);
goto out;
}
- pmd = pmd_offset(pgd, 0xA0000);
+ pud = pud_offset(pgd, 0xA0000);
+ if (pud_none(*pud))
+ goto out;
+ if (pud_bad(*pud)) {
+ pud_ERROR(*pud);
+ pud_clear(pud);
+ goto out;
+ }
+ pmd = pmd_offset(pud, 0xA0000);
if (pmd_none(*pmd))
goto out;
if (pmd_bad(*pmd)) {
if (pmd_none(*pmd))
goto out;
if (pmd_bad(*pmd)) {
@@
-704,7
+713,7
@@
static struct vm86_irqs {
int sig;
} vm86_irqs[16];
int sig;
} vm86_irqs[16];
-static
spinlock_t irqbits_lock = SPIN_LOCK_UNLOCKED
;
+static
DEFINE_SPINLOCK(irqbits_lock)
;
static int irqbits;
#define ALLOWED_SIGS ( 1 /* 0 = don't send a signal */ \
static int irqbits;
#define ALLOWED_SIGS ( 1 /* 0 = don't send a signal */ \
@@
-723,7
+732,14
@@
static irqreturn_t irq_handler(int intno, void *dev_id, struct pt_regs * regs)
irqbits |= irq_bit;
if (vm86_irqs[intno].sig)
send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1);
irqbits |= irq_bit;
if (vm86_irqs[intno].sig)
send_sig(vm86_irqs[intno].sig, vm86_irqs[intno].tsk, 1);
- /* else user will poll for IRQs */
+ spin_unlock_irqrestore(&irqbits_lock, flags);
+ /*
+ * IRQ will be re-enabled when user asks for the irq (whether
+ * polling or as a result of the signal)
+ */
+ disable_irq(intno);
+ return IRQ_HANDLED;
+
out:
spin_unlock_irqrestore(&irqbits_lock, flags);
return IRQ_NONE;
out:
spin_unlock_irqrestore(&irqbits_lock, flags);
return IRQ_NONE;
@@
-741,7
+757,7
@@
static inline void free_vm86_irq(int irqnumber)
spin_unlock_irqrestore(&irqbits_lock, flags);
}
spin_unlock_irqrestore(&irqbits_lock, flags);
}
-void release_
x
86_irqs(struct task_struct *task)
+void release_
vm
86_irqs(struct task_struct *task)
{
int i;
for (i = FIRST_VM86_IRQ ; i <= LAST_VM86_IRQ; i++)
{
int i;
for (i = FIRST_VM86_IRQ ; i <= LAST_VM86_IRQ; i++)