static int restore_iwmmxt_context(char __user **auxp) { struct iwmmxt_sigframe __user *frame = (struct iwmmxt_sigframe __user *)*auxp; char kbuf[sizeof(*frame) + 8]; struct iwmmxt_sigframe *kframe; /* the iWMMXt context must be 64 bit aligned */ kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7); if (__copy_from_user(kframe, frame, sizeof(*frame))) return -1; /* * For non-iWMMXt threads: a single iwmmxt_sigframe-sized dummy * block is discarded for compatibility with setup_sigframe() if * present, but we don't mandate its presence. If some other * magic is here, it's not for us: */ if (!test_thread_flag(TIF_USING_IWMMXT) && kframe->magic != DUMMY_MAGIC) return 0; if (kframe->size != IWMMXT_STORAGE_SIZE) return -1; if (test_thread_flag(TIF_USING_IWMMXT)) { if (kframe->magic != IWMMXT_MAGIC) return -1; iwmmxt_task_restore(current_thread_info(), &kframe->storage); } *auxp += IWMMXT_STORAGE_SIZE; return 0; }
static int restore_iwmmxt_context(struct iwmmxt_sigframe *frame) { char kbuf[sizeof(*frame) + 8]; struct iwmmxt_sigframe *kframe; /* the iWMMXt context must be 64 bit aligned */ kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7); if (__copy_from_user(kframe, frame, sizeof(*frame))) return -1; if (kframe->magic != IWMMXT_MAGIC || kframe->size != IWMMXT_STORAGE_SIZE) return -1; iwmmxt_task_restore(current_thread_info(), &kframe->storage); return 0; }