struct pt_regs *regs,
unsigned long ip)
{
- struct per_regs per_kprobe;
+ union {
+ unsigned long regs[3];
+ struct {
+ unsigned long control;
+ unsigned long start;
+ unsigned long end;
+ };
+ } per_kprobe;
/* Set up the PER control registers %cr9-%cr11 */
per_kprobe.control = PER_EVENT_IFETCH;
(PSW_MASK_PER | PSW_MASK_IO | PSW_MASK_EXT);
/* Set PER control regs, turns on single step for the given address */
- __local_ctl_load(9, 11, per_kprobe);
+ __local_ctl_load(9, 11, per_kprobe.regs);
regs->psw.mask |= PSW_MASK_PER;
regs->psw.mask &= ~(PSW_MASK_IO | PSW_MASK_EXT);
regs->psw.addr = ip;
{
struct pt_regs *regs = task_pt_regs(task);
struct thread_struct *thread = &task->thread;
- struct per_regs old, new;
union ctlreg0 cr0_old, cr0_new;
union ctlreg2 cr2_old, cr2_new;
int cr0_changed, cr2_changed;
+ union {
+ unsigned long regs[3];
+ struct {
+ unsigned long control;
+ unsigned long start;
+ unsigned long end;
+ };
+ } old, new;
local_ctl_store(0, &cr0_old.val);
local_ctl_store(2, &cr2_old.val);
return;
}
regs->psw.mask |= PSW_MASK_PER;
- __local_ctl_store(9, 11, old);
+ __local_ctl_store(9, 11, old.regs);
if (memcmp(&new, &old, sizeof(struct per_regs)) != 0)
- __local_ctl_load(9, 11, new);
+ __local_ctl_load(9, 11, new.regs);
}
void user_enable_single_step(struct task_struct *task)