|
@@ -246,6 +246,15 @@ static inline unsigned long regs_get_register(struct pt_regs *regs,
|
|
|
{
|
|
|
if (unlikely(offset > MAX_REG_OFFSET))
|
|
|
return 0;
|
|
|
+#ifdef CONFIG_X86_32
|
|
|
+ /*
|
|
|
+ * Traps from the kernel do not save sp and ss.
|
|
|
+ * Use the helper function to retrieve sp.
|
|
|
+ */
|
|
|
+ if (offset == offsetof(struct pt_regs, sp) &&
|
|
|
+ regs->cs == __KERNEL_CS)
|
|
|
+ return kernel_stack_pointer(regs);
|
|
|
+#endif
|
|
|
return *(unsigned long *)((unsigned long)regs + offset);
|
|
|
}
|
|
|
|