#include <xen/livepatch_elf.h>
#include <xen/livepatch.h>
-void arch_livepatch_quiesce(void)
+int arch_livepatch_quiesce(void)
{
+ return -ENOSYS;
}
void arch_livepatch_revive(void)
#define PATCH_INSN_SIZE 5
-void arch_livepatch_quiesce(void)
+int arch_livepatch_quiesce(void)
{
/* Disable WP to allow changes to read-only pages. */
write_cr0(read_cr0() & ~X86_CR0_WP);
+
+ return 0;
}
void arch_livepatch_revive(void)
static int apply_payload(struct payload *data)
{
unsigned int i;
+ int rc;
printk(XENLOG_INFO LIVEPATCH "%s: Applying %u functions\n",
data->name, data->nfuncs);
- arch_livepatch_quiesce();
+ rc = arch_livepatch_quiesce();
+ if ( rc )
+ {
+ printk(XENLOG_ERR LIVEPATCH "%s: unable to quiesce!\n", data->name);
+ return rc;
+ }
for ( i = 0; i < data->nfuncs; i++ )
arch_livepatch_apply_jmp(&data->funcs[i]);
static int revert_payload(struct payload *data)
{
unsigned int i;
+ int rc;
printk(XENLOG_INFO LIVEPATCH "%s: Reverting\n", data->name);
- arch_livepatch_quiesce();
+ rc = arch_livepatch_quiesce();
+ if ( rc )
+ {
+ printk(XENLOG_ERR LIVEPATCH "%s: unable to quiesce!\n", data->name);
+ return rc;
+ }
for ( i = 0; i < data->nfuncs; i++ )
arch_livepatch_revert_jmp(&data->funcs[i]);
* These functions are called around the critical region patching live code,
* for an architecture to take make appropratie global state adjustments.
*/
-void arch_livepatch_quiesce(void);
+int arch_livepatch_quiesce(void);
void arch_livepatch_revive(void);
void arch_livepatch_apply_jmp(struct livepatch_func *func);