Linux Audio

Check our new training course

Loading...
v4.17
   1/*
   2 * Handle unaligned accesses by emulation.
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License.  See the file "COPYING" in the main directory of this archive
   6 * for more details.
   7 *
   8 * Copyright (C) 1996, 1998, 1999, 2002 by Ralf Baechle
   9 * Copyright (C) 1999 Silicon Graphics, Inc.
  10 * Copyright (C) 2014 Imagination Technologies Ltd.
  11 *
  12 * This file contains exception handler for address error exception with the
  13 * special capability to execute faulting instructions in software.  The
  14 * handler does not try to handle the case when the program counter points
  15 * to an address not aligned to a word boundary.
  16 *
  17 * Putting data to unaligned addresses is a bad practice even on Intel where
  18 * only the performance is affected.  Much worse is that such code is non-
  19 * portable.  Due to several programs that die on MIPS due to alignment
  20 * problems I decided to implement this handler anyway though I originally
  21 * didn't intend to do this at all for user code.
  22 *
  23 * For now I enable fixing of address errors by default to make life easier.
  24 * I however intend to disable this somewhen in the future when the alignment
  25 * problems with user programs have been fixed.	 For programmers this is the
  26 * right way to go.
  27 *
  28 * Fixing address errors is a per process option.  The option is inherited
  29 * across fork(2) and execve(2) calls.	If you really want to use the
  30 * option in your user programs - I discourage the use of the software
  31 * emulation strongly - use the following code in your userland stuff:
  32 *
  33 * #include <sys/sysmips.h>
  34 *
  35 * ...
  36 * sysmips(MIPS_FIXADE, x);
  37 * ...
  38 *
  39 * The argument x is 0 for disabling software emulation, enabled otherwise.
  40 *
  41 * Below a little program to play around with this feature.
  42 *
  43 * #include <stdio.h>
  44 * #include <sys/sysmips.h>
  45 *
  46 * struct foo {
  47 *	   unsigned char bar[8];
  48 * };
  49 *
  50 * main(int argc, char *argv[])
  51 * {
  52 *	   struct foo x = {0, 1, 2, 3, 4, 5, 6, 7};
  53 *	   unsigned int *p = (unsigned int *) (x.bar + 3);
  54 *	   int i;
  55 *
  56 *	   if (argc > 1)
  57 *		   sysmips(MIPS_FIXADE, atoi(argv[1]));
  58 *
  59 *	   printf("*p = %08lx\n", *p);
  60 *
  61 *	   *p = 0xdeadface;
  62 *
  63 *	   for(i = 0; i <= 7; i++)
  64 *	   printf("%02x ", x.bar[i]);
  65 *	   printf("\n");
  66 * }
  67 *
  68 * Coprocessor loads are not supported; I think this case is unimportant
  69 * in the practice.
  70 *
  71 * TODO: Handle ndc (attempted store to doubleword in uncached memory)
  72 *	 exception for the R6000.
  73 *	 A store crossing a page boundary might be executed only partially.
  74 *	 Undo the partial store in this case.
  75 */
  76#include <linux/context_tracking.h>
  77#include <linux/mm.h>
  78#include <linux/signal.h>
  79#include <linux/smp.h>
  80#include <linux/sched.h>
  81#include <linux/debugfs.h>
  82#include <linux/perf_event.h>
  83
  84#include <asm/asm.h>
  85#include <asm/branch.h>
  86#include <asm/byteorder.h>
  87#include <asm/cop2.h>
  88#include <asm/debug.h>
  89#include <asm/fpu.h>
  90#include <asm/fpu_emulator.h>
  91#include <asm/inst.h>
  92#include <linux/uaccess.h>
 
 
  93
  94#define STR(x)	__STR(x)
  95#define __STR(x)  #x
  96
  97enum {
  98	UNALIGNED_ACTION_QUIET,
  99	UNALIGNED_ACTION_SIGNAL,
 100	UNALIGNED_ACTION_SHOW,
 101};
 102#ifdef CONFIG_DEBUG_FS
 103static u32 unaligned_instructions;
 104static u32 unaligned_action;
 105#else
 106#define unaligned_action UNALIGNED_ACTION_QUIET
 107#endif
 108extern void show_registers(struct pt_regs *regs);
 109
 110#ifdef __BIG_ENDIAN
 111#define     _LoadHW(addr, value, res, type)  \
 112do {                                                        \
 113		__asm__ __volatile__ (".set\tnoat\n"        \
 114			"1:\t"type##_lb("%0", "0(%2)")"\n"  \
 115			"2:\t"type##_lbu("$1", "1(%2)")"\n\t"\
 116			"sll\t%0, 0x8\n\t"                  \
 117			"or\t%0, $1\n\t"                    \
 118			"li\t%1, 0\n"                       \
 119			"3:\t.set\tat\n\t"                  \
 120			".insn\n\t"                         \
 121			".section\t.fixup,\"ax\"\n\t"       \
 122			"4:\tli\t%1, %3\n\t"                \
 123			"j\t3b\n\t"                         \
 124			".previous\n\t"                     \
 125			".section\t__ex_table,\"a\"\n\t"    \
 126			STR(PTR)"\t1b, 4b\n\t"              \
 127			STR(PTR)"\t2b, 4b\n\t"              \
 128			".previous"                         \
 129			: "=&r" (value), "=r" (res)         \
 130			: "r" (addr), "i" (-EFAULT));       \
 131} while(0)
 132
 133#ifndef CONFIG_CPU_MIPSR6
 134#define     _LoadW(addr, value, res, type)   \
 135do {                                                        \
 136		__asm__ __volatile__ (                      \
 137			"1:\t"type##_lwl("%0", "(%2)")"\n"   \
 138			"2:\t"type##_lwr("%0", "3(%2)")"\n\t"\
 139			"li\t%1, 0\n"                       \
 140			"3:\n\t"                            \
 141			".insn\n\t"                         \
 142			".section\t.fixup,\"ax\"\n\t"       \
 143			"4:\tli\t%1, %3\n\t"                \
 144			"j\t3b\n\t"                         \
 145			".previous\n\t"                     \
 146			".section\t__ex_table,\"a\"\n\t"    \
 147			STR(PTR)"\t1b, 4b\n\t"              \
 148			STR(PTR)"\t2b, 4b\n\t"              \
 149			".previous"                         \
 150			: "=&r" (value), "=r" (res)         \
 151			: "r" (addr), "i" (-EFAULT));       \
 152} while(0)
 153
 154#else
 155/* MIPSR6 has no lwl instruction */
 156#define     _LoadW(addr, value, res, type) \
 157do {                                                        \
 158		__asm__ __volatile__ (			    \
 159			".set\tpush\n"			    \
 160			".set\tnoat\n\t"		    \
 161			"1:"type##_lb("%0", "0(%2)")"\n\t"  \
 162			"2:"type##_lbu("$1", "1(%2)")"\n\t" \
 163			"sll\t%0, 0x8\n\t"		    \
 164			"or\t%0, $1\n\t"		    \
 165			"3:"type##_lbu("$1", "2(%2)")"\n\t" \
 166			"sll\t%0, 0x8\n\t"		    \
 167			"or\t%0, $1\n\t"		    \
 168			"4:"type##_lbu("$1", "3(%2)")"\n\t" \
 169			"sll\t%0, 0x8\n\t"		    \
 170			"or\t%0, $1\n\t"		    \
 171			"li\t%1, 0\n"			    \
 172			".set\tpop\n"			    \
 173			"10:\n\t"			    \
 174			".insn\n\t"			    \
 175			".section\t.fixup,\"ax\"\n\t"	    \
 176			"11:\tli\t%1, %3\n\t"		    \
 177			"j\t10b\n\t"			    \
 178			".previous\n\t"			    \
 179			".section\t__ex_table,\"a\"\n\t"    \
 180			STR(PTR)"\t1b, 11b\n\t"		    \
 181			STR(PTR)"\t2b, 11b\n\t"		    \
 182			STR(PTR)"\t3b, 11b\n\t"		    \
 183			STR(PTR)"\t4b, 11b\n\t"		    \
 184			".previous"			    \
 185			: "=&r" (value), "=r" (res)	    \
 186			: "r" (addr), "i" (-EFAULT));       \
 187} while(0)
 188
 189#endif /* CONFIG_CPU_MIPSR6 */
 190
 191#define     _LoadHWU(addr, value, res, type) \
 192do {                                                        \
 193		__asm__ __volatile__ (                      \
 194			".set\tnoat\n"                      \
 195			"1:\t"type##_lbu("%0", "0(%2)")"\n" \
 196			"2:\t"type##_lbu("$1", "1(%2)")"\n\t"\
 197			"sll\t%0, 0x8\n\t"                  \
 198			"or\t%0, $1\n\t"                    \
 199			"li\t%1, 0\n"                       \
 200			"3:\n\t"                            \
 201			".insn\n\t"                         \
 202			".set\tat\n\t"                      \
 203			".section\t.fixup,\"ax\"\n\t"       \
 204			"4:\tli\t%1, %3\n\t"                \
 205			"j\t3b\n\t"                         \
 206			".previous\n\t"                     \
 207			".section\t__ex_table,\"a\"\n\t"    \
 208			STR(PTR)"\t1b, 4b\n\t"              \
 209			STR(PTR)"\t2b, 4b\n\t"              \
 210			".previous"                         \
 211			: "=&r" (value), "=r" (res)         \
 212			: "r" (addr), "i" (-EFAULT));       \
 213} while(0)
 214
 215#ifndef CONFIG_CPU_MIPSR6
 216#define     _LoadWU(addr, value, res, type)  \
 217do {                                                        \
 218		__asm__ __volatile__ (                      \
 219			"1:\t"type##_lwl("%0", "(%2)")"\n"  \
 220			"2:\t"type##_lwr("%0", "3(%2)")"\n\t"\
 221			"dsll\t%0, %0, 32\n\t"              \
 222			"dsrl\t%0, %0, 32\n\t"              \
 223			"li\t%1, 0\n"                       \
 224			"3:\n\t"                            \
 225			".insn\n\t"                         \
 226			"\t.section\t.fixup,\"ax\"\n\t"     \
 227			"4:\tli\t%1, %3\n\t"                \
 228			"j\t3b\n\t"                         \
 229			".previous\n\t"                     \
 230			".section\t__ex_table,\"a\"\n\t"    \
 231			STR(PTR)"\t1b, 4b\n\t"              \
 232			STR(PTR)"\t2b, 4b\n\t"              \
 233			".previous"                         \
 234			: "=&r" (value), "=r" (res)         \
 235			: "r" (addr), "i" (-EFAULT));       \
 236} while(0)
 237
 238#define     _LoadDW(addr, value, res)  \
 239do {                                                        \
 240		__asm__ __volatile__ (                      \
 241			"1:\tldl\t%0, (%2)\n"               \
 242			"2:\tldr\t%0, 7(%2)\n\t"            \
 243			"li\t%1, 0\n"                       \
 244			"3:\n\t"                            \
 245			".insn\n\t"                         \
 246			"\t.section\t.fixup,\"ax\"\n\t"     \
 247			"4:\tli\t%1, %3\n\t"                \
 248			"j\t3b\n\t"                         \
 249			".previous\n\t"                     \
 250			".section\t__ex_table,\"a\"\n\t"    \
 251			STR(PTR)"\t1b, 4b\n\t"              \
 252			STR(PTR)"\t2b, 4b\n\t"              \
 253			".previous"                         \
 254			: "=&r" (value), "=r" (res)         \
 255			: "r" (addr), "i" (-EFAULT));       \
 256} while(0)
 257
 258#else
 259/* MIPSR6 has not lwl and ldl instructions */
 260#define	    _LoadWU(addr, value, res, type) \
 261do {                                                        \
 262		__asm__ __volatile__ (			    \
 263			".set\tpush\n\t"		    \
 264			".set\tnoat\n\t"		    \
 265			"1:"type##_lbu("%0", "0(%2)")"\n\t" \
 266			"2:"type##_lbu("$1", "1(%2)")"\n\t" \
 267			"sll\t%0, 0x8\n\t"		    \
 268			"or\t%0, $1\n\t"		    \
 269			"3:"type##_lbu("$1", "2(%2)")"\n\t" \
 270			"sll\t%0, 0x8\n\t"		    \
 271			"or\t%0, $1\n\t"		    \
 272			"4:"type##_lbu("$1", "3(%2)")"\n\t" \
 273			"sll\t%0, 0x8\n\t"		    \
 274			"or\t%0, $1\n\t"		    \
 275			"li\t%1, 0\n"			    \
 276			".set\tpop\n"			    \
 277			"10:\n\t"			    \
 278			".insn\n\t"			    \
 279			".section\t.fixup,\"ax\"\n\t"	    \
 280			"11:\tli\t%1, %3\n\t"		    \
 281			"j\t10b\n\t"			    \
 282			".previous\n\t"			    \
 283			".section\t__ex_table,\"a\"\n\t"    \
 284			STR(PTR)"\t1b, 11b\n\t"		    \
 285			STR(PTR)"\t2b, 11b\n\t"		    \
 286			STR(PTR)"\t3b, 11b\n\t"		    \
 287			STR(PTR)"\t4b, 11b\n\t"		    \
 288			".previous"			    \
 289			: "=&r" (value), "=r" (res)	    \
 290			: "r" (addr), "i" (-EFAULT));       \
 291} while(0)
 292
 293#define     _LoadDW(addr, value, res)  \
 294do {                                                        \
 295		__asm__ __volatile__ (			    \
 296			".set\tpush\n\t"		    \
 297			".set\tnoat\n\t"		    \
 298			"1:lb\t%0, 0(%2)\n\t"    	    \
 299			"2:lbu\t $1, 1(%2)\n\t"   	    \
 300			"dsll\t%0, 0x8\n\t"		    \
 301			"or\t%0, $1\n\t"		    \
 302			"3:lbu\t$1, 2(%2)\n\t"   	    \
 303			"dsll\t%0, 0x8\n\t"		    \
 304			"or\t%0, $1\n\t"		    \
 305			"4:lbu\t$1, 3(%2)\n\t"   	    \
 306			"dsll\t%0, 0x8\n\t"		    \
 307			"or\t%0, $1\n\t"		    \
 308			"5:lbu\t$1, 4(%2)\n\t"   	    \
 309			"dsll\t%0, 0x8\n\t"		    \
 310			"or\t%0, $1\n\t"		    \
 311			"6:lbu\t$1, 5(%2)\n\t"   	    \
 312			"dsll\t%0, 0x8\n\t"		    \
 313			"or\t%0, $1\n\t"		    \
 314			"7:lbu\t$1, 6(%2)\n\t"   	    \
 315			"dsll\t%0, 0x8\n\t"		    \
 316			"or\t%0, $1\n\t"		    \
 317			"8:lbu\t$1, 7(%2)\n\t"   	    \
 318			"dsll\t%0, 0x8\n\t"		    \
 319			"or\t%0, $1\n\t"		    \
 320			"li\t%1, 0\n"			    \
 321			".set\tpop\n\t"			    \
 322			"10:\n\t"			    \
 323			".insn\n\t"			    \
 324			".section\t.fixup,\"ax\"\n\t"	    \
 325			"11:\tli\t%1, %3\n\t"		    \
 326			"j\t10b\n\t"			    \
 327			".previous\n\t"			    \
 328			".section\t__ex_table,\"a\"\n\t"    \
 329			STR(PTR)"\t1b, 11b\n\t"		    \
 330			STR(PTR)"\t2b, 11b\n\t"		    \
 331			STR(PTR)"\t3b, 11b\n\t"		    \
 332			STR(PTR)"\t4b, 11b\n\t"		    \
 333			STR(PTR)"\t5b, 11b\n\t"		    \
 334			STR(PTR)"\t6b, 11b\n\t"		    \
 335			STR(PTR)"\t7b, 11b\n\t"		    \
 336			STR(PTR)"\t8b, 11b\n\t"		    \
 337			".previous"			    \
 338			: "=&r" (value), "=r" (res)	    \
 339			: "r" (addr), "i" (-EFAULT));       \
 340} while(0)
 341
 342#endif /* CONFIG_CPU_MIPSR6 */
 343
 344
 345#define     _StoreHW(addr, value, res, type) \
 346do {                                                        \
 347		__asm__ __volatile__ (                      \
 348			".set\tnoat\n"                      \
 349			"1:\t"type##_sb("%1", "1(%2)")"\n"  \
 350			"srl\t$1, %1, 0x8\n"                \
 351			"2:\t"type##_sb("$1", "0(%2)")"\n"  \
 352			".set\tat\n\t"                      \
 353			"li\t%0, 0\n"                       \
 354			"3:\n\t"                            \
 355			".insn\n\t"                         \
 356			".section\t.fixup,\"ax\"\n\t"       \
 357			"4:\tli\t%0, %3\n\t"                \
 358			"j\t3b\n\t"                         \
 359			".previous\n\t"                     \
 360			".section\t__ex_table,\"a\"\n\t"    \
 361			STR(PTR)"\t1b, 4b\n\t"              \
 362			STR(PTR)"\t2b, 4b\n\t"              \
 363			".previous"                         \
 364			: "=r" (res)                        \
 365			: "r" (value), "r" (addr), "i" (-EFAULT));\
 366} while(0)
 367
 368#ifndef CONFIG_CPU_MIPSR6
 369#define     _StoreW(addr, value, res, type)  \
 370do {                                                        \
 371		__asm__ __volatile__ (                      \
 372			"1:\t"type##_swl("%1", "(%2)")"\n"  \
 373			"2:\t"type##_swr("%1", "3(%2)")"\n\t"\
 374			"li\t%0, 0\n"                       \
 375			"3:\n\t"                            \
 376			".insn\n\t"                         \
 377			".section\t.fixup,\"ax\"\n\t"       \
 378			"4:\tli\t%0, %3\n\t"                \
 379			"j\t3b\n\t"                         \
 380			".previous\n\t"                     \
 381			".section\t__ex_table,\"a\"\n\t"    \
 382			STR(PTR)"\t1b, 4b\n\t"              \
 383			STR(PTR)"\t2b, 4b\n\t"              \
 384			".previous"                         \
 385		: "=r" (res)                                \
 386		: "r" (value), "r" (addr), "i" (-EFAULT));  \
 387} while(0)
 388
 389#define     _StoreDW(addr, value, res) \
 390do {                                                        \
 391		__asm__ __volatile__ (                      \
 392			"1:\tsdl\t%1,(%2)\n"                \
 393			"2:\tsdr\t%1, 7(%2)\n\t"            \
 394			"li\t%0, 0\n"                       \
 395			"3:\n\t"                            \
 396			".insn\n\t"                         \
 397			".section\t.fixup,\"ax\"\n\t"       \
 398			"4:\tli\t%0, %3\n\t"                \
 399			"j\t3b\n\t"                         \
 400			".previous\n\t"                     \
 401			".section\t__ex_table,\"a\"\n\t"    \
 402			STR(PTR)"\t1b, 4b\n\t"              \
 403			STR(PTR)"\t2b, 4b\n\t"              \
 404			".previous"                         \
 405		: "=r" (res)                                \
 406		: "r" (value), "r" (addr), "i" (-EFAULT));  \
 407} while(0)
 408
 409#else
 410/* MIPSR6 has no swl and sdl instructions */
 411#define     _StoreW(addr, value, res, type)  \
 412do {                                                        \
 413		__asm__ __volatile__ (                      \
 414			".set\tpush\n\t"		    \
 415			".set\tnoat\n\t"		    \
 416			"1:"type##_sb("%1", "3(%2)")"\n\t"  \
 417			"srl\t$1, %1, 0x8\n\t"		    \
 418			"2:"type##_sb("$1", "2(%2)")"\n\t"  \
 419			"srl\t$1, $1,  0x8\n\t"		    \
 420			"3:"type##_sb("$1", "1(%2)")"\n\t"  \
 421			"srl\t$1, $1, 0x8\n\t"		    \
 422			"4:"type##_sb("$1", "0(%2)")"\n\t"  \
 423			".set\tpop\n\t"			    \
 424			"li\t%0, 0\n"			    \
 425			"10:\n\t"			    \
 426			".insn\n\t"			    \
 427			".section\t.fixup,\"ax\"\n\t"	    \
 428			"11:\tli\t%0, %3\n\t"		    \
 429			"j\t10b\n\t"			    \
 430			".previous\n\t"			    \
 431			".section\t__ex_table,\"a\"\n\t"    \
 432			STR(PTR)"\t1b, 11b\n\t"		    \
 433			STR(PTR)"\t2b, 11b\n\t"		    \
 434			STR(PTR)"\t3b, 11b\n\t"		    \
 435			STR(PTR)"\t4b, 11b\n\t"		    \
 436			".previous"			    \
 437		: "=&r" (res)			    	    \
 438		: "r" (value), "r" (addr), "i" (-EFAULT)    \
 439		: "memory");                                \
 440} while(0)
 441
 442#define     _StoreDW(addr, value, res) \
 443do {                                                        \
 444		__asm__ __volatile__ (                      \
 445			".set\tpush\n\t"		    \
 446			".set\tnoat\n\t"		    \
 447			"1:sb\t%1, 7(%2)\n\t"    	    \
 448			"dsrl\t$1, %1, 0x8\n\t"		    \
 449			"2:sb\t$1, 6(%2)\n\t"    	    \
 450			"dsrl\t$1, $1, 0x8\n\t"		    \
 451			"3:sb\t$1, 5(%2)\n\t"    	    \
 452			"dsrl\t$1, $1, 0x8\n\t"		    \
 453			"4:sb\t$1, 4(%2)\n\t"    	    \
 454			"dsrl\t$1, $1, 0x8\n\t"		    \
 455			"5:sb\t$1, 3(%2)\n\t"    	    \
 456			"dsrl\t$1, $1, 0x8\n\t"		    \
 457			"6:sb\t$1, 2(%2)\n\t"    	    \
 458			"dsrl\t$1, $1, 0x8\n\t"		    \
 459			"7:sb\t$1, 1(%2)\n\t"    	    \
 460			"dsrl\t$1, $1, 0x8\n\t"		    \
 461			"8:sb\t$1, 0(%2)\n\t"    	    \
 462			"dsrl\t$1, $1, 0x8\n\t"		    \
 463			".set\tpop\n\t"			    \
 464			"li\t%0, 0\n"			    \
 465			"10:\n\t"			    \
 466			".insn\n\t"			    \
 467			".section\t.fixup,\"ax\"\n\t"	    \
 468			"11:\tli\t%0, %3\n\t"		    \
 469			"j\t10b\n\t"			    \
 470			".previous\n\t"			    \
 471			".section\t__ex_table,\"a\"\n\t"    \
 472			STR(PTR)"\t1b, 11b\n\t"		    \
 473			STR(PTR)"\t2b, 11b\n\t"		    \
 474			STR(PTR)"\t3b, 11b\n\t"		    \
 475			STR(PTR)"\t4b, 11b\n\t"		    \
 476			STR(PTR)"\t5b, 11b\n\t"		    \
 477			STR(PTR)"\t6b, 11b\n\t"		    \
 478			STR(PTR)"\t7b, 11b\n\t"		    \
 479			STR(PTR)"\t8b, 11b\n\t"		    \
 480			".previous"			    \
 481		: "=&r" (res)			    	    \
 482		: "r" (value), "r" (addr), "i" (-EFAULT)    \
 483		: "memory");                                \
 484} while(0)
 485
 486#endif /* CONFIG_CPU_MIPSR6 */
 487
 488#else /* __BIG_ENDIAN */
 489
 490#define     _LoadHW(addr, value, res, type)  \
 491do {                                                        \
 492		__asm__ __volatile__ (".set\tnoat\n"        \
 493			"1:\t"type##_lb("%0", "1(%2)")"\n"  \
 494			"2:\t"type##_lbu("$1", "0(%2)")"\n\t"\
 495			"sll\t%0, 0x8\n\t"                  \
 496			"or\t%0, $1\n\t"                    \
 497			"li\t%1, 0\n"                       \
 498			"3:\t.set\tat\n\t"                  \
 499			".insn\n\t"                         \
 500			".section\t.fixup,\"ax\"\n\t"       \
 501			"4:\tli\t%1, %3\n\t"                \
 502			"j\t3b\n\t"                         \
 503			".previous\n\t"                     \
 504			".section\t__ex_table,\"a\"\n\t"    \
 505			STR(PTR)"\t1b, 4b\n\t"              \
 506			STR(PTR)"\t2b, 4b\n\t"              \
 507			".previous"                         \
 508			: "=&r" (value), "=r" (res)         \
 509			: "r" (addr), "i" (-EFAULT));       \
 510} while(0)
 511
 512#ifndef CONFIG_CPU_MIPSR6
 513#define     _LoadW(addr, value, res, type)   \
 514do {                                                        \
 515		__asm__ __volatile__ (                      \
 516			"1:\t"type##_lwl("%0", "3(%2)")"\n" \
 517			"2:\t"type##_lwr("%0", "(%2)")"\n\t"\
 518			"li\t%1, 0\n"                       \
 519			"3:\n\t"                            \
 520			".insn\n\t"                         \
 521			".section\t.fixup,\"ax\"\n\t"       \
 522			"4:\tli\t%1, %3\n\t"                \
 523			"j\t3b\n\t"                         \
 524			".previous\n\t"                     \
 525			".section\t__ex_table,\"a\"\n\t"    \
 526			STR(PTR)"\t1b, 4b\n\t"              \
 527			STR(PTR)"\t2b, 4b\n\t"              \
 528			".previous"                         \
 529			: "=&r" (value), "=r" (res)         \
 530			: "r" (addr), "i" (-EFAULT));       \
 531} while(0)
 532
 533#else
 534/* MIPSR6 has no lwl instruction */
 535#define     _LoadW(addr, value, res, type) \
 536do {                                                        \
 537		__asm__ __volatile__ (			    \
 538			".set\tpush\n"			    \
 539			".set\tnoat\n\t"		    \
 540			"1:"type##_lb("%0", "3(%2)")"\n\t"  \
 541			"2:"type##_lbu("$1", "2(%2)")"\n\t" \
 542			"sll\t%0, 0x8\n\t"		    \
 543			"or\t%0, $1\n\t"		    \
 544			"3:"type##_lbu("$1", "1(%2)")"\n\t" \
 545			"sll\t%0, 0x8\n\t"		    \
 546			"or\t%0, $1\n\t"		    \
 547			"4:"type##_lbu("$1", "0(%2)")"\n\t" \
 548			"sll\t%0, 0x8\n\t"		    \
 549			"or\t%0, $1\n\t"		    \
 550			"li\t%1, 0\n"			    \
 551			".set\tpop\n"			    \
 552			"10:\n\t"			    \
 553			".insn\n\t"			    \
 554			".section\t.fixup,\"ax\"\n\t"	    \
 555			"11:\tli\t%1, %3\n\t"		    \
 556			"j\t10b\n\t"			    \
 557			".previous\n\t"			    \
 558			".section\t__ex_table,\"a\"\n\t"    \
 559			STR(PTR)"\t1b, 11b\n\t"		    \
 560			STR(PTR)"\t2b, 11b\n\t"		    \
 561			STR(PTR)"\t3b, 11b\n\t"		    \
 562			STR(PTR)"\t4b, 11b\n\t"		    \
 563			".previous"			    \
 564			: "=&r" (value), "=r" (res)	    \
 565			: "r" (addr), "i" (-EFAULT));       \
 566} while(0)
 567
 568#endif /* CONFIG_CPU_MIPSR6 */
 569
 570
 571#define     _LoadHWU(addr, value, res, type) \
 572do {                                                        \
 573		__asm__ __volatile__ (                      \
 574			".set\tnoat\n"                      \
 575			"1:\t"type##_lbu("%0", "1(%2)")"\n" \
 576			"2:\t"type##_lbu("$1", "0(%2)")"\n\t"\
 577			"sll\t%0, 0x8\n\t"                  \
 578			"or\t%0, $1\n\t"                    \
 579			"li\t%1, 0\n"                       \
 580			"3:\n\t"                            \
 581			".insn\n\t"                         \
 582			".set\tat\n\t"                      \
 583			".section\t.fixup,\"ax\"\n\t"       \
 584			"4:\tli\t%1, %3\n\t"                \
 585			"j\t3b\n\t"                         \
 586			".previous\n\t"                     \
 587			".section\t__ex_table,\"a\"\n\t"    \
 588			STR(PTR)"\t1b, 4b\n\t"              \
 589			STR(PTR)"\t2b, 4b\n\t"              \
 590			".previous"                         \
 591			: "=&r" (value), "=r" (res)         \
 592			: "r" (addr), "i" (-EFAULT));       \
 593} while(0)
 594
 595#ifndef CONFIG_CPU_MIPSR6
 596#define     _LoadWU(addr, value, res, type)  \
 597do {                                                        \
 598		__asm__ __volatile__ (                      \
 599			"1:\t"type##_lwl("%0", "3(%2)")"\n" \
 600			"2:\t"type##_lwr("%0", "(%2)")"\n\t"\
 601			"dsll\t%0, %0, 32\n\t"              \
 602			"dsrl\t%0, %0, 32\n\t"              \
 603			"li\t%1, 0\n"                       \
 604			"3:\n\t"                            \
 605			".insn\n\t"                         \
 606			"\t.section\t.fixup,\"ax\"\n\t"     \
 607			"4:\tli\t%1, %3\n\t"                \
 608			"j\t3b\n\t"                         \
 609			".previous\n\t"                     \
 610			".section\t__ex_table,\"a\"\n\t"    \
 611			STR(PTR)"\t1b, 4b\n\t"              \
 612			STR(PTR)"\t2b, 4b\n\t"              \
 613			".previous"                         \
 614			: "=&r" (value), "=r" (res)         \
 615			: "r" (addr), "i" (-EFAULT));       \
 616} while(0)
 617
 618#define     _LoadDW(addr, value, res)  \
 619do {                                                        \
 620		__asm__ __volatile__ (                      \
 621			"1:\tldl\t%0, 7(%2)\n"              \
 622			"2:\tldr\t%0, (%2)\n\t"             \
 623			"li\t%1, 0\n"                       \
 624			"3:\n\t"                            \
 625			".insn\n\t"                         \
 626			"\t.section\t.fixup,\"ax\"\n\t"     \
 627			"4:\tli\t%1, %3\n\t"                \
 628			"j\t3b\n\t"                         \
 629			".previous\n\t"                     \
 630			".section\t__ex_table,\"a\"\n\t"    \
 631			STR(PTR)"\t1b, 4b\n\t"              \
 632			STR(PTR)"\t2b, 4b\n\t"              \
 633			".previous"                         \
 634			: "=&r" (value), "=r" (res)         \
 635			: "r" (addr), "i" (-EFAULT));       \
 636} while(0)
 637
 638#else
 639/* MIPSR6 has not lwl and ldl instructions */
 640#define	    _LoadWU(addr, value, res, type) \
 641do {                                                        \
 642		__asm__ __volatile__ (			    \
 643			".set\tpush\n\t"		    \
 644			".set\tnoat\n\t"		    \
 645			"1:"type##_lbu("%0", "3(%2)")"\n\t" \
 646			"2:"type##_lbu("$1", "2(%2)")"\n\t" \
 647			"sll\t%0, 0x8\n\t"		    \
 648			"or\t%0, $1\n\t"		    \
 649			"3:"type##_lbu("$1", "1(%2)")"\n\t" \
 650			"sll\t%0, 0x8\n\t"		    \
 651			"or\t%0, $1\n\t"		    \
 652			"4:"type##_lbu("$1", "0(%2)")"\n\t" \
 653			"sll\t%0, 0x8\n\t"		    \
 654			"or\t%0, $1\n\t"		    \
 655			"li\t%1, 0\n"			    \
 656			".set\tpop\n"			    \
 657			"10:\n\t"			    \
 658			".insn\n\t"			    \
 659			".section\t.fixup,\"ax\"\n\t"	    \
 660			"11:\tli\t%1, %3\n\t"		    \
 661			"j\t10b\n\t"			    \
 662			".previous\n\t"			    \
 663			".section\t__ex_table,\"a\"\n\t"    \
 664			STR(PTR)"\t1b, 11b\n\t"		    \
 665			STR(PTR)"\t2b, 11b\n\t"		    \
 666			STR(PTR)"\t3b, 11b\n\t"		    \
 667			STR(PTR)"\t4b, 11b\n\t"		    \
 668			".previous"			    \
 669			: "=&r" (value), "=r" (res)	    \
 670			: "r" (addr), "i" (-EFAULT));       \
 671} while(0)
 672
 673#define     _LoadDW(addr, value, res)  \
 674do {                                                        \
 675		__asm__ __volatile__ (			    \
 676			".set\tpush\n\t"		    \
 677			".set\tnoat\n\t"		    \
 678			"1:lb\t%0, 7(%2)\n\t"    	    \
 679			"2:lbu\t$1, 6(%2)\n\t"   	    \
 680			"dsll\t%0, 0x8\n\t"		    \
 681			"or\t%0, $1\n\t"		    \
 682			"3:lbu\t$1, 5(%2)\n\t"   	    \
 683			"dsll\t%0, 0x8\n\t"		    \
 684			"or\t%0, $1\n\t"		    \
 685			"4:lbu\t$1, 4(%2)\n\t"   	    \
 686			"dsll\t%0, 0x8\n\t"		    \
 687			"or\t%0, $1\n\t"		    \
 688			"5:lbu\t$1, 3(%2)\n\t"   	    \
 689			"dsll\t%0, 0x8\n\t"		    \
 690			"or\t%0, $1\n\t"		    \
 691			"6:lbu\t$1, 2(%2)\n\t"   	    \
 692			"dsll\t%0, 0x8\n\t"		    \
 693			"or\t%0, $1\n\t"		    \
 694			"7:lbu\t$1, 1(%2)\n\t"   	    \
 695			"dsll\t%0, 0x8\n\t"		    \
 696			"or\t%0, $1\n\t"		    \
 697			"8:lbu\t$1, 0(%2)\n\t"   	    \
 698			"dsll\t%0, 0x8\n\t"		    \
 699			"or\t%0, $1\n\t"		    \
 700			"li\t%1, 0\n"			    \
 701			".set\tpop\n\t"			    \
 702			"10:\n\t"			    \
 703			".insn\n\t"			    \
 704			".section\t.fixup,\"ax\"\n\t"	    \
 705			"11:\tli\t%1, %3\n\t"		    \
 706			"j\t10b\n\t"			    \
 707			".previous\n\t"			    \
 708			".section\t__ex_table,\"a\"\n\t"    \
 709			STR(PTR)"\t1b, 11b\n\t"		    \
 710			STR(PTR)"\t2b, 11b\n\t"		    \
 711			STR(PTR)"\t3b, 11b\n\t"		    \
 712			STR(PTR)"\t4b, 11b\n\t"		    \
 713			STR(PTR)"\t5b, 11b\n\t"		    \
 714			STR(PTR)"\t6b, 11b\n\t"		    \
 715			STR(PTR)"\t7b, 11b\n\t"		    \
 716			STR(PTR)"\t8b, 11b\n\t"		    \
 717			".previous"			    \
 718			: "=&r" (value), "=r" (res)	    \
 719			: "r" (addr), "i" (-EFAULT));       \
 720} while(0)
 721#endif /* CONFIG_CPU_MIPSR6 */
 722
 723#define     _StoreHW(addr, value, res, type) \
 724do {                                                        \
 725		__asm__ __volatile__ (                      \
 726			".set\tnoat\n"                      \
 727			"1:\t"type##_sb("%1", "0(%2)")"\n"  \
 728			"srl\t$1,%1, 0x8\n"                 \
 729			"2:\t"type##_sb("$1", "1(%2)")"\n"  \
 730			".set\tat\n\t"                      \
 731			"li\t%0, 0\n"                       \
 732			"3:\n\t"                            \
 733			".insn\n\t"                         \
 734			".section\t.fixup,\"ax\"\n\t"       \
 735			"4:\tli\t%0, %3\n\t"                \
 736			"j\t3b\n\t"                         \
 737			".previous\n\t"                     \
 738			".section\t__ex_table,\"a\"\n\t"    \
 739			STR(PTR)"\t1b, 4b\n\t"              \
 740			STR(PTR)"\t2b, 4b\n\t"              \
 741			".previous"                         \
 742			: "=r" (res)                        \
 743			: "r" (value), "r" (addr), "i" (-EFAULT));\
 744} while(0)
 745
 746#ifndef CONFIG_CPU_MIPSR6
 747#define     _StoreW(addr, value, res, type)  \
 748do {                                                        \
 749		__asm__ __volatile__ (                      \
 750			"1:\t"type##_swl("%1", "3(%2)")"\n" \
 751			"2:\t"type##_swr("%1", "(%2)")"\n\t"\
 752			"li\t%0, 0\n"                       \
 753			"3:\n\t"                            \
 754			".insn\n\t"                         \
 755			".section\t.fixup,\"ax\"\n\t"       \
 756			"4:\tli\t%0, %3\n\t"                \
 757			"j\t3b\n\t"                         \
 758			".previous\n\t"                     \
 759			".section\t__ex_table,\"a\"\n\t"    \
 760			STR(PTR)"\t1b, 4b\n\t"              \
 761			STR(PTR)"\t2b, 4b\n\t"              \
 762			".previous"                         \
 763		: "=r" (res)                                \
 764		: "r" (value), "r" (addr), "i" (-EFAULT));  \
 765} while(0)
 766
 767#define     _StoreDW(addr, value, res) \
 768do {                                                        \
 769		__asm__ __volatile__ (                      \
 770			"1:\tsdl\t%1, 7(%2)\n"              \
 771			"2:\tsdr\t%1, (%2)\n\t"             \
 772			"li\t%0, 0\n"                       \
 773			"3:\n\t"                            \
 774			".insn\n\t"                         \
 775			".section\t.fixup,\"ax\"\n\t"       \
 776			"4:\tli\t%0, %3\n\t"                \
 777			"j\t3b\n\t"                         \
 778			".previous\n\t"                     \
 779			".section\t__ex_table,\"a\"\n\t"    \
 780			STR(PTR)"\t1b, 4b\n\t"              \
 781			STR(PTR)"\t2b, 4b\n\t"              \
 782			".previous"                         \
 783		: "=r" (res)                                \
 784		: "r" (value), "r" (addr), "i" (-EFAULT));  \
 785} while(0)
 786
 787#else
 788/* MIPSR6 has no swl and sdl instructions */
 789#define     _StoreW(addr, value, res, type)  \
 790do {                                                        \
 791		__asm__ __volatile__ (                      \
 792			".set\tpush\n\t"		    \
 793			".set\tnoat\n\t"		    \
 794			"1:"type##_sb("%1", "0(%2)")"\n\t"  \
 795			"srl\t$1, %1, 0x8\n\t"		    \
 796			"2:"type##_sb("$1", "1(%2)")"\n\t"  \
 797			"srl\t$1, $1,  0x8\n\t"		    \
 798			"3:"type##_sb("$1", "2(%2)")"\n\t"  \
 799			"srl\t$1, $1, 0x8\n\t"		    \
 800			"4:"type##_sb("$1", "3(%2)")"\n\t"  \
 801			".set\tpop\n\t"			    \
 802			"li\t%0, 0\n"			    \
 803			"10:\n\t"			    \
 804			".insn\n\t"			    \
 805			".section\t.fixup,\"ax\"\n\t"	    \
 806			"11:\tli\t%0, %3\n\t"		    \
 807			"j\t10b\n\t"			    \
 808			".previous\n\t"			    \
 809			".section\t__ex_table,\"a\"\n\t"    \
 810			STR(PTR)"\t1b, 11b\n\t"		    \
 811			STR(PTR)"\t2b, 11b\n\t"		    \
 812			STR(PTR)"\t3b, 11b\n\t"		    \
 813			STR(PTR)"\t4b, 11b\n\t"		    \
 814			".previous"			    \
 815		: "=&r" (res)			    	    \
 816		: "r" (value), "r" (addr), "i" (-EFAULT)    \
 817		: "memory");                                \
 818} while(0)
 819
 820#define     _StoreDW(addr, value, res) \
 821do {                                                        \
 822		__asm__ __volatile__ (                      \
 823			".set\tpush\n\t"		    \
 824			".set\tnoat\n\t"		    \
 825			"1:sb\t%1, 0(%2)\n\t"    	    \
 826			"dsrl\t$1, %1, 0x8\n\t"		    \
 827			"2:sb\t$1, 1(%2)\n\t"    	    \
 828			"dsrl\t$1, $1, 0x8\n\t"		    \
 829			"3:sb\t$1, 2(%2)\n\t"    	    \
 830			"dsrl\t$1, $1, 0x8\n\t"		    \
 831			"4:sb\t$1, 3(%2)\n\t"    	    \
 832			"dsrl\t$1, $1, 0x8\n\t"		    \
 833			"5:sb\t$1, 4(%2)\n\t"    	    \
 834			"dsrl\t$1, $1, 0x8\n\t"		    \
 835			"6:sb\t$1, 5(%2)\n\t"    	    \
 836			"dsrl\t$1, $1, 0x8\n\t"		    \
 837			"7:sb\t$1, 6(%2)\n\t"    	    \
 838			"dsrl\t$1, $1, 0x8\n\t"		    \
 839			"8:sb\t$1, 7(%2)\n\t"    	    \
 840			"dsrl\t$1, $1, 0x8\n\t"		    \
 841			".set\tpop\n\t"			    \
 842			"li\t%0, 0\n"			    \
 843			"10:\n\t"			    \
 844			".insn\n\t"			    \
 845			".section\t.fixup,\"ax\"\n\t"	    \
 846			"11:\tli\t%0, %3\n\t"		    \
 847			"j\t10b\n\t"			    \
 848			".previous\n\t"			    \
 849			".section\t__ex_table,\"a\"\n\t"    \
 850			STR(PTR)"\t1b, 11b\n\t"		    \
 851			STR(PTR)"\t2b, 11b\n\t"		    \
 852			STR(PTR)"\t3b, 11b\n\t"		    \
 853			STR(PTR)"\t4b, 11b\n\t"		    \
 854			STR(PTR)"\t5b, 11b\n\t"		    \
 855			STR(PTR)"\t6b, 11b\n\t"		    \
 856			STR(PTR)"\t7b, 11b\n\t"		    \
 857			STR(PTR)"\t8b, 11b\n\t"		    \
 858			".previous"			    \
 859		: "=&r" (res)			    	    \
 860		: "r" (value), "r" (addr), "i" (-EFAULT)    \
 861		: "memory");                                \
 862} while(0)
 863
 864#endif /* CONFIG_CPU_MIPSR6 */
 865#endif
 866
 867#define LoadHWU(addr, value, res)	_LoadHWU(addr, value, res, kernel)
 868#define LoadHWUE(addr, value, res)	_LoadHWU(addr, value, res, user)
 869#define LoadWU(addr, value, res)	_LoadWU(addr, value, res, kernel)
 870#define LoadWUE(addr, value, res)	_LoadWU(addr, value, res, user)
 871#define LoadHW(addr, value, res)	_LoadHW(addr, value, res, kernel)
 872#define LoadHWE(addr, value, res)	_LoadHW(addr, value, res, user)
 873#define LoadW(addr, value, res)		_LoadW(addr, value, res, kernel)
 874#define LoadWE(addr, value, res)	_LoadW(addr, value, res, user)
 875#define LoadDW(addr, value, res)	_LoadDW(addr, value, res)
 876
 877#define StoreHW(addr, value, res)	_StoreHW(addr, value, res, kernel)
 878#define StoreHWE(addr, value, res)	_StoreHW(addr, value, res, user)
 879#define StoreW(addr, value, res)	_StoreW(addr, value, res, kernel)
 880#define StoreWE(addr, value, res)	_StoreW(addr, value, res, user)
 881#define StoreDW(addr, value, res)	_StoreDW(addr, value, res)
 882
 883static void emulate_load_store_insn(struct pt_regs *regs,
 884	void __user *addr, unsigned int __user *pc)
 885{
 886	union mips_instruction insn;
 887	unsigned long value;
 888	unsigned int res, preempted;
 889	unsigned long origpc;
 890	unsigned long orig31;
 891	void __user *fault_addr = NULL;
 892#ifdef	CONFIG_EVA
 893	mm_segment_t seg;
 894#endif
 895	union fpureg *fpr;
 896	enum msa_2b_fmt df;
 897	unsigned int wd;
 898	origpc = (unsigned long)pc;
 899	orig31 = regs->regs[31];
 900
 901	perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0);
 902
 903	/*
 904	 * This load never faults.
 905	 */
 906	__get_user(insn.word, pc);
 907
 908	switch (insn.i_format.opcode) {
 909		/*
 910		 * These are instructions that a compiler doesn't generate.  We
 911		 * can assume therefore that the code is MIPS-aware and
 912		 * really buggy.  Emulating these instructions would break the
 913		 * semantics anyway.
 914		 */
 915	case ll_op:
 916	case lld_op:
 917	case sc_op:
 918	case scd_op:
 919
 920		/*
 921		 * For these instructions the only way to create an address
 922		 * error is an attempted access to kernel/supervisor address
 923		 * space.
 924		 */
 925	case ldl_op:
 926	case ldr_op:
 927	case lwl_op:
 928	case lwr_op:
 929	case sdl_op:
 930	case sdr_op:
 931	case swl_op:
 932	case swr_op:
 933	case lb_op:
 934	case lbu_op:
 935	case sb_op:
 936		goto sigbus;
 937
 938		/*
 939		 * The remaining opcodes are the ones that are really of
 940		 * interest.
 941		 */
 
 942	case spec3_op:
 943		if (insn.dsp_format.func == lx_op) {
 944			switch (insn.dsp_format.op) {
 945			case lwx_op:
 946				if (!access_ok(VERIFY_READ, addr, 4))
 947					goto sigbus;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 948				LoadW(addr, value, res);
 949				if (res)
 950					goto fault;
 951				compute_return_epc(regs);
 952				regs->regs[insn.dsp_format.rd] = value;
 953				break;
 954			case lhx_op:
 955				if (!access_ok(VERIFY_READ, addr, 2))
 956					goto sigbus;
 957				LoadHW(addr, value, res);
 958				if (res)
 959					goto fault;
 960				compute_return_epc(regs);
 961				regs->regs[insn.dsp_format.rd] = value;
 962				break;
 963			default:
 964				goto sigill;
 965			}
 966		}
 967#ifdef CONFIG_EVA
 968		else {
 969			/*
 970			 * we can land here only from kernel accessing user
 971			 * memory, so we need to "switch" the address limit to
 972			 * user space, so that address check can work properly.
 973			 */
 974			seg = get_fs();
 975			set_fs(USER_DS);
 976			switch (insn.spec3_format.func) {
 977			case lhe_op:
 978				if (!access_ok(VERIFY_READ, addr, 2)) {
 979					set_fs(seg);
 980					goto sigbus;
 981				}
 982				LoadHWE(addr, value, res);
 983				if (res) {
 984					set_fs(seg);
 985					goto fault;
 986				}
 987				compute_return_epc(regs);
 988				regs->regs[insn.spec3_format.rt] = value;
 989				break;
 990			case lwe_op:
 991				if (!access_ok(VERIFY_READ, addr, 4)) {
 992					set_fs(seg);
 993					goto sigbus;
 994				}
 995				LoadWE(addr, value, res);
 996				if (res) {
 997					set_fs(seg);
 998					goto fault;
 999				}
1000				compute_return_epc(regs);
1001				regs->regs[insn.spec3_format.rt] = value;
1002				break;
1003			case lhue_op:
1004				if (!access_ok(VERIFY_READ, addr, 2)) {
1005					set_fs(seg);
1006					goto sigbus;
1007				}
1008				LoadHWUE(addr, value, res);
1009				if (res) {
1010					set_fs(seg);
1011					goto fault;
1012				}
1013				compute_return_epc(regs);
1014				regs->regs[insn.spec3_format.rt] = value;
1015				break;
1016			case she_op:
1017				if (!access_ok(VERIFY_WRITE, addr, 2)) {
1018					set_fs(seg);
1019					goto sigbus;
1020				}
1021				compute_return_epc(regs);
1022				value = regs->regs[insn.spec3_format.rt];
1023				StoreHWE(addr, value, res);
1024				if (res) {
1025					set_fs(seg);
1026					goto fault;
1027				}
1028				break;
1029			case swe_op:
1030				if (!access_ok(VERIFY_WRITE, addr, 4)) {
1031					set_fs(seg);
1032					goto sigbus;
1033				}
1034				compute_return_epc(regs);
1035				value = regs->regs[insn.spec3_format.rt];
1036				StoreWE(addr, value, res);
1037				if (res) {
1038					set_fs(seg);
1039					goto fault;
1040				}
1041				break;
1042			default:
1043				set_fs(seg);
1044				goto sigill;
1045			}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1046			set_fs(seg);
 
1047		}
1048#endif
1049		break;
 
1050	case lh_op:
1051		if (!access_ok(VERIFY_READ, addr, 2))
1052			goto sigbus;
1053
1054		if (IS_ENABLED(CONFIG_EVA)) {
1055			if (uaccess_kernel())
1056				LoadHW(addr, value, res);
1057			else
1058				LoadHWE(addr, value, res);
1059		} else {
1060			LoadHW(addr, value, res);
1061		}
1062
1063		if (res)
1064			goto fault;
1065		compute_return_epc(regs);
1066		regs->regs[insn.i_format.rt] = value;
1067		break;
1068
1069	case lw_op:
1070		if (!access_ok(VERIFY_READ, addr, 4))
1071			goto sigbus;
1072
1073		if (IS_ENABLED(CONFIG_EVA)) {
1074			if (uaccess_kernel())
1075				LoadW(addr, value, res);
1076			else
1077				LoadWE(addr, value, res);
1078		} else {
1079			LoadW(addr, value, res);
1080		}
1081
1082		if (res)
1083			goto fault;
1084		compute_return_epc(regs);
1085		regs->regs[insn.i_format.rt] = value;
1086		break;
1087
1088	case lhu_op:
1089		if (!access_ok(VERIFY_READ, addr, 2))
1090			goto sigbus;
1091
1092		if (IS_ENABLED(CONFIG_EVA)) {
1093			if (uaccess_kernel())
1094				LoadHWU(addr, value, res);
1095			else
1096				LoadHWUE(addr, value, res);
1097		} else {
1098			LoadHWU(addr, value, res);
1099		}
1100
1101		if (res)
1102			goto fault;
1103		compute_return_epc(regs);
1104		regs->regs[insn.i_format.rt] = value;
1105		break;
1106
1107	case lwu_op:
1108#ifdef CONFIG_64BIT
1109		/*
1110		 * A 32-bit kernel might be running on a 64-bit processor.  But
1111		 * if we're on a 32-bit processor and an i-cache incoherency
1112		 * or race makes us see a 64-bit instruction here the sdl/sdr
1113		 * would blow up, so for now we don't handle unaligned 64-bit
1114		 * instructions on 32-bit kernels.
1115		 */
1116		if (!access_ok(VERIFY_READ, addr, 4))
1117			goto sigbus;
1118
1119		LoadWU(addr, value, res);
1120		if (res)
1121			goto fault;
1122		compute_return_epc(regs);
1123		regs->regs[insn.i_format.rt] = value;
1124		break;
1125#endif /* CONFIG_64BIT */
1126
1127		/* Cannot handle 64-bit instructions in 32-bit kernel */
1128		goto sigill;
1129
1130	case ld_op:
1131#ifdef CONFIG_64BIT
1132		/*
1133		 * A 32-bit kernel might be running on a 64-bit processor.  But
1134		 * if we're on a 32-bit processor and an i-cache incoherency
1135		 * or race makes us see a 64-bit instruction here the sdl/sdr
1136		 * would blow up, so for now we don't handle unaligned 64-bit
1137		 * instructions on 32-bit kernels.
1138		 */
1139		if (!access_ok(VERIFY_READ, addr, 8))
1140			goto sigbus;
1141
1142		LoadDW(addr, value, res);
1143		if (res)
1144			goto fault;
1145		compute_return_epc(regs);
1146		regs->regs[insn.i_format.rt] = value;
1147		break;
1148#endif /* CONFIG_64BIT */
1149
1150		/* Cannot handle 64-bit instructions in 32-bit kernel */
1151		goto sigill;
1152
1153	case sh_op:
1154		if (!access_ok(VERIFY_WRITE, addr, 2))
1155			goto sigbus;
1156
1157		compute_return_epc(regs);
1158		value = regs->regs[insn.i_format.rt];
1159
1160		if (IS_ENABLED(CONFIG_EVA)) {
1161			if (uaccess_kernel())
1162				StoreHW(addr, value, res);
1163			else
1164				StoreHWE(addr, value, res);
1165		} else {
1166			StoreHW(addr, value, res);
1167		}
1168
1169		if (res)
1170			goto fault;
1171		break;
1172
1173	case sw_op:
1174		if (!access_ok(VERIFY_WRITE, addr, 4))
1175			goto sigbus;
1176
1177		compute_return_epc(regs);
1178		value = regs->regs[insn.i_format.rt];
1179
1180		if (IS_ENABLED(CONFIG_EVA)) {
1181			if (uaccess_kernel())
1182				StoreW(addr, value, res);
1183			else
1184				StoreWE(addr, value, res);
1185		} else {
1186			StoreW(addr, value, res);
1187		}
1188
1189		if (res)
1190			goto fault;
1191		break;
1192
1193	case sd_op:
1194#ifdef CONFIG_64BIT
1195		/*
1196		 * A 32-bit kernel might be running on a 64-bit processor.  But
1197		 * if we're on a 32-bit processor and an i-cache incoherency
1198		 * or race makes us see a 64-bit instruction here the sdl/sdr
1199		 * would blow up, so for now we don't handle unaligned 64-bit
1200		 * instructions on 32-bit kernels.
1201		 */
1202		if (!access_ok(VERIFY_WRITE, addr, 8))
1203			goto sigbus;
1204
1205		compute_return_epc(regs);
1206		value = regs->regs[insn.i_format.rt];
1207		StoreDW(addr, value, res);
1208		if (res)
1209			goto fault;
1210		break;
1211#endif /* CONFIG_64BIT */
1212
1213		/* Cannot handle 64-bit instructions in 32-bit kernel */
1214		goto sigill;
1215
1216	case lwc1_op:
1217	case ldc1_op:
1218	case swc1_op:
1219	case sdc1_op:
1220	case cop1x_op:
1221		die_if_kernel("Unaligned FP access in kernel code", regs);
1222		BUG_ON(!used_math());
 
1223
1224		lose_fpu(1);	/* Save FPU state for the emulator. */
1225		res = fpu_emulator_cop1Handler(regs, &current->thread.fpu, 1,
1226					       &fault_addr);
1227		own_fpu(1);	/* Restore FPU state. */
1228
1229		/* Signal if something went wrong. */
1230		process_fpemu_return(res, fault_addr, 0);
1231
1232		if (res == 0)
1233			break;
1234		return;
1235
1236	case msa_op:
1237		if (!cpu_has_msa)
1238			goto sigill;
1239
1240		/*
1241		 * If we've reached this point then userland should have taken
1242		 * the MSA disabled exception & initialised vector context at
1243		 * some point in the past.
1244		 */
1245		BUG_ON(!thread_msa_context_live());
1246
1247		df = insn.msa_mi10_format.df;
1248		wd = insn.msa_mi10_format.wd;
1249		fpr = &current->thread.fpu.fpr[wd];
1250
1251		switch (insn.msa_mi10_format.func) {
1252		case msa_ld_op:
1253			if (!access_ok(VERIFY_READ, addr, sizeof(*fpr)))
1254				goto sigbus;
1255
1256			do {
1257				/*
1258				 * If we have live MSA context keep track of
1259				 * whether we get preempted in order to avoid
1260				 * the register context we load being clobbered
1261				 * by the live context as it's saved during
1262				 * preemption. If we don't have live context
1263				 * then it can't be saved to clobber the value
1264				 * we load.
1265				 */
1266				preempted = test_thread_flag(TIF_USEDMSA);
1267
1268				res = __copy_from_user_inatomic(fpr, addr,
1269								sizeof(*fpr));
1270				if (res)
1271					goto fault;
1272
1273				/*
1274				 * Update the hardware register if it is in use
1275				 * by the task in this quantum, in order to
1276				 * avoid having to save & restore the whole
1277				 * vector context.
1278				 */
1279				preempt_disable();
1280				if (test_thread_flag(TIF_USEDMSA)) {
1281					write_msa_wr(wd, fpr, df);
1282					preempted = 0;
1283				}
1284				preempt_enable();
1285			} while (preempted);
1286			break;
1287
1288		case msa_st_op:
1289			if (!access_ok(VERIFY_WRITE, addr, sizeof(*fpr)))
1290				goto sigbus;
1291
1292			/*
1293			 * Update from the hardware register if it is in use by
1294			 * the task in this quantum, in order to avoid having to
1295			 * save & restore the whole vector context.
1296			 */
1297			preempt_disable();
1298			if (test_thread_flag(TIF_USEDMSA))
1299				read_msa_wr(wd, fpr, df);
1300			preempt_enable();
1301
1302			res = __copy_to_user_inatomic(addr, fpr, sizeof(*fpr));
1303			if (res)
1304				goto fault;
1305			break;
1306
1307		default:
1308			goto sigbus;
1309		}
1310
1311		compute_return_epc(regs);
1312		break;
1313
1314#ifndef CONFIG_CPU_MIPSR6
1315	/*
1316	 * COP2 is available to implementor for application specific use.
1317	 * It's up to applications to register a notifier chain and do
1318	 * whatever they have to do, including possible sending of signals.
1319	 *
1320	 * This instruction has been reallocated in Release 6
1321	 */
1322	case lwc2_op:
1323		cu2_notifier_call_chain(CU2_LWC2_OP, regs);
1324		break;
1325
1326	case ldc2_op:
1327		cu2_notifier_call_chain(CU2_LDC2_OP, regs);
1328		break;
1329
1330	case swc2_op:
1331		cu2_notifier_call_chain(CU2_SWC2_OP, regs);
1332		break;
1333
1334	case sdc2_op:
1335		cu2_notifier_call_chain(CU2_SDC2_OP, regs);
1336		break;
1337#endif
1338	default:
1339		/*
1340		 * Pheeee...  We encountered an yet unknown instruction or
1341		 * cache coherence problem.  Die sucker, die ...
1342		 */
1343		goto sigill;
1344	}
1345
1346#ifdef CONFIG_DEBUG_FS
1347	unaligned_instructions++;
1348#endif
1349
1350	return;
1351
1352fault:
1353	/* roll back jump/branch */
1354	regs->cp0_epc = origpc;
1355	regs->regs[31] = orig31;
1356	/* Did we have an exception handler installed? */
1357	if (fixup_exception(regs))
1358		return;
1359
1360	die_if_kernel("Unhandled kernel unaligned access", regs);
1361	force_sig(SIGSEGV, current);
1362
1363	return;
1364
1365sigbus:
1366	die_if_kernel("Unhandled kernel unaligned access", regs);
1367	force_sig(SIGBUS, current);
1368
1369	return;
1370
1371sigill:
1372	die_if_kernel
1373	    ("Unhandled kernel unaligned access or invalid instruction", regs);
1374	force_sig(SIGILL, current);
1375}
1376
1377/* Recode table from 16-bit register notation to 32-bit GPR. */
1378const int reg16to32[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
1379
1380/* Recode table from 16-bit STORE register notation to 32-bit GPR. */
1381static const int reg16to32st[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
1382
1383static void emulate_load_store_microMIPS(struct pt_regs *regs,
1384					 void __user *addr)
1385{
1386	unsigned long value;
1387	unsigned int res;
1388	int i;
1389	unsigned int reg = 0, rvar;
1390	unsigned long orig31;
1391	u16 __user *pc16;
1392	u16 halfword;
1393	unsigned int word;
1394	unsigned long origpc, contpc;
1395	union mips_instruction insn;
1396	struct mm_decoded_insn mminsn;
1397	void __user *fault_addr = NULL;
1398
1399	origpc = regs->cp0_epc;
1400	orig31 = regs->regs[31];
1401
1402	mminsn.micro_mips_mode = 1;
1403
1404	/*
1405	 * This load never faults.
1406	 */
1407	pc16 = (unsigned short __user *)msk_isa16_mode(regs->cp0_epc);
1408	__get_user(halfword, pc16);
1409	pc16++;
1410	contpc = regs->cp0_epc + 2;
1411	word = ((unsigned int)halfword << 16);
1412	mminsn.pc_inc = 2;
1413
1414	if (!mm_insn_16bit(halfword)) {
1415		__get_user(halfword, pc16);
1416		pc16++;
1417		contpc = regs->cp0_epc + 4;
1418		mminsn.pc_inc = 4;
1419		word |= halfword;
1420	}
1421	mminsn.insn = word;
1422
1423	if (get_user(halfword, pc16))
1424		goto fault;
1425	mminsn.next_pc_inc = 2;
1426	word = ((unsigned int)halfword << 16);
1427
1428	if (!mm_insn_16bit(halfword)) {
1429		pc16++;
1430		if (get_user(halfword, pc16))
1431			goto fault;
1432		mminsn.next_pc_inc = 4;
1433		word |= halfword;
1434	}
1435	mminsn.next_insn = word;
1436
1437	insn = (union mips_instruction)(mminsn.insn);
1438	if (mm_isBranchInstr(regs, mminsn, &contpc))
1439		insn = (union mips_instruction)(mminsn.next_insn);
1440
1441	/*  Parse instruction to find what to do */
1442
1443	switch (insn.mm_i_format.opcode) {
1444
1445	case mm_pool32a_op:
1446		switch (insn.mm_x_format.func) {
1447		case mm_lwxs_op:
1448			reg = insn.mm_x_format.rd;
1449			goto loadW;
1450		}
1451
1452		goto sigbus;
1453
1454	case mm_pool32b_op:
1455		switch (insn.mm_m_format.func) {
1456		case mm_lwp_func:
1457			reg = insn.mm_m_format.rd;
1458			if (reg == 31)
1459				goto sigbus;
1460
1461			if (!access_ok(VERIFY_READ, addr, 8))
1462				goto sigbus;
1463
1464			LoadW(addr, value, res);
1465			if (res)
1466				goto fault;
1467			regs->regs[reg] = value;
1468			addr += 4;
1469			LoadW(addr, value, res);
1470			if (res)
1471				goto fault;
1472			regs->regs[reg + 1] = value;
1473			goto success;
1474
1475		case mm_swp_func:
1476			reg = insn.mm_m_format.rd;
1477			if (reg == 31)
1478				goto sigbus;
1479
1480			if (!access_ok(VERIFY_WRITE, addr, 8))
1481				goto sigbus;
1482
1483			value = regs->regs[reg];
1484			StoreW(addr, value, res);
1485			if (res)
1486				goto fault;
1487			addr += 4;
1488			value = regs->regs[reg + 1];
1489			StoreW(addr, value, res);
1490			if (res)
1491				goto fault;
1492			goto success;
1493
1494		case mm_ldp_func:
1495#ifdef CONFIG_64BIT
1496			reg = insn.mm_m_format.rd;
1497			if (reg == 31)
1498				goto sigbus;
1499
1500			if (!access_ok(VERIFY_READ, addr, 16))
1501				goto sigbus;
1502
1503			LoadDW(addr, value, res);
1504			if (res)
1505				goto fault;
1506			regs->regs[reg] = value;
1507			addr += 8;
1508			LoadDW(addr, value, res);
1509			if (res)
1510				goto fault;
1511			regs->regs[reg + 1] = value;
1512			goto success;
1513#endif /* CONFIG_64BIT */
1514
1515			goto sigill;
1516
1517		case mm_sdp_func:
1518#ifdef CONFIG_64BIT
1519			reg = insn.mm_m_format.rd;
1520			if (reg == 31)
1521				goto sigbus;
1522
1523			if (!access_ok(VERIFY_WRITE, addr, 16))
1524				goto sigbus;
1525
1526			value = regs->regs[reg];
1527			StoreDW(addr, value, res);
1528			if (res)
1529				goto fault;
1530			addr += 8;
1531			value = regs->regs[reg + 1];
1532			StoreDW(addr, value, res);
1533			if (res)
1534				goto fault;
1535			goto success;
1536#endif /* CONFIG_64BIT */
1537
1538			goto sigill;
1539
1540		case mm_lwm32_func:
1541			reg = insn.mm_m_format.rd;
1542			rvar = reg & 0xf;
1543			if ((rvar > 9) || !reg)
1544				goto sigill;
1545			if (reg & 0x10) {
1546				if (!access_ok
1547				    (VERIFY_READ, addr, 4 * (rvar + 1)))
1548					goto sigbus;
1549			} else {
1550				if (!access_ok(VERIFY_READ, addr, 4 * rvar))
1551					goto sigbus;
1552			}
1553			if (rvar == 9)
1554				rvar = 8;
1555			for (i = 16; rvar; rvar--, i++) {
1556				LoadW(addr, value, res);
1557				if (res)
1558					goto fault;
1559				addr += 4;
1560				regs->regs[i] = value;
1561			}
1562			if ((reg & 0xf) == 9) {
1563				LoadW(addr, value, res);
1564				if (res)
1565					goto fault;
1566				addr += 4;
1567				regs->regs[30] = value;
1568			}
1569			if (reg & 0x10) {
1570				LoadW(addr, value, res);
1571				if (res)
1572					goto fault;
1573				regs->regs[31] = value;
1574			}
1575			goto success;
1576
1577		case mm_swm32_func:
1578			reg = insn.mm_m_format.rd;
1579			rvar = reg & 0xf;
1580			if ((rvar > 9) || !reg)
1581				goto sigill;
1582			if (reg & 0x10) {
1583				if (!access_ok
1584				    (VERIFY_WRITE, addr, 4 * (rvar + 1)))
1585					goto sigbus;
1586			} else {
1587				if (!access_ok(VERIFY_WRITE, addr, 4 * rvar))
1588					goto sigbus;
1589			}
1590			if (rvar == 9)
1591				rvar = 8;
1592			for (i = 16; rvar; rvar--, i++) {
1593				value = regs->regs[i];
1594				StoreW(addr, value, res);
1595				if (res)
1596					goto fault;
1597				addr += 4;
1598			}
1599			if ((reg & 0xf) == 9) {
1600				value = regs->regs[30];
1601				StoreW(addr, value, res);
1602				if (res)
1603					goto fault;
1604				addr += 4;
1605			}
1606			if (reg & 0x10) {
1607				value = regs->regs[31];
1608				StoreW(addr, value, res);
1609				if (res)
1610					goto fault;
1611			}
1612			goto success;
1613
1614		case mm_ldm_func:
1615#ifdef CONFIG_64BIT
1616			reg = insn.mm_m_format.rd;
1617			rvar = reg & 0xf;
1618			if ((rvar > 9) || !reg)
1619				goto sigill;
1620			if (reg & 0x10) {
1621				if (!access_ok
1622				    (VERIFY_READ, addr, 8 * (rvar + 1)))
1623					goto sigbus;
1624			} else {
1625				if (!access_ok(VERIFY_READ, addr, 8 * rvar))
1626					goto sigbus;
1627			}
1628			if (rvar == 9)
1629				rvar = 8;
1630
1631			for (i = 16; rvar; rvar--, i++) {
1632				LoadDW(addr, value, res);
1633				if (res)
1634					goto fault;
1635				addr += 4;
1636				regs->regs[i] = value;
1637			}
1638			if ((reg & 0xf) == 9) {
1639				LoadDW(addr, value, res);
1640				if (res)
1641					goto fault;
1642				addr += 8;
1643				regs->regs[30] = value;
1644			}
1645			if (reg & 0x10) {
1646				LoadDW(addr, value, res);
1647				if (res)
1648					goto fault;
1649				regs->regs[31] = value;
1650			}
1651			goto success;
1652#endif /* CONFIG_64BIT */
1653
1654			goto sigill;
1655
1656		case mm_sdm_func:
1657#ifdef CONFIG_64BIT
1658			reg = insn.mm_m_format.rd;
1659			rvar = reg & 0xf;
1660			if ((rvar > 9) || !reg)
1661				goto sigill;
1662			if (reg & 0x10) {
1663				if (!access_ok
1664				    (VERIFY_WRITE, addr, 8 * (rvar + 1)))
1665					goto sigbus;
1666			} else {
1667				if (!access_ok(VERIFY_WRITE, addr, 8 * rvar))
1668					goto sigbus;
1669			}
1670			if (rvar == 9)
1671				rvar = 8;
1672
1673			for (i = 16; rvar; rvar--, i++) {
1674				value = regs->regs[i];
1675				StoreDW(addr, value, res);
1676				if (res)
1677					goto fault;
1678				addr += 8;
1679			}
1680			if ((reg & 0xf) == 9) {
1681				value = regs->regs[30];
1682				StoreDW(addr, value, res);
1683				if (res)
1684					goto fault;
1685				addr += 8;
1686			}
1687			if (reg & 0x10) {
1688				value = regs->regs[31];
1689				StoreDW(addr, value, res);
1690				if (res)
1691					goto fault;
1692			}
1693			goto success;
1694#endif /* CONFIG_64BIT */
1695
1696			goto sigill;
1697
1698			/*  LWC2, SWC2, LDC2, SDC2 are not serviced */
1699		}
1700
1701		goto sigbus;
1702
1703	case mm_pool32c_op:
1704		switch (insn.mm_m_format.func) {
1705		case mm_lwu_func:
1706			reg = insn.mm_m_format.rd;
1707			goto loadWU;
1708		}
1709
1710		/*  LL,SC,LLD,SCD are not serviced */
1711		goto sigbus;
1712
1713	case mm_pool32f_op:
1714		switch (insn.mm_x_format.func) {
1715		case mm_lwxc1_func:
1716		case mm_swxc1_func:
1717		case mm_ldxc1_func:
1718		case mm_sdxc1_func:
1719			goto fpu_emul;
1720		}
1721
1722		goto sigbus;
1723
1724	case mm_ldc132_op:
1725	case mm_sdc132_op:
1726	case mm_lwc132_op:
1727	case mm_swc132_op:
1728fpu_emul:
1729		/* roll back jump/branch */
1730		regs->cp0_epc = origpc;
1731		regs->regs[31] = orig31;
1732
1733		die_if_kernel("Unaligned FP access in kernel code", regs);
1734		BUG_ON(!used_math());
1735		BUG_ON(!is_fpu_owner());
1736
1737		lose_fpu(1);	/* save the FPU state for the emulator */
1738		res = fpu_emulator_cop1Handler(regs, &current->thread.fpu, 1,
1739					       &fault_addr);
1740		own_fpu(1);	/* restore FPU state */
1741
1742		/* If something went wrong, signal */
1743		process_fpemu_return(res, fault_addr, 0);
1744
1745		if (res == 0)
1746			goto success;
1747		return;
1748
1749	case mm_lh32_op:
1750		reg = insn.mm_i_format.rt;
1751		goto loadHW;
1752
1753	case mm_lhu32_op:
1754		reg = insn.mm_i_format.rt;
1755		goto loadHWU;
1756
1757	case mm_lw32_op:
1758		reg = insn.mm_i_format.rt;
1759		goto loadW;
1760
1761	case mm_sh32_op:
1762		reg = insn.mm_i_format.rt;
1763		goto storeHW;
1764
1765	case mm_sw32_op:
1766		reg = insn.mm_i_format.rt;
1767		goto storeW;
1768
1769	case mm_ld32_op:
1770		reg = insn.mm_i_format.rt;
1771		goto loadDW;
1772
1773	case mm_sd32_op:
1774		reg = insn.mm_i_format.rt;
1775		goto storeDW;
1776
1777	case mm_pool16c_op:
1778		switch (insn.mm16_m_format.func) {
1779		case mm_lwm16_op:
1780			reg = insn.mm16_m_format.rlist;
1781			rvar = reg + 1;
1782			if (!access_ok(VERIFY_READ, addr, 4 * rvar))
1783				goto sigbus;
1784
1785			for (i = 16; rvar; rvar--, i++) {
1786				LoadW(addr, value, res);
1787				if (res)
1788					goto fault;
1789				addr += 4;
1790				regs->regs[i] = value;
1791			}
1792			LoadW(addr, value, res);
1793			if (res)
1794				goto fault;
1795			regs->regs[31] = value;
1796
1797			goto success;
1798
1799		case mm_swm16_op:
1800			reg = insn.mm16_m_format.rlist;
1801			rvar = reg + 1;
1802			if (!access_ok(VERIFY_WRITE, addr, 4 * rvar))
1803				goto sigbus;
1804
1805			for (i = 16; rvar; rvar--, i++) {
1806				value = regs->regs[i];
1807				StoreW(addr, value, res);
1808				if (res)
1809					goto fault;
1810				addr += 4;
1811			}
1812			value = regs->regs[31];
1813			StoreW(addr, value, res);
1814			if (res)
1815				goto fault;
1816
1817			goto success;
1818
1819		}
1820
1821		goto sigbus;
1822
1823	case mm_lhu16_op:
1824		reg = reg16to32[insn.mm16_rb_format.rt];
1825		goto loadHWU;
1826
1827	case mm_lw16_op:
1828		reg = reg16to32[insn.mm16_rb_format.rt];
1829		goto loadW;
1830
1831	case mm_sh16_op:
1832		reg = reg16to32st[insn.mm16_rb_format.rt];
1833		goto storeHW;
1834
1835	case mm_sw16_op:
1836		reg = reg16to32st[insn.mm16_rb_format.rt];
1837		goto storeW;
1838
1839	case mm_lwsp16_op:
1840		reg = insn.mm16_r5_format.rt;
1841		goto loadW;
1842
1843	case mm_swsp16_op:
1844		reg = insn.mm16_r5_format.rt;
1845		goto storeW;
1846
1847	case mm_lwgp16_op:
1848		reg = reg16to32[insn.mm16_r3_format.rt];
1849		goto loadW;
1850
1851	default:
1852		goto sigill;
1853	}
1854
1855loadHW:
1856	if (!access_ok(VERIFY_READ, addr, 2))
1857		goto sigbus;
1858
1859	LoadHW(addr, value, res);
1860	if (res)
1861		goto fault;
1862	regs->regs[reg] = value;
1863	goto success;
1864
1865loadHWU:
1866	if (!access_ok(VERIFY_READ, addr, 2))
1867		goto sigbus;
1868
1869	LoadHWU(addr, value, res);
1870	if (res)
1871		goto fault;
1872	regs->regs[reg] = value;
1873	goto success;
1874
1875loadW:
1876	if (!access_ok(VERIFY_READ, addr, 4))
1877		goto sigbus;
1878
1879	LoadW(addr, value, res);
1880	if (res)
1881		goto fault;
1882	regs->regs[reg] = value;
1883	goto success;
1884
1885loadWU:
1886#ifdef CONFIG_64BIT
1887	/*
1888	 * A 32-bit kernel might be running on a 64-bit processor.  But
1889	 * if we're on a 32-bit processor and an i-cache incoherency
1890	 * or race makes us see a 64-bit instruction here the sdl/sdr
1891	 * would blow up, so for now we don't handle unaligned 64-bit
1892	 * instructions on 32-bit kernels.
1893	 */
1894	if (!access_ok(VERIFY_READ, addr, 4))
1895		goto sigbus;
1896
1897	LoadWU(addr, value, res);
1898	if (res)
1899		goto fault;
1900	regs->regs[reg] = value;
1901	goto success;
1902#endif /* CONFIG_64BIT */
1903
1904	/* Cannot handle 64-bit instructions in 32-bit kernel */
1905	goto sigill;
1906
1907loadDW:
1908#ifdef CONFIG_64BIT
1909	/*
1910	 * A 32-bit kernel might be running on a 64-bit processor.  But
1911	 * if we're on a 32-bit processor and an i-cache incoherency
1912	 * or race makes us see a 64-bit instruction here the sdl/sdr
1913	 * would blow up, so for now we don't handle unaligned 64-bit
1914	 * instructions on 32-bit kernels.
1915	 */
1916	if (!access_ok(VERIFY_READ, addr, 8))
1917		goto sigbus;
1918
1919	LoadDW(addr, value, res);
1920	if (res)
1921		goto fault;
1922	regs->regs[reg] = value;
1923	goto success;
1924#endif /* CONFIG_64BIT */
1925
1926	/* Cannot handle 64-bit instructions in 32-bit kernel */
1927	goto sigill;
1928
1929storeHW:
1930	if (!access_ok(VERIFY_WRITE, addr, 2))
1931		goto sigbus;
1932
1933	value = regs->regs[reg];
1934	StoreHW(addr, value, res);
1935	if (res)
1936		goto fault;
1937	goto success;
1938
1939storeW:
1940	if (!access_ok(VERIFY_WRITE, addr, 4))
1941		goto sigbus;
1942
1943	value = regs->regs[reg];
1944	StoreW(addr, value, res);
1945	if (res)
1946		goto fault;
1947	goto success;
1948
1949storeDW:
1950#ifdef CONFIG_64BIT
1951	/*
1952	 * A 32-bit kernel might be running on a 64-bit processor.  But
1953	 * if we're on a 32-bit processor and an i-cache incoherency
1954	 * or race makes us see a 64-bit instruction here the sdl/sdr
1955	 * would blow up, so for now we don't handle unaligned 64-bit
1956	 * instructions on 32-bit kernels.
1957	 */
1958	if (!access_ok(VERIFY_WRITE, addr, 8))
1959		goto sigbus;
1960
1961	value = regs->regs[reg];
1962	StoreDW(addr, value, res);
1963	if (res)
1964		goto fault;
1965	goto success;
1966#endif /* CONFIG_64BIT */
1967
1968	/* Cannot handle 64-bit instructions in 32-bit kernel */
1969	goto sigill;
1970
1971success:
1972	regs->cp0_epc = contpc;	/* advance or branch */
1973
1974#ifdef CONFIG_DEBUG_FS
1975	unaligned_instructions++;
1976#endif
1977	return;
1978
1979fault:
1980	/* roll back jump/branch */
1981	regs->cp0_epc = origpc;
1982	regs->regs[31] = orig31;
1983	/* Did we have an exception handler installed? */
1984	if (fixup_exception(regs))
1985		return;
1986
1987	die_if_kernel("Unhandled kernel unaligned access", regs);
1988	force_sig(SIGSEGV, current);
1989
1990	return;
1991
1992sigbus:
1993	die_if_kernel("Unhandled kernel unaligned access", regs);
1994	force_sig(SIGBUS, current);
1995
1996	return;
1997
1998sigill:
1999	die_if_kernel
2000	    ("Unhandled kernel unaligned access or invalid instruction", regs);
2001	force_sig(SIGILL, current);
2002}
2003
2004static void emulate_load_store_MIPS16e(struct pt_regs *regs, void __user * addr)
2005{
2006	unsigned long value;
2007	unsigned int res;
2008	int reg;
2009	unsigned long orig31;
2010	u16 __user *pc16;
2011	unsigned long origpc;
2012	union mips16e_instruction mips16inst, oldinst;
2013	unsigned int opcode;
2014	int extended = 0;
2015
2016	origpc = regs->cp0_epc;
2017	orig31 = regs->regs[31];
2018	pc16 = (unsigned short __user *)msk_isa16_mode(origpc);
2019	/*
2020	 * This load never faults.
2021	 */
2022	__get_user(mips16inst.full, pc16);
2023	oldinst = mips16inst;
2024
2025	/* skip EXTEND instruction */
2026	if (mips16inst.ri.opcode == MIPS16e_extend_op) {
2027		extended = 1;
2028		pc16++;
2029		__get_user(mips16inst.full, pc16);
2030	} else if (delay_slot(regs)) {
2031		/*  skip jump instructions */
2032		/*  JAL/JALX are 32 bits but have OPCODE in first short int */
2033		if (mips16inst.ri.opcode == MIPS16e_jal_op)
2034			pc16++;
2035		pc16++;
2036		if (get_user(mips16inst.full, pc16))
2037			goto sigbus;
2038	}
2039
2040	opcode = mips16inst.ri.opcode;
2041	switch (opcode) {
2042	case MIPS16e_i64_op:	/* I64 or RI64 instruction */
2043		switch (mips16inst.i64.func) {	/* I64/RI64 func field check */
2044		case MIPS16e_ldpc_func:
2045		case MIPS16e_ldsp_func:
2046			reg = reg16to32[mips16inst.ri64.ry];
2047			goto loadDW;
2048
2049		case MIPS16e_sdsp_func:
2050			reg = reg16to32[mips16inst.ri64.ry];
2051			goto writeDW;
2052
2053		case MIPS16e_sdrasp_func:
2054			reg = 29;	/* GPRSP */
2055			goto writeDW;
2056		}
2057
2058		goto sigbus;
2059
2060	case MIPS16e_swsp_op:
2061		reg = reg16to32[mips16inst.ri.rx];
2062		if (extended && cpu_has_mips16e2)
2063			switch (mips16inst.ri.imm >> 5) {
2064			case 0:		/* SWSP */
2065			case 1:		/* SWGP */
2066				break;
2067			case 2:		/* SHGP */
2068				opcode = MIPS16e_sh_op;
2069				break;
2070			default:
2071				goto sigbus;
2072			}
2073		break;
2074
2075	case MIPS16e_lwpc_op:
2076		reg = reg16to32[mips16inst.ri.rx];
2077		break;
2078
2079	case MIPS16e_lwsp_op:
2080		reg = reg16to32[mips16inst.ri.rx];
2081		if (extended && cpu_has_mips16e2)
2082			switch (mips16inst.ri.imm >> 5) {
2083			case 0:		/* LWSP */
2084			case 1:		/* LWGP */
2085				break;
2086			case 2:		/* LHGP */
2087				opcode = MIPS16e_lh_op;
2088				break;
2089			case 4:		/* LHUGP */
2090				opcode = MIPS16e_lhu_op;
2091				break;
2092			default:
2093				goto sigbus;
2094			}
2095		break;
2096
2097	case MIPS16e_i8_op:
2098		if (mips16inst.i8.func != MIPS16e_swrasp_func)
2099			goto sigbus;
2100		reg = 29;	/* GPRSP */
2101		break;
2102
2103	default:
2104		reg = reg16to32[mips16inst.rri.ry];
2105		break;
2106	}
2107
2108	switch (opcode) {
2109
2110	case MIPS16e_lb_op:
2111	case MIPS16e_lbu_op:
2112	case MIPS16e_sb_op:
2113		goto sigbus;
2114
2115	case MIPS16e_lh_op:
2116		if (!access_ok(VERIFY_READ, addr, 2))
2117			goto sigbus;
2118
2119		LoadHW(addr, value, res);
2120		if (res)
2121			goto fault;
2122		MIPS16e_compute_return_epc(regs, &oldinst);
2123		regs->regs[reg] = value;
2124		break;
2125
2126	case MIPS16e_lhu_op:
2127		if (!access_ok(VERIFY_READ, addr, 2))
2128			goto sigbus;
2129
2130		LoadHWU(addr, value, res);
2131		if (res)
2132			goto fault;
2133		MIPS16e_compute_return_epc(regs, &oldinst);
2134		regs->regs[reg] = value;
2135		break;
2136
2137	case MIPS16e_lw_op:
2138	case MIPS16e_lwpc_op:
2139	case MIPS16e_lwsp_op:
2140		if (!access_ok(VERIFY_READ, addr, 4))
2141			goto sigbus;
2142
2143		LoadW(addr, value, res);
2144		if (res)
2145			goto fault;
2146		MIPS16e_compute_return_epc(regs, &oldinst);
2147		regs->regs[reg] = value;
2148		break;
2149
2150	case MIPS16e_lwu_op:
2151#ifdef CONFIG_64BIT
2152		/*
2153		 * A 32-bit kernel might be running on a 64-bit processor.  But
2154		 * if we're on a 32-bit processor and an i-cache incoherency
2155		 * or race makes us see a 64-bit instruction here the sdl/sdr
2156		 * would blow up, so for now we don't handle unaligned 64-bit
2157		 * instructions on 32-bit kernels.
2158		 */
2159		if (!access_ok(VERIFY_READ, addr, 4))
2160			goto sigbus;
2161
2162		LoadWU(addr, value, res);
2163		if (res)
2164			goto fault;
2165		MIPS16e_compute_return_epc(regs, &oldinst);
2166		regs->regs[reg] = value;
2167		break;
2168#endif /* CONFIG_64BIT */
2169
2170		/* Cannot handle 64-bit instructions in 32-bit kernel */
2171		goto sigill;
2172
2173	case MIPS16e_ld_op:
2174loadDW:
2175#ifdef CONFIG_64BIT
2176		/*
2177		 * A 32-bit kernel might be running on a 64-bit processor.  But
2178		 * if we're on a 32-bit processor and an i-cache incoherency
2179		 * or race makes us see a 64-bit instruction here the sdl/sdr
2180		 * would blow up, so for now we don't handle unaligned 64-bit
2181		 * instructions on 32-bit kernels.
2182		 */
2183		if (!access_ok(VERIFY_READ, addr, 8))
2184			goto sigbus;
2185
2186		LoadDW(addr, value, res);
2187		if (res)
2188			goto fault;
2189		MIPS16e_compute_return_epc(regs, &oldinst);
2190		regs->regs[reg] = value;
2191		break;
2192#endif /* CONFIG_64BIT */
2193
2194		/* Cannot handle 64-bit instructions in 32-bit kernel */
2195		goto sigill;
2196
2197	case MIPS16e_sh_op:
2198		if (!access_ok(VERIFY_WRITE, addr, 2))
2199			goto sigbus;
2200
2201		MIPS16e_compute_return_epc(regs, &oldinst);
2202		value = regs->regs[reg];
2203		StoreHW(addr, value, res);
2204		if (res)
2205			goto fault;
2206		break;
2207
2208	case MIPS16e_sw_op:
2209	case MIPS16e_swsp_op:
2210	case MIPS16e_i8_op:	/* actually - MIPS16e_swrasp_func */
2211		if (!access_ok(VERIFY_WRITE, addr, 4))
2212			goto sigbus;
2213
2214		MIPS16e_compute_return_epc(regs, &oldinst);
2215		value = regs->regs[reg];
2216		StoreW(addr, value, res);
2217		if (res)
2218			goto fault;
2219		break;
2220
2221	case MIPS16e_sd_op:
2222writeDW:
2223#ifdef CONFIG_64BIT
2224		/*
2225		 * A 32-bit kernel might be running on a 64-bit processor.  But
2226		 * if we're on a 32-bit processor and an i-cache incoherency
2227		 * or race makes us see a 64-bit instruction here the sdl/sdr
2228		 * would blow up, so for now we don't handle unaligned 64-bit
2229		 * instructions on 32-bit kernels.
2230		 */
2231		if (!access_ok(VERIFY_WRITE, addr, 8))
2232			goto sigbus;
2233
2234		MIPS16e_compute_return_epc(regs, &oldinst);
2235		value = regs->regs[reg];
2236		StoreDW(addr, value, res);
2237		if (res)
2238			goto fault;
2239		break;
2240#endif /* CONFIG_64BIT */
2241
2242		/* Cannot handle 64-bit instructions in 32-bit kernel */
2243		goto sigill;
2244
2245	default:
2246		/*
2247		 * Pheeee...  We encountered an yet unknown instruction or
2248		 * cache coherence problem.  Die sucker, die ...
2249		 */
2250		goto sigill;
2251	}
2252
2253#ifdef CONFIG_DEBUG_FS
2254	unaligned_instructions++;
2255#endif
2256
2257	return;
2258
2259fault:
2260	/* roll back jump/branch */
2261	regs->cp0_epc = origpc;
2262	regs->regs[31] = orig31;
2263	/* Did we have an exception handler installed? */
2264	if (fixup_exception(regs))
2265		return;
2266
2267	die_if_kernel("Unhandled kernel unaligned access", regs);
2268	force_sig(SIGSEGV, current);
2269
2270	return;
2271
2272sigbus:
2273	die_if_kernel("Unhandled kernel unaligned access", regs);
2274	force_sig(SIGBUS, current);
2275
2276	return;
2277
2278sigill:
2279	die_if_kernel
2280	    ("Unhandled kernel unaligned access or invalid instruction", regs);
2281	force_sig(SIGILL, current);
2282}
2283
2284asmlinkage void do_ade(struct pt_regs *regs)
2285{
2286	enum ctx_state prev_state;
2287	unsigned int __user *pc;
2288	mm_segment_t seg;
2289
2290	prev_state = exception_enter();
2291	perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS,
2292			1, regs, regs->cp0_badvaddr);
2293	/*
2294	 * Did we catch a fault trying to load an instruction?
2295	 */
2296	if (regs->cp0_badvaddr == regs->cp0_epc)
2297		goto sigbus;
2298
2299	if (user_mode(regs) && !test_thread_flag(TIF_FIXADE))
2300		goto sigbus;
2301	if (unaligned_action == UNALIGNED_ACTION_SIGNAL)
2302		goto sigbus;
2303
2304	/*
2305	 * Do branch emulation only if we didn't forward the exception.
2306	 * This is all so but ugly ...
2307	 */
2308
2309	/*
2310	 * Are we running in microMIPS mode?
2311	 */
2312	if (get_isa16_mode(regs->cp0_epc)) {
2313		/*
2314		 * Did we catch a fault trying to load an instruction in
2315		 * 16-bit mode?
2316		 */
2317		if (regs->cp0_badvaddr == msk_isa16_mode(regs->cp0_epc))
2318			goto sigbus;
2319		if (unaligned_action == UNALIGNED_ACTION_SHOW)
2320			show_registers(regs);
2321
2322		if (cpu_has_mmips) {
2323			seg = get_fs();
2324			if (!user_mode(regs))
2325				set_fs(KERNEL_DS);
2326			emulate_load_store_microMIPS(regs,
2327				(void __user *)regs->cp0_badvaddr);
2328			set_fs(seg);
2329
2330			return;
2331		}
2332
2333		if (cpu_has_mips16) {
2334			seg = get_fs();
2335			if (!user_mode(regs))
2336				set_fs(KERNEL_DS);
2337			emulate_load_store_MIPS16e(regs,
2338				(void __user *)regs->cp0_badvaddr);
2339			set_fs(seg);
2340
2341			return;
2342	}
2343
2344		goto sigbus;
2345	}
2346
2347	if (unaligned_action == UNALIGNED_ACTION_SHOW)
2348		show_registers(regs);
2349	pc = (unsigned int __user *)exception_epc(regs);
2350
2351	seg = get_fs();
2352	if (!user_mode(regs))
2353		set_fs(KERNEL_DS);
2354	emulate_load_store_insn(regs, (void __user *)regs->cp0_badvaddr, pc);
2355	set_fs(seg);
2356
2357	return;
2358
2359sigbus:
2360	die_if_kernel("Kernel unaligned instruction access", regs);
2361	force_sig(SIGBUS, current);
2362
2363	/*
2364	 * XXX On return from the signal handler we should advance the epc
2365	 */
2366	exception_exit(prev_state);
2367}
2368
2369#ifdef CONFIG_DEBUG_FS
 
2370static int __init debugfs_unaligned(void)
2371{
2372	struct dentry *d;
2373
2374	if (!mips_debugfs_dir)
2375		return -ENODEV;
2376	d = debugfs_create_u32("unaligned_instructions", S_IRUGO,
2377			       mips_debugfs_dir, &unaligned_instructions);
2378	if (!d)
2379		return -ENOMEM;
2380	d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR,
2381			       mips_debugfs_dir, &unaligned_action);
2382	if (!d)
2383		return -ENOMEM;
2384	return 0;
2385}
2386arch_initcall(debugfs_unaligned);
2387#endif
v3.15
   1/*
   2 * Handle unaligned accesses by emulation.
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License.  See the file "COPYING" in the main directory of this archive
   6 * for more details.
   7 *
   8 * Copyright (C) 1996, 1998, 1999, 2002 by Ralf Baechle
   9 * Copyright (C) 1999 Silicon Graphics, Inc.
  10 * Copyright (C) 2014 Imagination Technologies Ltd.
  11 *
  12 * This file contains exception handler for address error exception with the
  13 * special capability to execute faulting instructions in software.  The
  14 * handler does not try to handle the case when the program counter points
  15 * to an address not aligned to a word boundary.
  16 *
  17 * Putting data to unaligned addresses is a bad practice even on Intel where
  18 * only the performance is affected.  Much worse is that such code is non-
  19 * portable.  Due to several programs that die on MIPS due to alignment
  20 * problems I decided to implement this handler anyway though I originally
  21 * didn't intend to do this at all for user code.
  22 *
  23 * For now I enable fixing of address errors by default to make life easier.
  24 * I however intend to disable this somewhen in the future when the alignment
  25 * problems with user programs have been fixed.	 For programmers this is the
  26 * right way to go.
  27 *
  28 * Fixing address errors is a per process option.  The option is inherited
  29 * across fork(2) and execve(2) calls.	If you really want to use the
  30 * option in your user programs - I discourage the use of the software
  31 * emulation strongly - use the following code in your userland stuff:
  32 *
  33 * #include <sys/sysmips.h>
  34 *
  35 * ...
  36 * sysmips(MIPS_FIXADE, x);
  37 * ...
  38 *
  39 * The argument x is 0 for disabling software emulation, enabled otherwise.
  40 *
  41 * Below a little program to play around with this feature.
  42 *
  43 * #include <stdio.h>
  44 * #include <sys/sysmips.h>
  45 *
  46 * struct foo {
  47 *	   unsigned char bar[8];
  48 * };
  49 *
  50 * main(int argc, char *argv[])
  51 * {
  52 *	   struct foo x = {0, 1, 2, 3, 4, 5, 6, 7};
  53 *	   unsigned int *p = (unsigned int *) (x.bar + 3);
  54 *	   int i;
  55 *
  56 *	   if (argc > 1)
  57 *		   sysmips(MIPS_FIXADE, atoi(argv[1]));
  58 *
  59 *	   printf("*p = %08lx\n", *p);
  60 *
  61 *	   *p = 0xdeadface;
  62 *
  63 *	   for(i = 0; i <= 7; i++)
  64 *	   printf("%02x ", x.bar[i]);
  65 *	   printf("\n");
  66 * }
  67 *
  68 * Coprocessor loads are not supported; I think this case is unimportant
  69 * in the practice.
  70 *
  71 * TODO: Handle ndc (attempted store to doubleword in uncached memory)
  72 *	 exception for the R6000.
  73 *	 A store crossing a page boundary might be executed only partially.
  74 *	 Undo the partial store in this case.
  75 */
  76#include <linux/context_tracking.h>
  77#include <linux/mm.h>
  78#include <linux/signal.h>
  79#include <linux/smp.h>
  80#include <linux/sched.h>
  81#include <linux/debugfs.h>
  82#include <linux/perf_event.h>
  83
  84#include <asm/asm.h>
  85#include <asm/branch.h>
  86#include <asm/byteorder.h>
  87#include <asm/cop2.h>
 
  88#include <asm/fpu.h>
  89#include <asm/fpu_emulator.h>
  90#include <asm/inst.h>
  91#include <asm/uaccess.h>
  92#include <asm/fpu.h>
  93#include <asm/fpu_emulator.h>
  94
  95#define STR(x)	__STR(x)
  96#define __STR(x)  #x
  97
  98enum {
  99	UNALIGNED_ACTION_QUIET,
 100	UNALIGNED_ACTION_SIGNAL,
 101	UNALIGNED_ACTION_SHOW,
 102};
 103#ifdef CONFIG_DEBUG_FS
 104static u32 unaligned_instructions;
 105static u32 unaligned_action;
 106#else
 107#define unaligned_action UNALIGNED_ACTION_QUIET
 108#endif
 109extern void show_registers(struct pt_regs *regs);
 110
 111#ifdef __BIG_ENDIAN
 112#define     LoadHW(addr, value, res)  \
 
 113		__asm__ __volatile__ (".set\tnoat\n"        \
 114			"1:\t"user_lb("%0", "0(%2)")"\n"    \
 115			"2:\t"user_lbu("$1", "1(%2)")"\n\t" \
 116			"sll\t%0, 0x8\n\t"                  \
 117			"or\t%0, $1\n\t"                    \
 118			"li\t%1, 0\n"                       \
 119			"3:\t.set\tat\n\t"                  \
 120			".insn\n\t"                         \
 121			".section\t.fixup,\"ax\"\n\t"       \
 122			"4:\tli\t%1, %3\n\t"                \
 123			"j\t3b\n\t"                         \
 124			".previous\n\t"                     \
 125			".section\t__ex_table,\"a\"\n\t"    \
 126			STR(PTR)"\t1b, 4b\n\t"              \
 127			STR(PTR)"\t2b, 4b\n\t"              \
 128			".previous"                         \
 129			: "=&r" (value), "=r" (res)         \
 130			: "r" (addr), "i" (-EFAULT));
 
 131
 132#define     LoadW(addr, value, res)   \
 
 
 133		__asm__ __volatile__ (                      \
 134			"1:\t"user_lwl("%0", "(%2)")"\n"    \
 135			"2:\t"user_lwr("%0", "3(%2)")"\n\t" \
 136			"li\t%1, 0\n"                       \
 137			"3:\n\t"                            \
 138			".insn\n\t"                         \
 139			".section\t.fixup,\"ax\"\n\t"       \
 140			"4:\tli\t%1, %3\n\t"                \
 141			"j\t3b\n\t"                         \
 142			".previous\n\t"                     \
 143			".section\t__ex_table,\"a\"\n\t"    \
 144			STR(PTR)"\t1b, 4b\n\t"              \
 145			STR(PTR)"\t2b, 4b\n\t"              \
 146			".previous"                         \
 147			: "=&r" (value), "=r" (res)         \
 148			: "r" (addr), "i" (-EFAULT));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 149
 150#define     LoadHWU(addr, value, res) \
 
 151		__asm__ __volatile__ (                      \
 152			".set\tnoat\n"                      \
 153			"1:\t"user_lbu("%0", "0(%2)")"\n"   \
 154			"2:\t"user_lbu("$1", "1(%2)")"\n\t" \
 155			"sll\t%0, 0x8\n\t"                  \
 156			"or\t%0, $1\n\t"                    \
 157			"li\t%1, 0\n"                       \
 158			"3:\n\t"                            \
 159			".insn\n\t"                         \
 160			".set\tat\n\t"                      \
 161			".section\t.fixup,\"ax\"\n\t"       \
 162			"4:\tli\t%1, %3\n\t"                \
 163			"j\t3b\n\t"                         \
 164			".previous\n\t"                     \
 165			".section\t__ex_table,\"a\"\n\t"    \
 166			STR(PTR)"\t1b, 4b\n\t"              \
 167			STR(PTR)"\t2b, 4b\n\t"              \
 168			".previous"                         \
 169			: "=&r" (value), "=r" (res)         \
 170			: "r" (addr), "i" (-EFAULT));
 
 171
 172#define     LoadWU(addr, value, res)  \
 
 
 173		__asm__ __volatile__ (                      \
 174			"1:\t"user_lwl("%0", "(%2)")"\n"    \
 175			"2:\t"user_lwr("%0", "3(%2)")"\n\t" \
 176			"dsll\t%0, %0, 32\n\t"              \
 177			"dsrl\t%0, %0, 32\n\t"              \
 178			"li\t%1, 0\n"                       \
 179			"3:\n\t"                            \
 180			".insn\n\t"                         \
 181			"\t.section\t.fixup,\"ax\"\n\t"     \
 182			"4:\tli\t%1, %3\n\t"                \
 183			"j\t3b\n\t"                         \
 184			".previous\n\t"                     \
 185			".section\t__ex_table,\"a\"\n\t"    \
 186			STR(PTR)"\t1b, 4b\n\t"              \
 187			STR(PTR)"\t2b, 4b\n\t"              \
 188			".previous"                         \
 189			: "=&r" (value), "=r" (res)         \
 190			: "r" (addr), "i" (-EFAULT));
 
 191
 192#define     LoadDW(addr, value, res)  \
 
 193		__asm__ __volatile__ (                      \
 194			"1:\tldl\t%0, (%2)\n"               \
 195			"2:\tldr\t%0, 7(%2)\n\t"            \
 196			"li\t%1, 0\n"                       \
 197			"3:\n\t"                            \
 198			".insn\n\t"                         \
 199			"\t.section\t.fixup,\"ax\"\n\t"     \
 200			"4:\tli\t%1, %3\n\t"                \
 201			"j\t3b\n\t"                         \
 202			".previous\n\t"                     \
 203			".section\t__ex_table,\"a\"\n\t"    \
 204			STR(PTR)"\t1b, 4b\n\t"              \
 205			STR(PTR)"\t2b, 4b\n\t"              \
 206			".previous"                         \
 207			: "=&r" (value), "=r" (res)         \
 208			: "r" (addr), "i" (-EFAULT));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 209
 210#define     StoreHW(addr, value, res) \
 
 
 211		__asm__ __volatile__ (                      \
 212			".set\tnoat\n"                      \
 213			"1:\t"user_sb("%1", "1(%2)")"\n"    \
 214			"srl\t$1, %1, 0x8\n"                \
 215			"2:\t"user_sb("$1", "0(%2)")"\n"    \
 216			".set\tat\n\t"                      \
 217			"li\t%0, 0\n"                       \
 218			"3:\n\t"                            \
 219			".insn\n\t"                         \
 220			".section\t.fixup,\"ax\"\n\t"       \
 221			"4:\tli\t%0, %3\n\t"                \
 222			"j\t3b\n\t"                         \
 223			".previous\n\t"                     \
 224			".section\t__ex_table,\"a\"\n\t"    \
 225			STR(PTR)"\t1b, 4b\n\t"              \
 226			STR(PTR)"\t2b, 4b\n\t"              \
 227			".previous"                         \
 228			: "=r" (res)                        \
 229			: "r" (value), "r" (addr), "i" (-EFAULT));
 
 230
 231#define     StoreW(addr, value, res)  \
 
 
 232		__asm__ __volatile__ (                      \
 233			"1:\t"user_swl("%1", "(%2)")"\n"    \
 234			"2:\t"user_swr("%1", "3(%2)")"\n\t" \
 235			"li\t%0, 0\n"                       \
 236			"3:\n\t"                            \
 237			".insn\n\t"                         \
 238			".section\t.fixup,\"ax\"\n\t"       \
 239			"4:\tli\t%0, %3\n\t"                \
 240			"j\t3b\n\t"                         \
 241			".previous\n\t"                     \
 242			".section\t__ex_table,\"a\"\n\t"    \
 243			STR(PTR)"\t1b, 4b\n\t"              \
 244			STR(PTR)"\t2b, 4b\n\t"              \
 245			".previous"                         \
 246		: "=r" (res)                                \
 247		: "r" (value), "r" (addr), "i" (-EFAULT));
 
 248
 249#define     StoreDW(addr, value, res) \
 
 250		__asm__ __volatile__ (                      \
 251			"1:\tsdl\t%1,(%2)\n"                \
 252			"2:\tsdr\t%1, 7(%2)\n\t"            \
 253			"li\t%0, 0\n"                       \
 254			"3:\n\t"                            \
 255			".insn\n\t"                         \
 256			".section\t.fixup,\"ax\"\n\t"       \
 257			"4:\tli\t%0, %3\n\t"                \
 258			"j\t3b\n\t"                         \
 259			".previous\n\t"                     \
 260			".section\t__ex_table,\"a\"\n\t"    \
 261			STR(PTR)"\t1b, 4b\n\t"              \
 262			STR(PTR)"\t2b, 4b\n\t"              \
 263			".previous"                         \
 264		: "=r" (res)                                \
 265		: "r" (value), "r" (addr), "i" (-EFAULT));
 266#endif
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 267
 268#ifdef __LITTLE_ENDIAN
 269#define     LoadHW(addr, value, res)  \
 270		__asm__ __volatile__ (".set\tnoat\n"        \
 271			"1:\t"user_lb("%0", "1(%2)")"\n"    \
 272			"2:\t"user_lbu("$1", "0(%2)")"\n\t" \
 273			"sll\t%0, 0x8\n\t"                  \
 274			"or\t%0, $1\n\t"                    \
 275			"li\t%1, 0\n"                       \
 276			"3:\t.set\tat\n\t"                  \
 277			".insn\n\t"                         \
 278			".section\t.fixup,\"ax\"\n\t"       \
 279			"4:\tli\t%1, %3\n\t"                \
 280			"j\t3b\n\t"                         \
 281			".previous\n\t"                     \
 282			".section\t__ex_table,\"a\"\n\t"    \
 283			STR(PTR)"\t1b, 4b\n\t"              \
 284			STR(PTR)"\t2b, 4b\n\t"              \
 285			".previous"                         \
 286			: "=&r" (value), "=r" (res)         \
 287			: "r" (addr), "i" (-EFAULT));
 
 288
 289#define     LoadW(addr, value, res)   \
 
 
 290		__asm__ __volatile__ (                      \
 291			"1:\t"user_lwl("%0", "3(%2)")"\n"   \
 292			"2:\t"user_lwr("%0", "(%2)")"\n\t"  \
 293			"li\t%1, 0\n"                       \
 294			"3:\n\t"                            \
 295			".insn\n\t"                         \
 296			".section\t.fixup,\"ax\"\n\t"       \
 297			"4:\tli\t%1, %3\n\t"                \
 298			"j\t3b\n\t"                         \
 299			".previous\n\t"                     \
 300			".section\t__ex_table,\"a\"\n\t"    \
 301			STR(PTR)"\t1b, 4b\n\t"              \
 302			STR(PTR)"\t2b, 4b\n\t"              \
 303			".previous"                         \
 304			: "=&r" (value), "=r" (res)         \
 305			: "r" (addr), "i" (-EFAULT));
 
 306
 307#define     LoadHWU(addr, value, res) \
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 308		__asm__ __volatile__ (                      \
 309			".set\tnoat\n"                      \
 310			"1:\t"user_lbu("%0", "1(%2)")"\n"   \
 311			"2:\t"user_lbu("$1", "0(%2)")"\n\t" \
 312			"sll\t%0, 0x8\n\t"                  \
 313			"or\t%0, $1\n\t"                    \
 314			"li\t%1, 0\n"                       \
 315			"3:\n\t"                            \
 316			".insn\n\t"                         \
 317			".set\tat\n\t"                      \
 318			".section\t.fixup,\"ax\"\n\t"       \
 319			"4:\tli\t%1, %3\n\t"                \
 320			"j\t3b\n\t"                         \
 321			".previous\n\t"                     \
 322			".section\t__ex_table,\"a\"\n\t"    \
 323			STR(PTR)"\t1b, 4b\n\t"              \
 324			STR(PTR)"\t2b, 4b\n\t"              \
 325			".previous"                         \
 326			: "=&r" (value), "=r" (res)         \
 327			: "r" (addr), "i" (-EFAULT));
 
 328
 329#define     LoadWU(addr, value, res)  \
 
 
 330		__asm__ __volatile__ (                      \
 331			"1:\t"user_lwl("%0", "3(%2)")"\n"   \
 332			"2:\t"user_lwr("%0", "(%2)")"\n\t"  \
 333			"dsll\t%0, %0, 32\n\t"              \
 334			"dsrl\t%0, %0, 32\n\t"              \
 335			"li\t%1, 0\n"                       \
 336			"3:\n\t"                            \
 337			".insn\n\t"                         \
 338			"\t.section\t.fixup,\"ax\"\n\t"     \
 339			"4:\tli\t%1, %3\n\t"                \
 340			"j\t3b\n\t"                         \
 341			".previous\n\t"                     \
 342			".section\t__ex_table,\"a\"\n\t"    \
 343			STR(PTR)"\t1b, 4b\n\t"              \
 344			STR(PTR)"\t2b, 4b\n\t"              \
 345			".previous"                         \
 346			: "=&r" (value), "=r" (res)         \
 347			: "r" (addr), "i" (-EFAULT));
 
 348
 349#define     LoadDW(addr, value, res)  \
 
 350		__asm__ __volatile__ (                      \
 351			"1:\tldl\t%0, 7(%2)\n"              \
 352			"2:\tldr\t%0, (%2)\n\t"             \
 353			"li\t%1, 0\n"                       \
 354			"3:\n\t"                            \
 355			".insn\n\t"                         \
 356			"\t.section\t.fixup,\"ax\"\n\t"     \
 357			"4:\tli\t%1, %3\n\t"                \
 358			"j\t3b\n\t"                         \
 359			".previous\n\t"                     \
 360			".section\t__ex_table,\"a\"\n\t"    \
 361			STR(PTR)"\t1b, 4b\n\t"              \
 362			STR(PTR)"\t2b, 4b\n\t"              \
 363			".previous"                         \
 364			: "=&r" (value), "=r" (res)         \
 365			: "r" (addr), "i" (-EFAULT));
 
 366
 367#define     StoreHW(addr, value, res) \
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 368		__asm__ __volatile__ (                      \
 369			".set\tnoat\n"                      \
 370			"1:\t"user_sb("%1", "0(%2)")"\n"    \
 371			"srl\t$1,%1, 0x8\n"                 \
 372			"2:\t"user_sb("$1", "1(%2)")"\n"    \
 373			".set\tat\n\t"                      \
 374			"li\t%0, 0\n"                       \
 375			"3:\n\t"                            \
 376			".insn\n\t"                         \
 377			".section\t.fixup,\"ax\"\n\t"       \
 378			"4:\tli\t%0, %3\n\t"                \
 379			"j\t3b\n\t"                         \
 380			".previous\n\t"                     \
 381			".section\t__ex_table,\"a\"\n\t"    \
 382			STR(PTR)"\t1b, 4b\n\t"              \
 383			STR(PTR)"\t2b, 4b\n\t"              \
 384			".previous"                         \
 385			: "=r" (res)                        \
 386			: "r" (value), "r" (addr), "i" (-EFAULT));
 
 387
 388#define     StoreW(addr, value, res)  \
 
 
 389		__asm__ __volatile__ (                      \
 390			"1:\t"user_swl("%1", "3(%2)")"\n"   \
 391			"2:\t"user_swr("%1", "(%2)")"\n\t"  \
 392			"li\t%0, 0\n"                       \
 393			"3:\n\t"                            \
 394			".insn\n\t"                         \
 395			".section\t.fixup,\"ax\"\n\t"       \
 396			"4:\tli\t%0, %3\n\t"                \
 397			"j\t3b\n\t"                         \
 398			".previous\n\t"                     \
 399			".section\t__ex_table,\"a\"\n\t"    \
 400			STR(PTR)"\t1b, 4b\n\t"              \
 401			STR(PTR)"\t2b, 4b\n\t"              \
 402			".previous"                         \
 403		: "=r" (res)                                \
 404		: "r" (value), "r" (addr), "i" (-EFAULT));
 
 405
 406#define     StoreDW(addr, value, res) \
 
 407		__asm__ __volatile__ (                      \
 408			"1:\tsdl\t%1, 7(%2)\n"              \
 409			"2:\tsdr\t%1, (%2)\n\t"             \
 410			"li\t%0, 0\n"                       \
 411			"3:\n\t"                            \
 412			".insn\n\t"                         \
 413			".section\t.fixup,\"ax\"\n\t"       \
 414			"4:\tli\t%0, %3\n\t"                \
 415			"j\t3b\n\t"                         \
 416			".previous\n\t"                     \
 417			".section\t__ex_table,\"a\"\n\t"    \
 418			STR(PTR)"\t1b, 4b\n\t"              \
 419			STR(PTR)"\t2b, 4b\n\t"              \
 420			".previous"                         \
 421		: "=r" (res)                                \
 422		: "r" (value), "r" (addr), "i" (-EFAULT));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 423#endif
 424
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 425static void emulate_load_store_insn(struct pt_regs *regs,
 426	void __user *addr, unsigned int __user *pc)
 427{
 428	union mips_instruction insn;
 429	unsigned long value;
 430	unsigned int res;
 431	unsigned long origpc;
 432	unsigned long orig31;
 433	void __user *fault_addr = NULL;
 434#ifdef	CONFIG_EVA
 435	mm_segment_t seg;
 436#endif
 
 
 
 437	origpc = (unsigned long)pc;
 438	orig31 = regs->regs[31];
 439
 440	perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0);
 441
 442	/*
 443	 * This load never faults.
 444	 */
 445	__get_user(insn.word, pc);
 446
 447	switch (insn.i_format.opcode) {
 448		/*
 449		 * These are instructions that a compiler doesn't generate.  We
 450		 * can assume therefore that the code is MIPS-aware and
 451		 * really buggy.  Emulating these instructions would break the
 452		 * semantics anyway.
 453		 */
 454	case ll_op:
 455	case lld_op:
 456	case sc_op:
 457	case scd_op:
 458
 459		/*
 460		 * For these instructions the only way to create an address
 461		 * error is an attempted access to kernel/supervisor address
 462		 * space.
 463		 */
 464	case ldl_op:
 465	case ldr_op:
 466	case lwl_op:
 467	case lwr_op:
 468	case sdl_op:
 469	case sdr_op:
 470	case swl_op:
 471	case swr_op:
 472	case lb_op:
 473	case lbu_op:
 474	case sb_op:
 475		goto sigbus;
 476
 477		/*
 478		 * The remaining opcodes are the ones that are really of
 479		 * interest.
 480		 */
 481#ifdef CONFIG_EVA
 482	case spec3_op:
 483		/*
 484		 * we can land here only from kernel accessing user memory,
 485		 * so we need to "switch" the address limit to user space, so
 486		 * address check can work properly.
 487		 */
 488		seg = get_fs();
 489		set_fs(USER_DS);
 490		switch (insn.spec3_format.func) {
 491		case lhe_op:
 492			if (!access_ok(VERIFY_READ, addr, 2)) {
 493				set_fs(seg);
 494				goto sigbus;
 495			}
 496			LoadHW(addr, value, res);
 497			if (res) {
 498				set_fs(seg);
 499				goto fault;
 500			}
 501			compute_return_epc(regs);
 502			regs->regs[insn.spec3_format.rt] = value;
 503			break;
 504		case lwe_op:
 505			if (!access_ok(VERIFY_READ, addr, 4)) {
 506				set_fs(seg);
 507				goto sigbus;
 508			}
 509				LoadW(addr, value, res);
 510			if (res) {
 511				set_fs(seg);
 512				goto fault;
 
 
 
 
 
 
 
 
 
 
 
 
 
 513			}
 514			compute_return_epc(regs);
 515			regs->regs[insn.spec3_format.rt] = value;
 516			break;
 517		case lhue_op:
 518			if (!access_ok(VERIFY_READ, addr, 2)) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 519				set_fs(seg);
 520				goto sigbus;
 521			}
 522			LoadHWU(addr, value, res);
 523			if (res) {
 524				set_fs(seg);
 525				goto fault;
 526			}
 527			compute_return_epc(regs);
 528			regs->regs[insn.spec3_format.rt] = value;
 529			break;
 530		case she_op:
 531			if (!access_ok(VERIFY_WRITE, addr, 2)) {
 532				set_fs(seg);
 533				goto sigbus;
 534			}
 535			compute_return_epc(regs);
 536			value = regs->regs[insn.spec3_format.rt];
 537			StoreHW(addr, value, res);
 538			if (res) {
 539				set_fs(seg);
 540				goto fault;
 541			}
 542			break;
 543		case swe_op:
 544			if (!access_ok(VERIFY_WRITE, addr, 4)) {
 545				set_fs(seg);
 546				goto sigbus;
 547			}
 548			compute_return_epc(regs);
 549			value = regs->regs[insn.spec3_format.rt];
 550			StoreW(addr, value, res);
 551			if (res) {
 552				set_fs(seg);
 553				goto fault;
 554			}
 555			break;
 556		default:
 557			set_fs(seg);
 558			goto sigill;
 559		}
 560		set_fs(seg);
 561		break;
 562#endif
 563	case lh_op:
 564		if (!access_ok(VERIFY_READ, addr, 2))
 565			goto sigbus;
 566
 567		LoadHW(addr, value, res);
 
 
 
 
 
 
 
 
 568		if (res)
 569			goto fault;
 570		compute_return_epc(regs);
 571		regs->regs[insn.i_format.rt] = value;
 572		break;
 573
 574	case lw_op:
 575		if (!access_ok(VERIFY_READ, addr, 4))
 576			goto sigbus;
 577
 578		LoadW(addr, value, res);
 
 
 
 
 
 
 
 
 579		if (res)
 580			goto fault;
 581		compute_return_epc(regs);
 582		regs->regs[insn.i_format.rt] = value;
 583		break;
 584
 585	case lhu_op:
 586		if (!access_ok(VERIFY_READ, addr, 2))
 587			goto sigbus;
 588
 589		LoadHWU(addr, value, res);
 
 
 
 
 
 
 
 
 590		if (res)
 591			goto fault;
 592		compute_return_epc(regs);
 593		regs->regs[insn.i_format.rt] = value;
 594		break;
 595
 596	case lwu_op:
 597#ifdef CONFIG_64BIT
 598		/*
 599		 * A 32-bit kernel might be running on a 64-bit processor.  But
 600		 * if we're on a 32-bit processor and an i-cache incoherency
 601		 * or race makes us see a 64-bit instruction here the sdl/sdr
 602		 * would blow up, so for now we don't handle unaligned 64-bit
 603		 * instructions on 32-bit kernels.
 604		 */
 605		if (!access_ok(VERIFY_READ, addr, 4))
 606			goto sigbus;
 607
 608		LoadWU(addr, value, res);
 609		if (res)
 610			goto fault;
 611		compute_return_epc(regs);
 612		regs->regs[insn.i_format.rt] = value;
 613		break;
 614#endif /* CONFIG_64BIT */
 615
 616		/* Cannot handle 64-bit instructions in 32-bit kernel */
 617		goto sigill;
 618
 619	case ld_op:
 620#ifdef CONFIG_64BIT
 621		/*
 622		 * A 32-bit kernel might be running on a 64-bit processor.  But
 623		 * if we're on a 32-bit processor and an i-cache incoherency
 624		 * or race makes us see a 64-bit instruction here the sdl/sdr
 625		 * would blow up, so for now we don't handle unaligned 64-bit
 626		 * instructions on 32-bit kernels.
 627		 */
 628		if (!access_ok(VERIFY_READ, addr, 8))
 629			goto sigbus;
 630
 631		LoadDW(addr, value, res);
 632		if (res)
 633			goto fault;
 634		compute_return_epc(regs);
 635		regs->regs[insn.i_format.rt] = value;
 636		break;
 637#endif /* CONFIG_64BIT */
 638
 639		/* Cannot handle 64-bit instructions in 32-bit kernel */
 640		goto sigill;
 641
 642	case sh_op:
 643		if (!access_ok(VERIFY_WRITE, addr, 2))
 644			goto sigbus;
 645
 646		compute_return_epc(regs);
 647		value = regs->regs[insn.i_format.rt];
 648		StoreHW(addr, value, res);
 
 
 
 
 
 
 
 
 
 649		if (res)
 650			goto fault;
 651		break;
 652
 653	case sw_op:
 654		if (!access_ok(VERIFY_WRITE, addr, 4))
 655			goto sigbus;
 656
 657		compute_return_epc(regs);
 658		value = regs->regs[insn.i_format.rt];
 659		StoreW(addr, value, res);
 
 
 
 
 
 
 
 
 
 660		if (res)
 661			goto fault;
 662		break;
 663
 664	case sd_op:
 665#ifdef CONFIG_64BIT
 666		/*
 667		 * A 32-bit kernel might be running on a 64-bit processor.  But
 668		 * if we're on a 32-bit processor and an i-cache incoherency
 669		 * or race makes us see a 64-bit instruction here the sdl/sdr
 670		 * would blow up, so for now we don't handle unaligned 64-bit
 671		 * instructions on 32-bit kernels.
 672		 */
 673		if (!access_ok(VERIFY_WRITE, addr, 8))
 674			goto sigbus;
 675
 676		compute_return_epc(regs);
 677		value = regs->regs[insn.i_format.rt];
 678		StoreDW(addr, value, res);
 679		if (res)
 680			goto fault;
 681		break;
 682#endif /* CONFIG_64BIT */
 683
 684		/* Cannot handle 64-bit instructions in 32-bit kernel */
 685		goto sigill;
 686
 687	case lwc1_op:
 688	case ldc1_op:
 689	case swc1_op:
 690	case sdc1_op:
 
 691		die_if_kernel("Unaligned FP access in kernel code", regs);
 692		BUG_ON(!used_math());
 693		BUG_ON(!is_fpu_owner());
 694
 695		lose_fpu(1);	/* Save FPU state for the emulator. */
 696		res = fpu_emulator_cop1Handler(regs, &current->thread.fpu, 1,
 697					       &fault_addr);
 698		own_fpu(1);	/* Restore FPU state. */
 699
 700		/* Signal if something went wrong. */
 701		process_fpemu_return(res, fault_addr);
 702
 703		if (res == 0)
 704			break;
 705		return;
 706
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 707	/*
 708	 * COP2 is available to implementor for application specific use.
 709	 * It's up to applications to register a notifier chain and do
 710	 * whatever they have to do, including possible sending of signals.
 
 
 711	 */
 712	case lwc2_op:
 713		cu2_notifier_call_chain(CU2_LWC2_OP, regs);
 714		break;
 715
 716	case ldc2_op:
 717		cu2_notifier_call_chain(CU2_LDC2_OP, regs);
 718		break;
 719
 720	case swc2_op:
 721		cu2_notifier_call_chain(CU2_SWC2_OP, regs);
 722		break;
 723
 724	case sdc2_op:
 725		cu2_notifier_call_chain(CU2_SDC2_OP, regs);
 726		break;
 727
 728	default:
 729		/*
 730		 * Pheeee...  We encountered an yet unknown instruction or
 731		 * cache coherence problem.  Die sucker, die ...
 732		 */
 733		goto sigill;
 734	}
 735
 736#ifdef CONFIG_DEBUG_FS
 737	unaligned_instructions++;
 738#endif
 739
 740	return;
 741
 742fault:
 743	/* roll back jump/branch */
 744	regs->cp0_epc = origpc;
 745	regs->regs[31] = orig31;
 746	/* Did we have an exception handler installed? */
 747	if (fixup_exception(regs))
 748		return;
 749
 750	die_if_kernel("Unhandled kernel unaligned access", regs);
 751	force_sig(SIGSEGV, current);
 752
 753	return;
 754
 755sigbus:
 756	die_if_kernel("Unhandled kernel unaligned access", regs);
 757	force_sig(SIGBUS, current);
 758
 759	return;
 760
 761sigill:
 762	die_if_kernel
 763	    ("Unhandled kernel unaligned access or invalid instruction", regs);
 764	force_sig(SIGILL, current);
 765}
 766
 767/* Recode table from 16-bit register notation to 32-bit GPR. */
 768const int reg16to32[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
 769
 770/* Recode table from 16-bit STORE register notation to 32-bit GPR. */
 771const int reg16to32st[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
 772
 773static void emulate_load_store_microMIPS(struct pt_regs *regs,
 774					 void __user *addr)
 775{
 776	unsigned long value;
 777	unsigned int res;
 778	int i;
 779	unsigned int reg = 0, rvar;
 780	unsigned long orig31;
 781	u16 __user *pc16;
 782	u16 halfword;
 783	unsigned int word;
 784	unsigned long origpc, contpc;
 785	union mips_instruction insn;
 786	struct mm_decoded_insn mminsn;
 787	void __user *fault_addr = NULL;
 788
 789	origpc = regs->cp0_epc;
 790	orig31 = regs->regs[31];
 791
 792	mminsn.micro_mips_mode = 1;
 793
 794	/*
 795	 * This load never faults.
 796	 */
 797	pc16 = (unsigned short __user *)msk_isa16_mode(regs->cp0_epc);
 798	__get_user(halfword, pc16);
 799	pc16++;
 800	contpc = regs->cp0_epc + 2;
 801	word = ((unsigned int)halfword << 16);
 802	mminsn.pc_inc = 2;
 803
 804	if (!mm_insn_16bit(halfword)) {
 805		__get_user(halfword, pc16);
 806		pc16++;
 807		contpc = regs->cp0_epc + 4;
 808		mminsn.pc_inc = 4;
 809		word |= halfword;
 810	}
 811	mminsn.insn = word;
 812
 813	if (get_user(halfword, pc16))
 814		goto fault;
 815	mminsn.next_pc_inc = 2;
 816	word = ((unsigned int)halfword << 16);
 817
 818	if (!mm_insn_16bit(halfword)) {
 819		pc16++;
 820		if (get_user(halfword, pc16))
 821			goto fault;
 822		mminsn.next_pc_inc = 4;
 823		word |= halfword;
 824	}
 825	mminsn.next_insn = word;
 826
 827	insn = (union mips_instruction)(mminsn.insn);
 828	if (mm_isBranchInstr(regs, mminsn, &contpc))
 829		insn = (union mips_instruction)(mminsn.next_insn);
 830
 831	/*  Parse instruction to find what to do */
 832
 833	switch (insn.mm_i_format.opcode) {
 834
 835	case mm_pool32a_op:
 836		switch (insn.mm_x_format.func) {
 837		case mm_lwxs_op:
 838			reg = insn.mm_x_format.rd;
 839			goto loadW;
 840		}
 841
 842		goto sigbus;
 843
 844	case mm_pool32b_op:
 845		switch (insn.mm_m_format.func) {
 846		case mm_lwp_func:
 847			reg = insn.mm_m_format.rd;
 848			if (reg == 31)
 849				goto sigbus;
 850
 851			if (!access_ok(VERIFY_READ, addr, 8))
 852				goto sigbus;
 853
 854			LoadW(addr, value, res);
 855			if (res)
 856				goto fault;
 857			regs->regs[reg] = value;
 858			addr += 4;
 859			LoadW(addr, value, res);
 860			if (res)
 861				goto fault;
 862			regs->regs[reg + 1] = value;
 863			goto success;
 864
 865		case mm_swp_func:
 866			reg = insn.mm_m_format.rd;
 867			if (reg == 31)
 868				goto sigbus;
 869
 870			if (!access_ok(VERIFY_WRITE, addr, 8))
 871				goto sigbus;
 872
 873			value = regs->regs[reg];
 874			StoreW(addr, value, res);
 875			if (res)
 876				goto fault;
 877			addr += 4;
 878			value = regs->regs[reg + 1];
 879			StoreW(addr, value, res);
 880			if (res)
 881				goto fault;
 882			goto success;
 883
 884		case mm_ldp_func:
 885#ifdef CONFIG_64BIT
 886			reg = insn.mm_m_format.rd;
 887			if (reg == 31)
 888				goto sigbus;
 889
 890			if (!access_ok(VERIFY_READ, addr, 16))
 891				goto sigbus;
 892
 893			LoadDW(addr, value, res);
 894			if (res)
 895				goto fault;
 896			regs->regs[reg] = value;
 897			addr += 8;
 898			LoadDW(addr, value, res);
 899			if (res)
 900				goto fault;
 901			regs->regs[reg + 1] = value;
 902			goto success;
 903#endif /* CONFIG_64BIT */
 904
 905			goto sigill;
 906
 907		case mm_sdp_func:
 908#ifdef CONFIG_64BIT
 909			reg = insn.mm_m_format.rd;
 910			if (reg == 31)
 911				goto sigbus;
 912
 913			if (!access_ok(VERIFY_WRITE, addr, 16))
 914				goto sigbus;
 915
 916			value = regs->regs[reg];
 917			StoreDW(addr, value, res);
 918			if (res)
 919				goto fault;
 920			addr += 8;
 921			value = regs->regs[reg + 1];
 922			StoreDW(addr, value, res);
 923			if (res)
 924				goto fault;
 925			goto success;
 926#endif /* CONFIG_64BIT */
 927
 928			goto sigill;
 929
 930		case mm_lwm32_func:
 931			reg = insn.mm_m_format.rd;
 932			rvar = reg & 0xf;
 933			if ((rvar > 9) || !reg)
 934				goto sigill;
 935			if (reg & 0x10) {
 936				if (!access_ok
 937				    (VERIFY_READ, addr, 4 * (rvar + 1)))
 938					goto sigbus;
 939			} else {
 940				if (!access_ok(VERIFY_READ, addr, 4 * rvar))
 941					goto sigbus;
 942			}
 943			if (rvar == 9)
 944				rvar = 8;
 945			for (i = 16; rvar; rvar--, i++) {
 946				LoadW(addr, value, res);
 947				if (res)
 948					goto fault;
 949				addr += 4;
 950				regs->regs[i] = value;
 951			}
 952			if ((reg & 0xf) == 9) {
 953				LoadW(addr, value, res);
 954				if (res)
 955					goto fault;
 956				addr += 4;
 957				regs->regs[30] = value;
 958			}
 959			if (reg & 0x10) {
 960				LoadW(addr, value, res);
 961				if (res)
 962					goto fault;
 963				regs->regs[31] = value;
 964			}
 965			goto success;
 966
 967		case mm_swm32_func:
 968			reg = insn.mm_m_format.rd;
 969			rvar = reg & 0xf;
 970			if ((rvar > 9) || !reg)
 971				goto sigill;
 972			if (reg & 0x10) {
 973				if (!access_ok
 974				    (VERIFY_WRITE, addr, 4 * (rvar + 1)))
 975					goto sigbus;
 976			} else {
 977				if (!access_ok(VERIFY_WRITE, addr, 4 * rvar))
 978					goto sigbus;
 979			}
 980			if (rvar == 9)
 981				rvar = 8;
 982			for (i = 16; rvar; rvar--, i++) {
 983				value = regs->regs[i];
 984				StoreW(addr, value, res);
 985				if (res)
 986					goto fault;
 987				addr += 4;
 988			}
 989			if ((reg & 0xf) == 9) {
 990				value = regs->regs[30];
 991				StoreW(addr, value, res);
 992				if (res)
 993					goto fault;
 994				addr += 4;
 995			}
 996			if (reg & 0x10) {
 997				value = regs->regs[31];
 998				StoreW(addr, value, res);
 999				if (res)
1000					goto fault;
1001			}
1002			goto success;
1003
1004		case mm_ldm_func:
1005#ifdef CONFIG_64BIT
1006			reg = insn.mm_m_format.rd;
1007			rvar = reg & 0xf;
1008			if ((rvar > 9) || !reg)
1009				goto sigill;
1010			if (reg & 0x10) {
1011				if (!access_ok
1012				    (VERIFY_READ, addr, 8 * (rvar + 1)))
1013					goto sigbus;
1014			} else {
1015				if (!access_ok(VERIFY_READ, addr, 8 * rvar))
1016					goto sigbus;
1017			}
1018			if (rvar == 9)
1019				rvar = 8;
1020
1021			for (i = 16; rvar; rvar--, i++) {
1022				LoadDW(addr, value, res);
1023				if (res)
1024					goto fault;
1025				addr += 4;
1026				regs->regs[i] = value;
1027			}
1028			if ((reg & 0xf) == 9) {
1029				LoadDW(addr, value, res);
1030				if (res)
1031					goto fault;
1032				addr += 8;
1033				regs->regs[30] = value;
1034			}
1035			if (reg & 0x10) {
1036				LoadDW(addr, value, res);
1037				if (res)
1038					goto fault;
1039				regs->regs[31] = value;
1040			}
1041			goto success;
1042#endif /* CONFIG_64BIT */
1043
1044			goto sigill;
1045
1046		case mm_sdm_func:
1047#ifdef CONFIG_64BIT
1048			reg = insn.mm_m_format.rd;
1049			rvar = reg & 0xf;
1050			if ((rvar > 9) || !reg)
1051				goto sigill;
1052			if (reg & 0x10) {
1053				if (!access_ok
1054				    (VERIFY_WRITE, addr, 8 * (rvar + 1)))
1055					goto sigbus;
1056			} else {
1057				if (!access_ok(VERIFY_WRITE, addr, 8 * rvar))
1058					goto sigbus;
1059			}
1060			if (rvar == 9)
1061				rvar = 8;
1062
1063			for (i = 16; rvar; rvar--, i++) {
1064				value = regs->regs[i];
1065				StoreDW(addr, value, res);
1066				if (res)
1067					goto fault;
1068				addr += 8;
1069			}
1070			if ((reg & 0xf) == 9) {
1071				value = regs->regs[30];
1072				StoreDW(addr, value, res);
1073				if (res)
1074					goto fault;
1075				addr += 8;
1076			}
1077			if (reg & 0x10) {
1078				value = regs->regs[31];
1079				StoreDW(addr, value, res);
1080				if (res)
1081					goto fault;
1082			}
1083			goto success;
1084#endif /* CONFIG_64BIT */
1085
1086			goto sigill;
1087
1088			/*  LWC2, SWC2, LDC2, SDC2 are not serviced */
1089		}
1090
1091		goto sigbus;
1092
1093	case mm_pool32c_op:
1094		switch (insn.mm_m_format.func) {
1095		case mm_lwu_func:
1096			reg = insn.mm_m_format.rd;
1097			goto loadWU;
1098		}
1099
1100		/*  LL,SC,LLD,SCD are not serviced */
1101		goto sigbus;
1102
1103	case mm_pool32f_op:
1104		switch (insn.mm_x_format.func) {
1105		case mm_lwxc1_func:
1106		case mm_swxc1_func:
1107		case mm_ldxc1_func:
1108		case mm_sdxc1_func:
1109			goto fpu_emul;
1110		}
1111
1112		goto sigbus;
1113
1114	case mm_ldc132_op:
1115	case mm_sdc132_op:
1116	case mm_lwc132_op:
1117	case mm_swc132_op:
1118fpu_emul:
1119		/* roll back jump/branch */
1120		regs->cp0_epc = origpc;
1121		regs->regs[31] = orig31;
1122
1123		die_if_kernel("Unaligned FP access in kernel code", regs);
1124		BUG_ON(!used_math());
1125		BUG_ON(!is_fpu_owner());
1126
1127		lose_fpu(1);	/* save the FPU state for the emulator */
1128		res = fpu_emulator_cop1Handler(regs, &current->thread.fpu, 1,
1129					       &fault_addr);
1130		own_fpu(1);	/* restore FPU state */
1131
1132		/* If something went wrong, signal */
1133		process_fpemu_return(res, fault_addr);
1134
1135		if (res == 0)
1136			goto success;
1137		return;
1138
1139	case mm_lh32_op:
1140		reg = insn.mm_i_format.rt;
1141		goto loadHW;
1142
1143	case mm_lhu32_op:
1144		reg = insn.mm_i_format.rt;
1145		goto loadHWU;
1146
1147	case mm_lw32_op:
1148		reg = insn.mm_i_format.rt;
1149		goto loadW;
1150
1151	case mm_sh32_op:
1152		reg = insn.mm_i_format.rt;
1153		goto storeHW;
1154
1155	case mm_sw32_op:
1156		reg = insn.mm_i_format.rt;
1157		goto storeW;
1158
1159	case mm_ld32_op:
1160		reg = insn.mm_i_format.rt;
1161		goto loadDW;
1162
1163	case mm_sd32_op:
1164		reg = insn.mm_i_format.rt;
1165		goto storeDW;
1166
1167	case mm_pool16c_op:
1168		switch (insn.mm16_m_format.func) {
1169		case mm_lwm16_op:
1170			reg = insn.mm16_m_format.rlist;
1171			rvar = reg + 1;
1172			if (!access_ok(VERIFY_READ, addr, 4 * rvar))
1173				goto sigbus;
1174
1175			for (i = 16; rvar; rvar--, i++) {
1176				LoadW(addr, value, res);
1177				if (res)
1178					goto fault;
1179				addr += 4;
1180				regs->regs[i] = value;
1181			}
1182			LoadW(addr, value, res);
1183			if (res)
1184				goto fault;
1185			regs->regs[31] = value;
1186
1187			goto success;
1188
1189		case mm_swm16_op:
1190			reg = insn.mm16_m_format.rlist;
1191			rvar = reg + 1;
1192			if (!access_ok(VERIFY_WRITE, addr, 4 * rvar))
1193				goto sigbus;
1194
1195			for (i = 16; rvar; rvar--, i++) {
1196				value = regs->regs[i];
1197				StoreW(addr, value, res);
1198				if (res)
1199					goto fault;
1200				addr += 4;
1201			}
1202			value = regs->regs[31];
1203			StoreW(addr, value, res);
1204			if (res)
1205				goto fault;
1206
1207			goto success;
1208
1209		}
1210
1211		goto sigbus;
1212
1213	case mm_lhu16_op:
1214		reg = reg16to32[insn.mm16_rb_format.rt];
1215		goto loadHWU;
1216
1217	case mm_lw16_op:
1218		reg = reg16to32[insn.mm16_rb_format.rt];
1219		goto loadW;
1220
1221	case mm_sh16_op:
1222		reg = reg16to32st[insn.mm16_rb_format.rt];
1223		goto storeHW;
1224
1225	case mm_sw16_op:
1226		reg = reg16to32st[insn.mm16_rb_format.rt];
1227		goto storeW;
1228
1229	case mm_lwsp16_op:
1230		reg = insn.mm16_r5_format.rt;
1231		goto loadW;
1232
1233	case mm_swsp16_op:
1234		reg = insn.mm16_r5_format.rt;
1235		goto storeW;
1236
1237	case mm_lwgp16_op:
1238		reg = reg16to32[insn.mm16_r3_format.rt];
1239		goto loadW;
1240
1241	default:
1242		goto sigill;
1243	}
1244
1245loadHW:
1246	if (!access_ok(VERIFY_READ, addr, 2))
1247		goto sigbus;
1248
1249	LoadHW(addr, value, res);
1250	if (res)
1251		goto fault;
1252	regs->regs[reg] = value;
1253	goto success;
1254
1255loadHWU:
1256	if (!access_ok(VERIFY_READ, addr, 2))
1257		goto sigbus;
1258
1259	LoadHWU(addr, value, res);
1260	if (res)
1261		goto fault;
1262	regs->regs[reg] = value;
1263	goto success;
1264
1265loadW:
1266	if (!access_ok(VERIFY_READ, addr, 4))
1267		goto sigbus;
1268
1269	LoadW(addr, value, res);
1270	if (res)
1271		goto fault;
1272	regs->regs[reg] = value;
1273	goto success;
1274
1275loadWU:
1276#ifdef CONFIG_64BIT
1277	/*
1278	 * A 32-bit kernel might be running on a 64-bit processor.  But
1279	 * if we're on a 32-bit processor and an i-cache incoherency
1280	 * or race makes us see a 64-bit instruction here the sdl/sdr
1281	 * would blow up, so for now we don't handle unaligned 64-bit
1282	 * instructions on 32-bit kernels.
1283	 */
1284	if (!access_ok(VERIFY_READ, addr, 4))
1285		goto sigbus;
1286
1287	LoadWU(addr, value, res);
1288	if (res)
1289		goto fault;
1290	regs->regs[reg] = value;
1291	goto success;
1292#endif /* CONFIG_64BIT */
1293
1294	/* Cannot handle 64-bit instructions in 32-bit kernel */
1295	goto sigill;
1296
1297loadDW:
1298#ifdef CONFIG_64BIT
1299	/*
1300	 * A 32-bit kernel might be running on a 64-bit processor.  But
1301	 * if we're on a 32-bit processor and an i-cache incoherency
1302	 * or race makes us see a 64-bit instruction here the sdl/sdr
1303	 * would blow up, so for now we don't handle unaligned 64-bit
1304	 * instructions on 32-bit kernels.
1305	 */
1306	if (!access_ok(VERIFY_READ, addr, 8))
1307		goto sigbus;
1308
1309	LoadDW(addr, value, res);
1310	if (res)
1311		goto fault;
1312	regs->regs[reg] = value;
1313	goto success;
1314#endif /* CONFIG_64BIT */
1315
1316	/* Cannot handle 64-bit instructions in 32-bit kernel */
1317	goto sigill;
1318
1319storeHW:
1320	if (!access_ok(VERIFY_WRITE, addr, 2))
1321		goto sigbus;
1322
1323	value = regs->regs[reg];
1324	StoreHW(addr, value, res);
1325	if (res)
1326		goto fault;
1327	goto success;
1328
1329storeW:
1330	if (!access_ok(VERIFY_WRITE, addr, 4))
1331		goto sigbus;
1332
1333	value = regs->regs[reg];
1334	StoreW(addr, value, res);
1335	if (res)
1336		goto fault;
1337	goto success;
1338
1339storeDW:
1340#ifdef CONFIG_64BIT
1341	/*
1342	 * A 32-bit kernel might be running on a 64-bit processor.  But
1343	 * if we're on a 32-bit processor and an i-cache incoherency
1344	 * or race makes us see a 64-bit instruction here the sdl/sdr
1345	 * would blow up, so for now we don't handle unaligned 64-bit
1346	 * instructions on 32-bit kernels.
1347	 */
1348	if (!access_ok(VERIFY_WRITE, addr, 8))
1349		goto sigbus;
1350
1351	value = regs->regs[reg];
1352	StoreDW(addr, value, res);
1353	if (res)
1354		goto fault;
1355	goto success;
1356#endif /* CONFIG_64BIT */
1357
1358	/* Cannot handle 64-bit instructions in 32-bit kernel */
1359	goto sigill;
1360
1361success:
1362	regs->cp0_epc = contpc;	/* advance or branch */
1363
1364#ifdef CONFIG_DEBUG_FS
1365	unaligned_instructions++;
1366#endif
1367	return;
1368
1369fault:
1370	/* roll back jump/branch */
1371	regs->cp0_epc = origpc;
1372	regs->regs[31] = orig31;
1373	/* Did we have an exception handler installed? */
1374	if (fixup_exception(regs))
1375		return;
1376
1377	die_if_kernel("Unhandled kernel unaligned access", regs);
1378	force_sig(SIGSEGV, current);
1379
1380	return;
1381
1382sigbus:
1383	die_if_kernel("Unhandled kernel unaligned access", regs);
1384	force_sig(SIGBUS, current);
1385
1386	return;
1387
1388sigill:
1389	die_if_kernel
1390	    ("Unhandled kernel unaligned access or invalid instruction", regs);
1391	force_sig(SIGILL, current);
1392}
1393
1394static void emulate_load_store_MIPS16e(struct pt_regs *regs, void __user * addr)
1395{
1396	unsigned long value;
1397	unsigned int res;
1398	int reg;
1399	unsigned long orig31;
1400	u16 __user *pc16;
1401	unsigned long origpc;
1402	union mips16e_instruction mips16inst, oldinst;
 
 
1403
1404	origpc = regs->cp0_epc;
1405	orig31 = regs->regs[31];
1406	pc16 = (unsigned short __user *)msk_isa16_mode(origpc);
1407	/*
1408	 * This load never faults.
1409	 */
1410	__get_user(mips16inst.full, pc16);
1411	oldinst = mips16inst;
1412
1413	/* skip EXTEND instruction */
1414	if (mips16inst.ri.opcode == MIPS16e_extend_op) {
 
1415		pc16++;
1416		__get_user(mips16inst.full, pc16);
1417	} else if (delay_slot(regs)) {
1418		/*  skip jump instructions */
1419		/*  JAL/JALX are 32 bits but have OPCODE in first short int */
1420		if (mips16inst.ri.opcode == MIPS16e_jal_op)
1421			pc16++;
1422		pc16++;
1423		if (get_user(mips16inst.full, pc16))
1424			goto sigbus;
1425	}
1426
1427	switch (mips16inst.ri.opcode) {
 
1428	case MIPS16e_i64_op:	/* I64 or RI64 instruction */
1429		switch (mips16inst.i64.func) {	/* I64/RI64 func field check */
1430		case MIPS16e_ldpc_func:
1431		case MIPS16e_ldsp_func:
1432			reg = reg16to32[mips16inst.ri64.ry];
1433			goto loadDW;
1434
1435		case MIPS16e_sdsp_func:
1436			reg = reg16to32[mips16inst.ri64.ry];
1437			goto writeDW;
1438
1439		case MIPS16e_sdrasp_func:
1440			reg = 29;	/* GPRSP */
1441			goto writeDW;
1442		}
1443
1444		goto sigbus;
1445
1446	case MIPS16e_swsp_op:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1447	case MIPS16e_lwpc_op:
 
 
 
1448	case MIPS16e_lwsp_op:
1449		reg = reg16to32[mips16inst.ri.rx];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1450		break;
1451
1452	case MIPS16e_i8_op:
1453		if (mips16inst.i8.func != MIPS16e_swrasp_func)
1454			goto sigbus;
1455		reg = 29;	/* GPRSP */
1456		break;
1457
1458	default:
1459		reg = reg16to32[mips16inst.rri.ry];
1460		break;
1461	}
1462
1463	switch (mips16inst.ri.opcode) {
1464
1465	case MIPS16e_lb_op:
1466	case MIPS16e_lbu_op:
1467	case MIPS16e_sb_op:
1468		goto sigbus;
1469
1470	case MIPS16e_lh_op:
1471		if (!access_ok(VERIFY_READ, addr, 2))
1472			goto sigbus;
1473
1474		LoadHW(addr, value, res);
1475		if (res)
1476			goto fault;
1477		MIPS16e_compute_return_epc(regs, &oldinst);
1478		regs->regs[reg] = value;
1479		break;
1480
1481	case MIPS16e_lhu_op:
1482		if (!access_ok(VERIFY_READ, addr, 2))
1483			goto sigbus;
1484
1485		LoadHWU(addr, value, res);
1486		if (res)
1487			goto fault;
1488		MIPS16e_compute_return_epc(regs, &oldinst);
1489		regs->regs[reg] = value;
1490		break;
1491
1492	case MIPS16e_lw_op:
1493	case MIPS16e_lwpc_op:
1494	case MIPS16e_lwsp_op:
1495		if (!access_ok(VERIFY_READ, addr, 4))
1496			goto sigbus;
1497
1498		LoadW(addr, value, res);
1499		if (res)
1500			goto fault;
1501		MIPS16e_compute_return_epc(regs, &oldinst);
1502		regs->regs[reg] = value;
1503		break;
1504
1505	case MIPS16e_lwu_op:
1506#ifdef CONFIG_64BIT
1507		/*
1508		 * A 32-bit kernel might be running on a 64-bit processor.  But
1509		 * if we're on a 32-bit processor and an i-cache incoherency
1510		 * or race makes us see a 64-bit instruction here the sdl/sdr
1511		 * would blow up, so for now we don't handle unaligned 64-bit
1512		 * instructions on 32-bit kernels.
1513		 */
1514		if (!access_ok(VERIFY_READ, addr, 4))
1515			goto sigbus;
1516
1517		LoadWU(addr, value, res);
1518		if (res)
1519			goto fault;
1520		MIPS16e_compute_return_epc(regs, &oldinst);
1521		regs->regs[reg] = value;
1522		break;
1523#endif /* CONFIG_64BIT */
1524
1525		/* Cannot handle 64-bit instructions in 32-bit kernel */
1526		goto sigill;
1527
1528	case MIPS16e_ld_op:
1529loadDW:
1530#ifdef CONFIG_64BIT
1531		/*
1532		 * A 32-bit kernel might be running on a 64-bit processor.  But
1533		 * if we're on a 32-bit processor and an i-cache incoherency
1534		 * or race makes us see a 64-bit instruction here the sdl/sdr
1535		 * would blow up, so for now we don't handle unaligned 64-bit
1536		 * instructions on 32-bit kernels.
1537		 */
1538		if (!access_ok(VERIFY_READ, addr, 8))
1539			goto sigbus;
1540
1541		LoadDW(addr, value, res);
1542		if (res)
1543			goto fault;
1544		MIPS16e_compute_return_epc(regs, &oldinst);
1545		regs->regs[reg] = value;
1546		break;
1547#endif /* CONFIG_64BIT */
1548
1549		/* Cannot handle 64-bit instructions in 32-bit kernel */
1550		goto sigill;
1551
1552	case MIPS16e_sh_op:
1553		if (!access_ok(VERIFY_WRITE, addr, 2))
1554			goto sigbus;
1555
1556		MIPS16e_compute_return_epc(regs, &oldinst);
1557		value = regs->regs[reg];
1558		StoreHW(addr, value, res);
1559		if (res)
1560			goto fault;
1561		break;
1562
1563	case MIPS16e_sw_op:
1564	case MIPS16e_swsp_op:
1565	case MIPS16e_i8_op:	/* actually - MIPS16e_swrasp_func */
1566		if (!access_ok(VERIFY_WRITE, addr, 4))
1567			goto sigbus;
1568
1569		MIPS16e_compute_return_epc(regs, &oldinst);
1570		value = regs->regs[reg];
1571		StoreW(addr, value, res);
1572		if (res)
1573			goto fault;
1574		break;
1575
1576	case MIPS16e_sd_op:
1577writeDW:
1578#ifdef CONFIG_64BIT
1579		/*
1580		 * A 32-bit kernel might be running on a 64-bit processor.  But
1581		 * if we're on a 32-bit processor and an i-cache incoherency
1582		 * or race makes us see a 64-bit instruction here the sdl/sdr
1583		 * would blow up, so for now we don't handle unaligned 64-bit
1584		 * instructions on 32-bit kernels.
1585		 */
1586		if (!access_ok(VERIFY_WRITE, addr, 8))
1587			goto sigbus;
1588
1589		MIPS16e_compute_return_epc(regs, &oldinst);
1590		value = regs->regs[reg];
1591		StoreDW(addr, value, res);
1592		if (res)
1593			goto fault;
1594		break;
1595#endif /* CONFIG_64BIT */
1596
1597		/* Cannot handle 64-bit instructions in 32-bit kernel */
1598		goto sigill;
1599
1600	default:
1601		/*
1602		 * Pheeee...  We encountered an yet unknown instruction or
1603		 * cache coherence problem.  Die sucker, die ...
1604		 */
1605		goto sigill;
1606	}
1607
1608#ifdef CONFIG_DEBUG_FS
1609	unaligned_instructions++;
1610#endif
1611
1612	return;
1613
1614fault:
1615	/* roll back jump/branch */
1616	regs->cp0_epc = origpc;
1617	regs->regs[31] = orig31;
1618	/* Did we have an exception handler installed? */
1619	if (fixup_exception(regs))
1620		return;
1621
1622	die_if_kernel("Unhandled kernel unaligned access", regs);
1623	force_sig(SIGSEGV, current);
1624
1625	return;
1626
1627sigbus:
1628	die_if_kernel("Unhandled kernel unaligned access", regs);
1629	force_sig(SIGBUS, current);
1630
1631	return;
1632
1633sigill:
1634	die_if_kernel
1635	    ("Unhandled kernel unaligned access or invalid instruction", regs);
1636	force_sig(SIGILL, current);
1637}
1638
1639asmlinkage void do_ade(struct pt_regs *regs)
1640{
1641	enum ctx_state prev_state;
1642	unsigned int __user *pc;
1643	mm_segment_t seg;
1644
1645	prev_state = exception_enter();
1646	perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS,
1647			1, regs, regs->cp0_badvaddr);
1648	/*
1649	 * Did we catch a fault trying to load an instruction?
1650	 */
1651	if (regs->cp0_badvaddr == regs->cp0_epc)
1652		goto sigbus;
1653
1654	if (user_mode(regs) && !test_thread_flag(TIF_FIXADE))
1655		goto sigbus;
1656	if (unaligned_action == UNALIGNED_ACTION_SIGNAL)
1657		goto sigbus;
1658
1659	/*
1660	 * Do branch emulation only if we didn't forward the exception.
1661	 * This is all so but ugly ...
1662	 */
1663
1664	/*
1665	 * Are we running in microMIPS mode?
1666	 */
1667	if (get_isa16_mode(regs->cp0_epc)) {
1668		/*
1669		 * Did we catch a fault trying to load an instruction in
1670		 * 16-bit mode?
1671		 */
1672		if (regs->cp0_badvaddr == msk_isa16_mode(regs->cp0_epc))
1673			goto sigbus;
1674		if (unaligned_action == UNALIGNED_ACTION_SHOW)
1675			show_registers(regs);
1676
1677		if (cpu_has_mmips) {
1678			seg = get_fs();
1679			if (!user_mode(regs))
1680				set_fs(KERNEL_DS);
1681			emulate_load_store_microMIPS(regs,
1682				(void __user *)regs->cp0_badvaddr);
1683			set_fs(seg);
1684
1685			return;
1686		}
1687
1688		if (cpu_has_mips16) {
1689			seg = get_fs();
1690			if (!user_mode(regs))
1691				set_fs(KERNEL_DS);
1692			emulate_load_store_MIPS16e(regs,
1693				(void __user *)regs->cp0_badvaddr);
1694			set_fs(seg);
1695
1696			return;
1697	}
1698
1699		goto sigbus;
1700	}
1701
1702	if (unaligned_action == UNALIGNED_ACTION_SHOW)
1703		show_registers(regs);
1704	pc = (unsigned int __user *)exception_epc(regs);
1705
1706	seg = get_fs();
1707	if (!user_mode(regs))
1708		set_fs(KERNEL_DS);
1709	emulate_load_store_insn(regs, (void __user *)regs->cp0_badvaddr, pc);
1710	set_fs(seg);
1711
1712	return;
1713
1714sigbus:
1715	die_if_kernel("Kernel unaligned instruction access", regs);
1716	force_sig(SIGBUS, current);
1717
1718	/*
1719	 * XXX On return from the signal handler we should advance the epc
1720	 */
1721	exception_exit(prev_state);
1722}
1723
1724#ifdef CONFIG_DEBUG_FS
1725extern struct dentry *mips_debugfs_dir;
1726static int __init debugfs_unaligned(void)
1727{
1728	struct dentry *d;
1729
1730	if (!mips_debugfs_dir)
1731		return -ENODEV;
1732	d = debugfs_create_u32("unaligned_instructions", S_IRUGO,
1733			       mips_debugfs_dir, &unaligned_instructions);
1734	if (!d)
1735		return -ENOMEM;
1736	d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR,
1737			       mips_debugfs_dir, &unaligned_action);
1738	if (!d)
1739		return -ENOMEM;
1740	return 0;
1741}
1742__initcall(debugfs_unaligned);
1743#endif