/*
 * AArch64 alt-syscall implementation
 *
 * Copyright (C) 2015 Google, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/alt-syscall.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/syscalls.h>

#include <asm/syscall.h>

int __init arch_dup_sys_call_table(struct alt_sys_call_table *entry)
{
	int err;

	if (!entry)
		return -EINVAL;
	if (entry->table)
		return -EINVAL;
#ifdef CONFIG_COMPAT
	if (entry->compat_table)
		return -EINVAL;
#endif

	entry->size = __NR_syscalls;
	entry->table = kcalloc(entry->size, sizeof(sys_call_ptr_t), GFP_KERNEL);
	if (!entry->table) {
		err = -ENOMEM;
		goto failed;
	}
	memcpy(entry->table, sys_call_table,
	       entry->size * sizeof(sys_call_ptr_t));

#ifdef CONFIG_COMPAT
	entry->compat_size = __NR_compat_syscalls;
	entry->compat_table = kcalloc(entry->compat_size,
				      sizeof(sys_call_ptr_t), GFP_KERNEL);
	if (!entry->compat_table) {
		err = -ENOMEM;
		goto compat_failed;
	}
	memcpy(entry->compat_table, compat_sys_call_table,
	       entry->compat_size * sizeof(sys_call_ptr_t));
#endif

	return 0;

#ifdef CONFIG_COMPAT
compat_failed:
	entry->compat_size = 0;
	kfree(entry->table);
	entry->table = NULL;
#endif
failed:
	entry->size = 0;
	return err;
}

int arch_set_sys_call_table(struct alt_sys_call_table *entry)
{
	if (!entry)
		return -EINVAL;

	current_thread_info()->nr_syscalls = entry->size;
	current_thread_info()->sys_call_table = entry->table;
#ifdef CONFIG_COMPAT
	current_thread_info()->compat_nr_syscalls = entry->compat_size;
	current_thread_info()->compat_sys_call_table = entry->compat_table;
#endif

	return 0;
}
