+ unsigned int compat_cmd = cmd;
+
+ switch (compat_cmd) {
+ case MTRRIOC_ADD_ENTRY:
+ case MTRRIOC_SET_ENTRY:
+ case MTRRIOC_DEL_ENTRY:
+ case MTRRIOC_KILL_ENTRY:
+ case MTRRIOC_ADD_PAGE_ENTRY:
+ case MTRRIOC_SET_PAGE_ENTRY:
+ case MTRRIOC_DEL_PAGE_ENTRY:
+ case MTRRIOC_KILL_PAGE_ENTRY:
+ if (copy_from_user(&sentry, arg, sizeof sentry))
+ return -EFAULT;
+ break;
+ case MTRRIOC_GET_ENTRY:
+ case MTRRIOC_GET_PAGE_ENTRY:
+ if (copy_from_user(&gentry, arg, sizeof gentry))
+ return -EFAULT;
+ break;
+#ifdef CONFIG_COMPAT
+#define MTRR_COMPAT_OP(op, type)\
+ case MTRRIOC32_##op: \
+ cmd = MTRRIOC_##op; \
+ goto compat_get_##type
+
+ MTRR_COMPAT_OP(ADD_ENTRY, sentry);
+ MTRR_COMPAT_OP(SET_ENTRY, sentry);
+ MTRR_COMPAT_OP(DEL_ENTRY, sentry);
+ MTRR_COMPAT_OP(KILL_ENTRY, sentry);
+ MTRR_COMPAT_OP(ADD_PAGE_ENTRY, sentry);
+ MTRR_COMPAT_OP(SET_PAGE_ENTRY, sentry);
+ MTRR_COMPAT_OP(DEL_PAGE_ENTRY, sentry);
+ MTRR_COMPAT_OP(KILL_PAGE_ENTRY, sentry);
+compat_get_sentry: {
+ struct mtrr_sentry32 __user *s32 = (struct mtrr_sentry32 __user *)__arg;
+ err = get_user(sentry.base, &s32->base);
+ err |= get_user(sentry.size, &s32->size);
+ err |= get_user(sentry.type, &s32->type);
+ if (err)
+ return err;
+ break;
+ }
+ MTRR_COMPAT_OP(GET_ENTRY, gentry);
+ MTRR_COMPAT_OP(GET_PAGE_ENTRY, gentry);
+compat_get_gentry: {
+ struct mtrr_gentry32 __user *g32 = (struct mtrr_gentry32 __user *)__arg;
+ err = get_user(gentry.regnum, &g32->regnum);
+ err |= get_user(gentry.base, &g32->base);
+ err |= get_user(gentry.size, &g32->size);
+ err |= get_user(gentry.type, &g32->type);
+ if (err)
+ return err;
+ break;
+ }
+#undef MTRR_COMPAT_OP
+#endif
+ }