xref: /linux/arch/arc/mm/extable.c (revision 9ce6dbe8ea42ddf3ce8e6d0d2fa3b5d73448314e)
143697cb0SVineet Gupta /*
243697cb0SVineet Gupta  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
343697cb0SVineet Gupta  *
443697cb0SVineet Gupta  * This program is free software; you can redistribute it and/or modify
543697cb0SVineet Gupta  * it under the terms of the GNU General Public License version 2 as
643697cb0SVineet Gupta  * published by the Free Software Foundation.
743697cb0SVineet Gupta  *
843697cb0SVineet Gupta  * Borrowed heavily from MIPS
943697cb0SVineet Gupta  */
1043697cb0SVineet Gupta 
11*9ce6dbe8SPaul Gortmaker #include <linux/export.h>
12*9ce6dbe8SPaul Gortmaker #include <linux/extable.h>
1343697cb0SVineet Gupta #include <linux/uaccess.h>
1443697cb0SVineet Gupta 
1543697cb0SVineet Gupta int fixup_exception(struct pt_regs *regs)
1643697cb0SVineet Gupta {
1743697cb0SVineet Gupta 	const struct exception_table_entry *fixup;
1843697cb0SVineet Gupta 
1943697cb0SVineet Gupta 	fixup = search_exception_tables(instruction_pointer(regs));
2043697cb0SVineet Gupta 	if (fixup) {
2143697cb0SVineet Gupta 		regs->ret = fixup->fixup;
2243697cb0SVineet Gupta 
2343697cb0SVineet Gupta 		return 1;
2443697cb0SVineet Gupta 	}
2543697cb0SVineet Gupta 
2643697cb0SVineet Gupta 	return 0;
2743697cb0SVineet Gupta }
2843697cb0SVineet Gupta 
2943697cb0SVineet Gupta #ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
3043697cb0SVineet Gupta 
3143697cb0SVineet Gupta long arc_copy_from_user_noinline(void *to, const void __user *from,
3243697cb0SVineet Gupta 		unsigned long n)
3343697cb0SVineet Gupta {
3443697cb0SVineet Gupta 	return __arc_copy_from_user(to, from, n);
3543697cb0SVineet Gupta }
3643697cb0SVineet Gupta EXPORT_SYMBOL(arc_copy_from_user_noinline);
3743697cb0SVineet Gupta 
3843697cb0SVineet Gupta long arc_copy_to_user_noinline(void __user *to, const void *from,
3943697cb0SVineet Gupta 		unsigned long n)
4043697cb0SVineet Gupta {
4143697cb0SVineet Gupta 	return __arc_copy_to_user(to, from, n);
4243697cb0SVineet Gupta }
4343697cb0SVineet Gupta EXPORT_SYMBOL(arc_copy_to_user_noinline);
4443697cb0SVineet Gupta 
4543697cb0SVineet Gupta unsigned long arc_clear_user_noinline(void __user *to,
4643697cb0SVineet Gupta 		unsigned long n)
4743697cb0SVineet Gupta {
4843697cb0SVineet Gupta 	return __arc_clear_user(to, n);
4943697cb0SVineet Gupta }
5043697cb0SVineet Gupta EXPORT_SYMBOL(arc_clear_user_noinline);
5143697cb0SVineet Gupta 
5243697cb0SVineet Gupta long arc_strncpy_from_user_noinline(char *dst, const char __user *src,
5343697cb0SVineet Gupta 		long count)
5443697cb0SVineet Gupta {
5543697cb0SVineet Gupta 	return __arc_strncpy_from_user(dst, src, count);
5643697cb0SVineet Gupta }
5743697cb0SVineet Gupta EXPORT_SYMBOL(arc_strncpy_from_user_noinline);
5843697cb0SVineet Gupta 
5943697cb0SVineet Gupta long arc_strnlen_user_noinline(const char __user *src, long n)
6043697cb0SVineet Gupta {
6143697cb0SVineet Gupta 	return __arc_strnlen_user(src, n);
6243697cb0SVineet Gupta }
6343697cb0SVineet Gupta EXPORT_SYMBOL(arc_strnlen_user_noinline);
6443697cb0SVineet Gupta #endif
65