From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: [PATCH] x86: slightly improve stack trace on debug builds Date: Tue, 25 Sep 2012 16:48:59 +0100 Message-ID: References: <5061E4CF020000780009DB98@nat28.tlf.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <5061E4CF020000780009DB98@nat28.tlf.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich , xen-devel List-Id: xen-devel@lists.xenproject.org On 25/09/2012 16:07, "Jan Beulich" wrote: > + addr = regs->eip; > + while ( !is_kernel_text(addr) && > + (system_state > SYS_STATE_boot || !is_kernel_inittext(addr)) ) > + { > + /* Special case when a bad pointer was called. */ > + addr ^= regs->eip ^ *ESP_BEFORE_EXCEPTION(regs); > + if ( addr == regs->eip ) > + break; > + } Lol, how does your brain work this way? It took me 15 minutes to decode this to something like (also I added range checks on ESP_BEFORE_EXCEPTION(regs), what do you think?): bool_t is_current_kernel_text(unsigned long addr) { return (is_kernel_text(addr) || (system_state == SYS_STATE_boot && is_kernel_inittext(addr))); } ... /* * If RIP is not valid hypervisor code then someone may have called into * oblivion. Peek to see if they left a return address at top of stack. */ addr = (!is_current_kernel_text(regs->eip) && (ESP_BEFORE_EXCEPTION(regs) >= low) && (ESP_BEFORE_EXCEPTION(regs) < high) && is_current_kernel_text(*ESP_BEFORE_EXCEPTION(regs))) ? *ESP_BEFORE_EXCEPTION(regs) : regs->eip;