lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4B4B78D1.2080606@siemens.com>
Date:	Mon, 11 Jan 2010 20:15:29 +0100
From:	Jan Kiszka <jan.kiszka@...mens.com>
To:	Frederic Weisbecker <fweisbec@...il.com>
CC:	"K.Prasad" <prasad@...ux.vnet.ibm.com>,
	LKML <linux-kernel@...r.kernel.org>, Ingo Molnar <mingo@...e.hu>,
	Alan Stern <stern@...land.harvard.edu>
Subject: Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to
   notifier chain in hw_breakpoint_handler

Frederic Weisbecker wrote:
> On Fri, Jan 01, 2010 at 12:32:17AM +0530, K.Prasad wrote:
>> On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
>>> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
>>>> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
>>>> to generate SIGTRAP signal (and not for kernel-space addresses). 
>>>>
>>>> Signed-off-by: K.Prasad <prasad@...ux.vnet.ibm.com>
>>>> ---
>>>>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
>>>>  1 file changed, 7 insertions(+), 2 deletions(-)
>>>>
>>>> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
>>>> ===================================================================
>>>> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
>>>> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
>>>> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
>>>>  		rcu_read_lock();
>>>>  
>>>>  		bp = per_cpu(bp_per_reg[i], cpu);
>>>> -		if (bp)
>>>> -			rc = NOTIFY_DONE;
>>>>  		/*
>>>>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
>>>>  		 * exception handling
>>>> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
>>>>  			rcu_read_unlock();
>>>>  			break;
>>>>  		}
>>>> +		/*
>>>> +		 * Further processing in do_debug() is needed for a) user-space
>>>> +		 * breakpoints (to generate signals) and b) when the system has
>>>> +		 * taken exception due to multiple causes
>>>> +		 */
>>>> +		if (bp->attr.bp_addr < TASK_SIZE)
>>>> +			rc = NOTIFY_DONE;
>>>>  
>>>>  		perf_bp_event(bp, args->regs);
>>>>  
>>>>
>>>
>>> Oh and now that I see this patch, the previous one indeed makes sense
>>> with this check:
>>>
>>> if (dr6 & (~DR_TRAP_BITS))
>>> 	rc = NOTIFY_DONE;
>>>
>>> That said, it means thread.debugreg6 won't get the reserved bits anymore.
>>> I see some use of them from kvm (it restores the reserved bits on guest<->host
>>> switch). Not sure if this inconsistency could affect kvm...
>>>
>> Can you point me to the relevant code?
> 
> 
> I see various uses of DR6_VOLATILE and DR6_FIXED_1 in arch/x86/kvm/,
> DR6_FIXED_1 being the fixed unused bits in dr6. Not sure how
> this patch would affect what's set there.
> 
> I'll wait for Jan's answer.
> 

You may need to synchronize me: What does the patch change, the shadow
register KVM will restore into DR6 on return to the host? Or the
register content KVM finds on guest entry?

The rules are simple: On entry, KVM assumes nothing about the register
state, just overwrites it (on demand) with the guest state. On exit, it
calls into hw_breakpoint_restore to ensure the host sees a proper state
(if required). But there is at no time an architecturally invalid state
loaded into the real register (that's basically what DR6_VOLATILE and
DR6_FIXED_1 are used for while in guest mode).

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ