union ctlreg0 {
        unsigned long val;
        struct {
-               unsigned long      : 32;
+               unsigned long      : 8;
+               unsigned long tcx  : 1; /* Transactional-Execution control */
+               unsigned long pifo : 1; /* Transactional-Execution Program-
+                                          Interruption-Filtering Override */
+               unsigned long      : 22;
                unsigned long      : 3;
                unsigned long lap  : 1; /* Low-address-protection control */
                unsigned long      : 4;
        };
 };
 
+union ctlreg2 {
+       unsigned long val;
+       struct {
+               unsigned long       : 33;
+               unsigned long ducto : 25;
+               unsigned long       : 1;
+               unsigned long gse   : 1;
+               unsigned long       : 1;
+               unsigned long tds   : 1;
+               unsigned long tdc   : 2;
+       };
+};
+
 #ifdef CONFIG_SMP
 # define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit)
 # define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit)
 
 static noinline void __machine_kdump(void *image)
 {
        struct mcesa *mcesa;
-       unsigned long cr2_old, cr2_new;
+       union ctlreg2 cr2_old, cr2_new;
        int this_cpu, cpu;
 
        lgr_info_log();
        if (MACHINE_HAS_VX)
                save_vx_regs((__vector128 *) mcesa->vector_save_area);
        if (MACHINE_HAS_GS) {
-               __ctl_store(cr2_old, 2, 2);
-               cr2_new = cr2_old | (1UL << 4);
-               __ctl_load(cr2_new, 2, 2);
+               __ctl_store(cr2_old.val, 2, 2);
+               cr2_new = cr2_old;
+               cr2_new.gse = 1;
+               __ctl_load(cr2_new.val, 2, 2);
                save_gs_cb((struct gs_cb *) mcesa->guarded_storage_save_area);
-               __ctl_load(cr2_old, 2, 2);
+               __ctl_load(cr2_old.val, 2, 2);
        }
        /*
         * To create a good backchain for this CPU in the dump store_status
 
        struct pt_regs *regs = task_pt_regs(task);
        struct thread_struct *thread = &task->thread;
        struct per_regs old, new;
-       unsigned long cr0_old, cr0_new;
-       unsigned long cr2_old, cr2_new;
+       union ctlreg0 cr0_old, cr0_new;
+       union ctlreg2 cr2_old, cr2_new;
        int cr0_changed, cr2_changed;
 
-       __ctl_store(cr0_old, 0, 0);
-       __ctl_store(cr2_old, 2, 2);
+       __ctl_store(cr0_old.val, 0, 0);
+       __ctl_store(cr2_old.val, 2, 2);
        cr0_new = cr0_old;
        cr2_new = cr2_old;
        /* Take care of the enable/disable of transactional execution. */
        if (MACHINE_HAS_TE) {
                /* Set or clear transaction execution TXC bit 8. */
-               cr0_new |= (1UL << 55);
+               cr0_new.tcx = 1;
                if (task->thread.per_flags & PER_FLAG_NO_TE)
-                       cr0_new &= ~(1UL << 55);
+                       cr0_new.tcx = 0;
                /* Set or clear transaction execution TDC bits 62 and 63. */
-               cr2_new &= ~3UL;
+               cr2_new.tdc = 0;
                if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND) {
                        if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND_TEND)
-                               cr2_new |= 1UL;
+                               cr2_new.tdc = 1;
                        else
-                               cr2_new |= 2UL;
+                               cr2_new.tdc = 2;
                }
        }
        /* Take care of enable/disable of guarded storage. */
        if (MACHINE_HAS_GS) {
-               cr2_new &= ~(1UL << 4);
+               cr2_new.gse = 0;
                if (task->thread.gs_cb)
-                       cr2_new |= (1UL << 4);
+                       cr2_new.gse = 1;
        }
        /* Load control register 0/2 iff changed */
-       cr0_changed = cr0_new != cr0_old;
-       cr2_changed = cr2_new != cr2_old;
+       cr0_changed = cr0_new.val != cr0_old.val;
+       cr2_changed = cr2_new.val != cr2_old.val;
        if (cr0_changed)
-               __ctl_load(cr0_new, 0, 0);
+               __ctl_load(cr0_new.val, 0, 0);
        if (cr2_changed)
-               __ctl_load(cr2_new, 2, 2);
+               __ctl_load(cr2_new.val, 2, 2);
        /* Copy user specified PER registers */
        new.control = thread->per_user.control;
        new.start = thread->per_user.start;