1b3a04ed5SBabu Moger/* 2b3a04ed5SBabu Moger * M7copy_to_user.S: SPARC M7 optimized copy to userspace. 3b3a04ed5SBabu Moger * 4b3a04ed5SBabu Moger * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. 5b3a04ed5SBabu Moger */ 6b3a04ed5SBabu Moger 7b3a04ed5SBabu Moger 8*34060b8fSBabu Moger#define EX_ST(x, y) \ 9b3a04ed5SBabu Moger98: x; \ 10b3a04ed5SBabu Moger .section __ex_table,"a"; \ 11b3a04ed5SBabu Moger .align 4; \ 12*34060b8fSBabu Moger .word 98b, y; \ 13b3a04ed5SBabu Moger .text; \ 14b3a04ed5SBabu Moger .align 4; 15b3a04ed5SBabu Moger 16*34060b8fSBabu Moger#define EX_ST_FP(x, y) \ 17b3a04ed5SBabu Moger98: x; \ 18b3a04ed5SBabu Moger .section __ex_table,"a"; \ 19b3a04ed5SBabu Moger .align 4; \ 20*34060b8fSBabu Moger .word 98b, y##_fp; \ 21b3a04ed5SBabu Moger .text; \ 22b3a04ed5SBabu Moger .align 4; 23b3a04ed5SBabu Moger 24b3a04ed5SBabu Moger 25b3a04ed5SBabu Moger#ifndef ASI_AIUS 26b3a04ed5SBabu Moger#define ASI_AIUS 0x11 27b3a04ed5SBabu Moger#endif 28b3a04ed5SBabu Moger 29b3a04ed5SBabu Moger#ifndef ASI_BLK_INIT_QUAD_LDD_AIUS 30b3a04ed5SBabu Moger#define ASI_BLK_INIT_QUAD_LDD_AIUS 0x23 31b3a04ed5SBabu Moger#endif 32b3a04ed5SBabu Moger 33b3a04ed5SBabu Moger#define FUNC_NAME M7copy_to_user 34b3a04ed5SBabu Moger#define STORE(type,src,addr) type##a src, [addr] %asi 35b3a04ed5SBabu Moger#define STORE_ASI ASI_BLK_INIT_QUAD_LDD_AIUS 36b3a04ed5SBabu Moger#define STORE_MRU_ASI ASI_ST_BLKINIT_MRU_S 37b3a04ed5SBabu Moger#define EX_RETVAL(x) 0 38b3a04ed5SBabu Moger 39b3a04ed5SBabu Moger#ifdef __KERNEL__ 40b3a04ed5SBabu Moger /* Writing to %asi is _expensive_ so we hardcode it. 41b3a04ed5SBabu Moger * Reading %asi to check for KERNEL_DS is comparatively 42b3a04ed5SBabu Moger * cheap. 43b3a04ed5SBabu Moger */ 44b3a04ed5SBabu Moger#define PREAMBLE \ 45b3a04ed5SBabu Moger rd %asi, %g1; \ 46b3a04ed5SBabu Moger cmp %g1, ASI_AIUS; \ 47b3a04ed5SBabu Moger bne,pn %icc, raw_copy_in_user; \ 48b3a04ed5SBabu Moger nop 49b3a04ed5SBabu Moger#endif 50b3a04ed5SBabu Moger 51b3a04ed5SBabu Moger#include "M7memcpy.S" 52