Re: [PATCH] x86: fix ioport unification on 32-bit [was: Re: hwclock failure in x86.git]

2008-01-14 Thread Ingo Molnar

* Chris Wright <[EMAIL PROTECTED]> wrote:

> * Ingo Molnar ([EMAIL PROTECTED]) wrote:
> > thanks for tracking it down. I pulled that commit for now. But it would 
> > be nice to figure out what's going on there.
> 
> Zach was right. The unification was broken for 32-bit; it was missing 
> the actual pushf/popf EFLAGS manipluation (set_iopl_mask()) and 
> would've broken task switching between processes w/ different iopl in 
> paravirt guests too.  64-bit sys_iopl just does pt_regs->flags 
> modification and lets syscall/sysret plus ptregscall sync and do 
> EFLAGS update.
> 
> Also, use of volatile looks like leftover cruft.
> 
> This patch in on top of Miguel's (can respin to standalone if that's 
> better). [...]

thanks, applied.

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] x86: fix ioport unification on 32-bit [was: Re: hwclock failure in x86.git]

2008-01-14 Thread Ingo Molnar

* Chris Wright [EMAIL PROTECTED] wrote:

 * Ingo Molnar ([EMAIL PROTECTED]) wrote:
  thanks for tracking it down. I pulled that commit for now. But it would 
  be nice to figure out what's going on there.
 
 Zach was right. The unification was broken for 32-bit; it was missing 
 the actual pushf/popf EFLAGS manipluation (set_iopl_mask()) and 
 would've broken task switching between processes w/ different iopl in 
 paravirt guests too.  64-bit sys_iopl just does pt_regs-flags 
 modification and lets syscall/sysret plus ptregscall sync and do 
 EFLAGS update.
 
 Also, use of volatile looks like leftover cruft.
 
 This patch in on top of Miguel's (can respin to standalone if that's 
 better). [...]

thanks, applied.

Ingo
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] x86: fix ioport unification on 32-bit [was: Re: hwclock failure in x86.git]

2008-01-11 Thread Chris Wright
* Ingo Molnar ([EMAIL PROTECTED]) wrote:
> thanks for tracking it down. I pulled that commit for now. But it would 
> be nice to figure out what's going on there.

Zach was right. The unification was broken for 32-bit; it was missing
the actual pushf/popf EFLAGS manipluation (set_iopl_mask()) and would've
broken task switching between processes w/ different iopl in paravirt
guests too.  64-bit sys_iopl just does pt_regs->flags modification and
lets syscall/sysret plus ptregscall sync and do EFLAGS update.

Also, use of volatile looks like leftover cruft.

This patch in on top of Miguel's (can respin to standalone if that's better).
Tested (on both 32 and 64-bit) with simple:

  #include 
  #include 
  
  main()
  {
if (iopl(3) == 0)
asm ("cli\nsti\n"::);
  }

thanks,
-chris
--

From: Chris Wright <[EMAIL PROTECTED]>
Subject: [PATCH] x86: fix ioport unification on 32-bit

ioport unification was broken for 32-bit; it was missing
the acutal pushf/popf EFLAGS manipulation (set_iopl_mask()).
Also, use of volatile looks like leftover cruft.

Cc: [EMAIL PROTECTED]
Cc: Kevin Winchester <[EMAIL PROTECTED]>
Cc: Zach Brown <[EMAIL PROTECTED]>
Cc: Ingo Molnar <[EMAIL PROTECTED]>
Cc: "H. Peter Anvin" <[EMAIL PROTECTED]>
Cc: Thomas Gleixner <[EMAIL PROTECTED]>
Signed-off-by: Chris Wright <[EMAIL PROTECTED]>
---
 arch/x86/kernel/ioport.c |6 --
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
index e723ff3..be72d80 100644
--- a/arch/x86/kernel/ioport.c
+++ b/arch/x86/kernel/ioport.c
@@ -116,9 +116,10 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned 
long num, int turn_on)
 #ifdef CONFIG_X86_32
 asmlinkage long sys_iopl(unsigned long regsp)
 {
-   volatile struct pt_regs *regs = (struct pt_regs *)
+   struct pt_regs *regs = (struct pt_regs *)
unsigned int level = regs->bx;
unsigned int old = (regs->flags >> 12) & 3;
+   struct thread_struct *t = >thread;
 
if (level > 3)
return -EINVAL;
@@ -127,8 +128,9 @@ asmlinkage long sys_iopl(unsigned long regsp)
if (!capable(CAP_SYS_RAWIO))
return -EPERM;
}
+   t->iopl = level << 12;
regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12);
-
+   set_iopl_mask(t->iopl);
return 0;
 }
 #else
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] x86: fix ioport unification on 32-bit [was: Re: hwclock failure in x86.git]

2008-01-11 Thread Chris Wright
* Ingo Molnar ([EMAIL PROTECTED]) wrote:
 thanks for tracking it down. I pulled that commit for now. But it would 
 be nice to figure out what's going on there.

Zach was right. The unification was broken for 32-bit; it was missing
the actual pushf/popf EFLAGS manipluation (set_iopl_mask()) and would've
broken task switching between processes w/ different iopl in paravirt
guests too.  64-bit sys_iopl just does pt_regs-flags modification and
lets syscall/sysret plus ptregscall sync and do EFLAGS update.

Also, use of volatile looks like leftover cruft.

This patch in on top of Miguel's (can respin to standalone if that's better).
Tested (on both 32 and 64-bit) with simple:

  #include stdlib.h
  #include sys/io.h
  
  main()
  {
if (iopl(3) == 0)
asm (cli\nsti\n::);
  }

thanks,
-chris
--

From: Chris Wright [EMAIL PROTECTED]
Subject: [PATCH] x86: fix ioport unification on 32-bit

ioport unification was broken for 32-bit; it was missing
the acutal pushf/popf EFLAGS manipulation (set_iopl_mask()).
Also, use of volatile looks like leftover cruft.

Cc: [EMAIL PROTECTED]
Cc: Kevin Winchester [EMAIL PROTECTED]
Cc: Zach Brown [EMAIL PROTECTED]
Cc: Ingo Molnar [EMAIL PROTECTED]
Cc: H. Peter Anvin [EMAIL PROTECTED]
Cc: Thomas Gleixner [EMAIL PROTECTED]
Signed-off-by: Chris Wright [EMAIL PROTECTED]
---
 arch/x86/kernel/ioport.c |6 --
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
index e723ff3..be72d80 100644
--- a/arch/x86/kernel/ioport.c
+++ b/arch/x86/kernel/ioport.c
@@ -116,9 +116,10 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned 
long num, int turn_on)
 #ifdef CONFIG_X86_32
 asmlinkage long sys_iopl(unsigned long regsp)
 {
-   volatile struct pt_regs *regs = (struct pt_regs *)regsp;
+   struct pt_regs *regs = (struct pt_regs *)regsp;
unsigned int level = regs-bx;
unsigned int old = (regs-flags  12)  3;
+   struct thread_struct *t = current-thread;
 
if (level  3)
return -EINVAL;
@@ -127,8 +128,9 @@ asmlinkage long sys_iopl(unsigned long regsp)
if (!capable(CAP_SYS_RAWIO))
return -EPERM;
}
+   t-iopl = level  12;
regs-flags = (regs-flags  ~X86_EFLAGS_IOPL) | (level  12);
-
+   set_iopl_mask(t-iopl);
return 0;
 }
 #else
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/