forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.3 KiB
66 lines
1.3 KiB
// SPDX-License-Identifier: GPL-2.0-or-later |
|
/* |
|
* |
|
* Copyright (C) IBM Corporation, 2011 |
|
* |
|
* Authors: Sukadev Bhattiprolu <[email protected]> |
|
* Anton Blanchard <[email protected]> |
|
*/ |
|
#include <linux/uaccess.h> |
|
#include <linux/hardirq.h> |
|
#include <asm/switch_to.h> |
|
#include <asm/asm-prototypes.h> |
|
|
|
int enter_vmx_usercopy(void) |
|
{ |
|
if (in_interrupt()) |
|
return 0; |
|
|
|
preempt_disable(); |
|
/* |
|
* We need to disable page faults as they can call schedule and |
|
* thus make us lose the VMX context. So on page faults, we just |
|
* fail which will cause a fallback to the normal non-vmx copy. |
|
*/ |
|
pagefault_disable(); |
|
|
|
enable_kernel_altivec(); |
|
|
|
return 1; |
|
} |
|
|
|
/* |
|
* This function must return 0 because we tail call optimise when calling |
|
* from __copy_tofrom_user_power7 which returns 0 on success. |
|
*/ |
|
int exit_vmx_usercopy(void) |
|
{ |
|
disable_kernel_altivec(); |
|
pagefault_enable(); |
|
preempt_enable(); |
|
return 0; |
|
} |
|
|
|
int enter_vmx_ops(void) |
|
{ |
|
if (in_interrupt()) |
|
return 0; |
|
|
|
preempt_disable(); |
|
|
|
enable_kernel_altivec(); |
|
|
|
return 1; |
|
} |
|
|
|
/* |
|
* All calls to this function will be optimised into tail calls. We are |
|
* passed a pointer to the destination which we return as required by a |
|
* memcpy implementation. |
|
*/ |
|
void *exit_vmx_ops(void *dest) |
|
{ |
|
disable_kernel_altivec(); |
|
preempt_enable(); |
|
return dest; |
|
}
|
|
|