18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * IOP Coprocessor-6 access handler 48c2ecf20Sopenharmony_ci * Copyright (c) 2006, Intel Corporation. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#include <linux/init.h> 78c2ecf20Sopenharmony_ci#include <asm/traps.h> 88c2ecf20Sopenharmony_ci#include <asm/ptrace.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_cistatic int cp6_trap(struct pt_regs *regs, unsigned int instr) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci u32 temp; 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci /* enable cp6 access */ 158c2ecf20Sopenharmony_ci asm volatile ( 168c2ecf20Sopenharmony_ci "mrc p15, 0, %0, c15, c1, 0\n\t" 178c2ecf20Sopenharmony_ci "orr %0, %0, #(1 << 6)\n\t" 188c2ecf20Sopenharmony_ci "mcr p15, 0, %0, c15, c1, 0\n\t" 198c2ecf20Sopenharmony_ci : "=r"(temp)); 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci return 0; 228c2ecf20Sopenharmony_ci} 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* permit kernel space cp6 access 258c2ecf20Sopenharmony_ci * deny user space cp6 access 268c2ecf20Sopenharmony_ci */ 278c2ecf20Sopenharmony_cistatic struct undef_hook cp6_hook = { 288c2ecf20Sopenharmony_ci .instr_mask = 0x0f000ff0, 298c2ecf20Sopenharmony_ci .instr_val = 0x0e000610, 308c2ecf20Sopenharmony_ci .cpsr_mask = MODE_MASK, 318c2ecf20Sopenharmony_ci .cpsr_val = SVC_MODE, 328c2ecf20Sopenharmony_ci .fn = cp6_trap, 338c2ecf20Sopenharmony_ci}; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_civoid __init iop_init_cp6_handler(void) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci register_undef_hook(&cp6_hook); 388c2ecf20Sopenharmony_ci} 39