struct thread_info      *thread;
        unsigned long           pad1;
  };
- extern struct global_reg_snapshot global_reg_snapshot[NR_CPUS];
+ 
+ struct global_pmu_snapshot {
+       unsigned long           pcr[4];
+       unsigned long           pic[4];
+ };
+ 
+ union global_cpu_snapshot {
+       struct global_reg_snapshot      reg;
+       struct global_pmu_snapshot      pmu;
+ };
+ 
+ extern union global_cpu_snapshot global_cpu_snapshot[NR_CPUS];
  
 -#define force_successful_syscall_return()         \
 -do {  current_thread_info()->syscall_noerror = 1; \
 -} while (0)
 +#define force_successful_syscall_return() set_thread_noerror(1)
  #define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
  #define instruction_pointer(regs) ((regs)->tpc)
  #define instruction_pointer_set(regs, val) ((regs)->tpc = (val))
 
  
        return ret;
  }
 -/*
 - * Do a system call from kernel instead of calling sys_execve so we
 - * end up with proper pt_regs.
 - */
 -int kernel_execve(const char *filename,
 -                const char *const argv[],
 -                const char *const envp[])
 -{
 -      long __res;
 -      register long __g1 __asm__ ("g1") = __NR_execve;
 -      register long __o0 __asm__ ("o0") = (long)(filename);
 -      register long __o1 __asm__ ("o1") = (long)(argv);
 -      register long __o2 __asm__ ("o2") = (long)(envp);
 -      asm volatile ("t 0x6d\n\t"
 -                    "sub %%g0, %%o0, %0\n\t"
 -                    "movcc %%xcc, %%o0, %0\n\t"
 -                    : "=r" (__res), "=&r" (__o0)
 -                    : "1" (__o0), "r" (__o1), "r" (__o2), "r" (__g1)
 -                    : "cc");
 -      return __res;
 -}
 -
+ 
+ asmlinkage long sys_kern_features(void)
+ {
+       return KERN_FEATURE_MIXED_MODE_STACK;
+ }