2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
14 * A code-rewriter that handles unaligned exception.
17 #include <linux/smp.h>
18 #include <linux/ptrace.h>
19 #include <linux/slab.h>
20 #include <linux/sched/debug.h>
21 #include <linux/sched/task.h>
22 #include <linux/thread_info.h>
23 #include <linux/uaccess.h>
24 #include <linux/mman.h>
25 #include <linux/types.h>
26 #include <linux/err.h>
27 #include <linux/extable.h>
28 #include <linux/compat.h>
29 #include <linux/prctl.h>
30 #include <asm/cacheflush.h>
31 #include <asm/traps.h>
32 #include <linux/uaccess.h>
33 #include <asm/unaligned.h>
35 #include <arch/spr_def.h>
36 #include <arch/opcode.h>
40 * This file handles unaligned exception for tile-Gx. The tilepro's unaligned
41 * exception is supported out of single_step.c
46 static int __init
setup_unaligned_printk(char *str
)
49 if (kstrtol(str
, 0, &val
) != 0)
51 unaligned_printk
= val
;
52 pr_info("Printk for each unaligned data accesses is %s\n",
53 unaligned_printk
? "enabled" : "disabled");
56 __setup("unaligned_printk=", setup_unaligned_printk
);
58 unsigned int unaligned_fixup_count
;
63 * Unalign data jit fixup code fragement. Reserved space is 128 bytes.
64 * The 1st 64-bit word saves fault PC address, 2nd word is the fault
65 * instruction bundle followed by 14 JIT bundles.
68 struct unaligned_jit_fragment
{
70 tilegx_bundle_bits bundle
;
71 tilegx_bundle_bits insn
[14];
75 * Check if a nop or fnop at bundle's pipeline X0.
78 static bool is_bundle_x0_nop(tilegx_bundle_bits bundle
)
80 return (((get_UnaryOpcodeExtension_X0(bundle
) ==
81 NOP_UNARY_OPCODE_X0
) &&
82 (get_RRROpcodeExtension_X0(bundle
) ==
83 UNARY_RRR_0_OPCODE_X0
) &&
84 (get_Opcode_X0(bundle
) ==
86 ((get_UnaryOpcodeExtension_X0(bundle
) ==
87 FNOP_UNARY_OPCODE_X0
) &&
88 (get_RRROpcodeExtension_X0(bundle
) ==
89 UNARY_RRR_0_OPCODE_X0
) &&
90 (get_Opcode_X0(bundle
) ==
95 * Check if nop or fnop at bundle's pipeline X1.
98 static bool is_bundle_x1_nop(tilegx_bundle_bits bundle
)
100 return (((get_UnaryOpcodeExtension_X1(bundle
) ==
101 NOP_UNARY_OPCODE_X1
) &&
102 (get_RRROpcodeExtension_X1(bundle
) ==
103 UNARY_RRR_0_OPCODE_X1
) &&
104 (get_Opcode_X1(bundle
) ==
106 ((get_UnaryOpcodeExtension_X1(bundle
) ==
107 FNOP_UNARY_OPCODE_X1
) &&
108 (get_RRROpcodeExtension_X1(bundle
) ==
109 UNARY_RRR_0_OPCODE_X1
) &&
110 (get_Opcode_X1(bundle
) ==
115 * Check if nop or fnop at bundle's Y0 pipeline.
118 static bool is_bundle_y0_nop(tilegx_bundle_bits bundle
)
120 return (((get_UnaryOpcodeExtension_Y0(bundle
) ==
121 NOP_UNARY_OPCODE_Y0
) &&
122 (get_RRROpcodeExtension_Y0(bundle
) ==
123 UNARY_RRR_1_OPCODE_Y0
) &&
124 (get_Opcode_Y0(bundle
) ==
126 ((get_UnaryOpcodeExtension_Y0(bundle
) ==
127 FNOP_UNARY_OPCODE_Y0
) &&
128 (get_RRROpcodeExtension_Y0(bundle
) ==
129 UNARY_RRR_1_OPCODE_Y0
) &&
130 (get_Opcode_Y0(bundle
) ==
135 * Check if nop or fnop at bundle's pipeline Y1.
138 static bool is_bundle_y1_nop(tilegx_bundle_bits bundle
)
140 return (((get_UnaryOpcodeExtension_Y1(bundle
) ==
141 NOP_UNARY_OPCODE_Y1
) &&
142 (get_RRROpcodeExtension_Y1(bundle
) ==
143 UNARY_RRR_1_OPCODE_Y1
) &&
144 (get_Opcode_Y1(bundle
) ==
146 ((get_UnaryOpcodeExtension_Y1(bundle
) ==
147 FNOP_UNARY_OPCODE_Y1
) &&
148 (get_RRROpcodeExtension_Y1(bundle
) ==
149 UNARY_RRR_1_OPCODE_Y1
) &&
150 (get_Opcode_Y1(bundle
) ==
155 * Test if a bundle's y0 and y1 pipelines are both nop or fnop.
158 static bool is_y0_y1_nop(tilegx_bundle_bits bundle
)
160 return is_bundle_y0_nop(bundle
) && is_bundle_y1_nop(bundle
);
164 * Test if a bundle's x0 and x1 pipelines are both nop or fnop.
167 static bool is_x0_x1_nop(tilegx_bundle_bits bundle
)
169 return is_bundle_x0_nop(bundle
) && is_bundle_x1_nop(bundle
);
173 * Find the destination, source registers of fault unalign access instruction
174 * at X1 or Y2. Also, allocate up to 3 scratch registers clob1, clob2 and
175 * clob3, which are guaranteed different from any register used in the fault
176 * bundle. r_alias is used to return if the other instructions other than the
177 * unalign load/store shares same register with ra, rb and rd.
180 static void find_regs(tilegx_bundle_bits bundle
, uint64_t *rd
, uint64_t *ra
,
181 uint64_t *rb
, uint64_t *clob1
, uint64_t *clob2
,
182 uint64_t *clob3
, bool *r_alias
)
186 uint64_t reg_map
= 0, alias_reg_map
= 0, map
;
190 * Parse fault bundle, find potential used registers and mark
191 * corresponding bits in reg_map and alias_map. These 2 bit maps
192 * are used to find the scratch registers and determine if there
195 if (bundle
& TILEGX_BUNDLE_MODE_MASK
) { /* Y Mode Bundle. */
197 reg
= get_SrcA_Y2(bundle
);
198 reg_map
|= 1ULL << reg
;
200 reg
= get_SrcBDest_Y2(bundle
);
201 reg_map
|= 1ULL << reg
;
206 alias_reg_map
= (1ULL << *rd
) | (1ULL << *ra
);
210 alias_reg_map
= (1ULL << *ra
) | (1ULL << *rb
);
213 if (!is_bundle_y1_nop(bundle
)) {
214 reg
= get_SrcA_Y1(bundle
);
215 reg_map
|= (1ULL << reg
);
218 reg
= get_SrcB_Y1(bundle
);
219 reg_map
|= (1ULL << reg
);
220 map
|= (1ULL << reg
);
222 reg
= get_Dest_Y1(bundle
);
223 reg_map
|= (1ULL << reg
);
224 map
|= (1ULL << reg
);
226 if (map
& alias_reg_map
)
230 if (!is_bundle_y0_nop(bundle
)) {
231 reg
= get_SrcA_Y0(bundle
);
232 reg_map
|= (1ULL << reg
);
235 reg
= get_SrcB_Y0(bundle
);
236 reg_map
|= (1ULL << reg
);
237 map
|= (1ULL << reg
);
239 reg
= get_Dest_Y0(bundle
);
240 reg_map
|= (1ULL << reg
);
241 map
|= (1ULL << reg
);
243 if (map
& alias_reg_map
)
246 } else { /* X Mode Bundle. */
248 reg
= get_SrcA_X1(bundle
);
249 reg_map
|= (1ULL << reg
);
253 reg
= get_Dest_X1(bundle
);
254 reg_map
|= (1ULL << reg
);
256 alias_reg_map
= (1ULL << *rd
) | (1ULL << *ra
);
259 reg
= get_SrcB_X1(bundle
);
260 reg_map
|= (1ULL << reg
);
262 alias_reg_map
= (1ULL << *ra
) | (1ULL << *rb
);
265 if (!is_bundle_x0_nop(bundle
)) {
266 reg
= get_SrcA_X0(bundle
);
267 reg_map
|= (1ULL << reg
);
270 reg
= get_SrcB_X0(bundle
);
271 reg_map
|= (1ULL << reg
);
272 map
|= (1ULL << reg
);
274 reg
= get_Dest_X0(bundle
);
275 reg_map
|= (1ULL << reg
);
276 map
|= (1ULL << reg
);
278 if (map
& alias_reg_map
)
284 * "alias" indicates if the unalign access registers have collision
285 * with others in the same bundle. We jsut simply test all register
286 * operands case (RRR), ignored the case with immidate. If a bundle
287 * has no register alias, we may do fixup in a simple or fast manner.
288 * So if an immidata field happens to hit with a register, we may end
289 * up fall back to the generic handling.
294 /* Flip bits on reg_map. */
297 /* Scan reg_map lower 54(TREG_SP) bits to find 3 set bits. */
298 for (i
= 0; i
< TREG_SP
; i
++) {
299 if (reg_map
& (0x1ULL
<< i
)) {
302 } else if (*clob2
== -1) {
304 } else if (*clob3
== -1) {
313 * Sanity check for register ra, rb, rd, clob1/2/3. Return true if any of them
317 static bool check_regs(uint64_t rd
, uint64_t ra
, uint64_t rb
,
318 uint64_t clob1
, uint64_t clob2
, uint64_t clob3
)
320 bool unexpected
= false;
321 if ((ra
>= 56) && (ra
!= TREG_ZERO
))
324 if ((clob1
>= 56) || (clob2
>= 56) || (clob3
>= 56))
328 if ((rd
>= 56) && (rd
!= TREG_ZERO
))
331 if ((rb
>= 56) && (rb
!= TREG_ZERO
))
338 #define GX_INSN_X0_MASK ((1ULL << 31) - 1)
339 #define GX_INSN_X1_MASK (((1ULL << 31) - 1) << 31)
340 #define GX_INSN_Y0_MASK ((0xFULL << 27) | (0xFFFFFULL))
341 #define GX_INSN_Y1_MASK (GX_INSN_Y0_MASK << 31)
342 #define GX_INSN_Y2_MASK ((0x7FULL << 51) | (0x7FULL << 20))
344 #ifdef __LITTLE_ENDIAN
345 #define GX_INSN_BSWAP(_bundle_) (_bundle_)
347 #define GX_INSN_BSWAP(_bundle_) swab64(_bundle_)
348 #endif /* __LITTLE_ENDIAN */
351 * __JIT_CODE(.) creates template bundles in .rodata.unalign_data section.
352 * The corresponding static function jix_x#_###(.) generates partial or
353 * whole bundle based on the template and given arguments.
356 #define __JIT_CODE(_X_) \
357 asm (".pushsection .rodata.unalign_data, \"a\"\n" \
361 __JIT_CODE("__unalign_jit_x1_mtspr: {mtspr 0, r0}");
362 static tilegx_bundle_bits
jit_x1_mtspr(int spr
, int reg
)
364 extern tilegx_bundle_bits __unalign_jit_x1_mtspr
;
365 return (GX_INSN_BSWAP(__unalign_jit_x1_mtspr
) & GX_INSN_X1_MASK
) |
366 create_MT_Imm14_X1(spr
) | create_SrcA_X1(reg
);
369 __JIT_CODE("__unalign_jit_x1_mfspr: {mfspr r0, 0}");
370 static tilegx_bundle_bits
jit_x1_mfspr(int reg
, int spr
)
372 extern tilegx_bundle_bits __unalign_jit_x1_mfspr
;
373 return (GX_INSN_BSWAP(__unalign_jit_x1_mfspr
) & GX_INSN_X1_MASK
) |
374 create_MF_Imm14_X1(spr
) | create_Dest_X1(reg
);
377 __JIT_CODE("__unalign_jit_x0_addi: {addi r0, r0, 0; iret}");
378 static tilegx_bundle_bits
jit_x0_addi(int rd
, int ra
, int imm8
)
380 extern tilegx_bundle_bits __unalign_jit_x0_addi
;
381 return (GX_INSN_BSWAP(__unalign_jit_x0_addi
) & GX_INSN_X0_MASK
) |
382 create_Dest_X0(rd
) | create_SrcA_X0(ra
) |
383 create_Imm8_X0(imm8
);
386 __JIT_CODE("__unalign_jit_x1_ldna: {ldna r0, r0}");
387 static tilegx_bundle_bits
jit_x1_ldna(int rd
, int ra
)
389 extern tilegx_bundle_bits __unalign_jit_x1_ldna
;
390 return (GX_INSN_BSWAP(__unalign_jit_x1_ldna
) & GX_INSN_X1_MASK
) |
391 create_Dest_X1(rd
) | create_SrcA_X1(ra
);
394 __JIT_CODE("__unalign_jit_x0_dblalign: {dblalign r0, r0 ,r0}");
395 static tilegx_bundle_bits
jit_x0_dblalign(int rd
, int ra
, int rb
)
397 extern tilegx_bundle_bits __unalign_jit_x0_dblalign
;
398 return (GX_INSN_BSWAP(__unalign_jit_x0_dblalign
) & GX_INSN_X0_MASK
) |
399 create_Dest_X0(rd
) | create_SrcA_X0(ra
) |
403 __JIT_CODE("__unalign_jit_x1_iret: {iret}");
404 static tilegx_bundle_bits
jit_x1_iret(void)
406 extern tilegx_bundle_bits __unalign_jit_x1_iret
;
407 return GX_INSN_BSWAP(__unalign_jit_x1_iret
) & GX_INSN_X1_MASK
;
410 __JIT_CODE("__unalign_jit_x01_fnop: {fnop;fnop}");
411 static tilegx_bundle_bits
jit_x0_fnop(void)
413 extern tilegx_bundle_bits __unalign_jit_x01_fnop
;
414 return GX_INSN_BSWAP(__unalign_jit_x01_fnop
) & GX_INSN_X0_MASK
;
417 static tilegx_bundle_bits
jit_x1_fnop(void)
419 extern tilegx_bundle_bits __unalign_jit_x01_fnop
;
420 return GX_INSN_BSWAP(__unalign_jit_x01_fnop
) & GX_INSN_X1_MASK
;
423 __JIT_CODE("__unalign_jit_y2_dummy: {fnop; fnop; ld zero, sp}");
424 static tilegx_bundle_bits
jit_y2_dummy(void)
426 extern tilegx_bundle_bits __unalign_jit_y2_dummy
;
427 return GX_INSN_BSWAP(__unalign_jit_y2_dummy
) & GX_INSN_Y2_MASK
;
430 static tilegx_bundle_bits
jit_y1_fnop(void)
432 extern tilegx_bundle_bits __unalign_jit_y2_dummy
;
433 return GX_INSN_BSWAP(__unalign_jit_y2_dummy
) & GX_INSN_Y1_MASK
;
436 __JIT_CODE("__unalign_jit_x1_st1_add: {st1_add r1, r0, 0}");
437 static tilegx_bundle_bits
jit_x1_st1_add(int ra
, int rb
, int imm8
)
439 extern tilegx_bundle_bits __unalign_jit_x1_st1_add
;
440 return (GX_INSN_BSWAP(__unalign_jit_x1_st1_add
) &
441 (~create_SrcA_X1(-1)) &
442 GX_INSN_X1_MASK
) | create_SrcA_X1(ra
) |
443 create_SrcB_X1(rb
) | create_Dest_Imm8_X1(imm8
);
446 __JIT_CODE("__unalign_jit_x1_st: {crc32_8 r1, r0, r0; st r0, r0}");
447 static tilegx_bundle_bits
jit_x1_st(int ra
, int rb
)
449 extern tilegx_bundle_bits __unalign_jit_x1_st
;
450 return (GX_INSN_BSWAP(__unalign_jit_x1_st
) & GX_INSN_X1_MASK
) |
451 create_SrcA_X1(ra
) | create_SrcB_X1(rb
);
454 __JIT_CODE("__unalign_jit_x1_st_add: {st_add r1, r0, 0}");
455 static tilegx_bundle_bits
jit_x1_st_add(int ra
, int rb
, int imm8
)
457 extern tilegx_bundle_bits __unalign_jit_x1_st_add
;
458 return (GX_INSN_BSWAP(__unalign_jit_x1_st_add
) &
459 (~create_SrcA_X1(-1)) &
460 GX_INSN_X1_MASK
) | create_SrcA_X1(ra
) |
461 create_SrcB_X1(rb
) | create_Dest_Imm8_X1(imm8
);
464 __JIT_CODE("__unalign_jit_x1_ld: {crc32_8 r1, r0, r0; ld r0, r0}");
465 static tilegx_bundle_bits
jit_x1_ld(int rd
, int ra
)
467 extern tilegx_bundle_bits __unalign_jit_x1_ld
;
468 return (GX_INSN_BSWAP(__unalign_jit_x1_ld
) & GX_INSN_X1_MASK
) |
469 create_Dest_X1(rd
) | create_SrcA_X1(ra
);
472 __JIT_CODE("__unalign_jit_x1_ld_add: {ld_add r1, r0, 0}");
473 static tilegx_bundle_bits
jit_x1_ld_add(int rd
, int ra
, int imm8
)
475 extern tilegx_bundle_bits __unalign_jit_x1_ld_add
;
476 return (GX_INSN_BSWAP(__unalign_jit_x1_ld_add
) &
477 (~create_Dest_X1(-1)) &
478 GX_INSN_X1_MASK
) | create_Dest_X1(rd
) |
479 create_SrcA_X1(ra
) | create_Imm8_X1(imm8
);
482 __JIT_CODE("__unalign_jit_x0_bfexts: {bfexts r0, r0, 0, 0}");
483 static tilegx_bundle_bits
jit_x0_bfexts(int rd
, int ra
, int bfs
, int bfe
)
485 extern tilegx_bundle_bits __unalign_jit_x0_bfexts
;
486 return (GX_INSN_BSWAP(__unalign_jit_x0_bfexts
) &
488 create_Dest_X0(rd
) | create_SrcA_X0(ra
) |
489 create_BFStart_X0(bfs
) | create_BFEnd_X0(bfe
);
492 __JIT_CODE("__unalign_jit_x0_bfextu: {bfextu r0, r0, 0, 0}");
493 static tilegx_bundle_bits
jit_x0_bfextu(int rd
, int ra
, int bfs
, int bfe
)
495 extern tilegx_bundle_bits __unalign_jit_x0_bfextu
;
496 return (GX_INSN_BSWAP(__unalign_jit_x0_bfextu
) &
498 create_Dest_X0(rd
) | create_SrcA_X0(ra
) |
499 create_BFStart_X0(bfs
) | create_BFEnd_X0(bfe
);
502 __JIT_CODE("__unalign_jit_x1_addi: {bfextu r1, r1, 0, 0; addi r0, r0, 0}");
503 static tilegx_bundle_bits
jit_x1_addi(int rd
, int ra
, int imm8
)
505 extern tilegx_bundle_bits __unalign_jit_x1_addi
;
506 return (GX_INSN_BSWAP(__unalign_jit_x1_addi
) & GX_INSN_X1_MASK
) |
507 create_Dest_X1(rd
) | create_SrcA_X1(ra
) |
508 create_Imm8_X1(imm8
);
511 __JIT_CODE("__unalign_jit_x0_shrui: {shrui r0, r0, 0; iret}");
512 static tilegx_bundle_bits
jit_x0_shrui(int rd
, int ra
, int imm6
)
514 extern tilegx_bundle_bits __unalign_jit_x0_shrui
;
515 return (GX_INSN_BSWAP(__unalign_jit_x0_shrui
) &
517 create_Dest_X0(rd
) | create_SrcA_X0(ra
) |
518 create_ShAmt_X0(imm6
);
521 __JIT_CODE("__unalign_jit_x0_rotli: {rotli r0, r0, 0; iret}");
522 static tilegx_bundle_bits
jit_x0_rotli(int rd
, int ra
, int imm6
)
524 extern tilegx_bundle_bits __unalign_jit_x0_rotli
;
525 return (GX_INSN_BSWAP(__unalign_jit_x0_rotli
) &
527 create_Dest_X0(rd
) | create_SrcA_X0(ra
) |
528 create_ShAmt_X0(imm6
);
531 __JIT_CODE("__unalign_jit_x1_bnezt: {bnezt r0, __unalign_jit_x1_bnezt}");
532 static tilegx_bundle_bits
jit_x1_bnezt(int ra
, int broff
)
534 extern tilegx_bundle_bits __unalign_jit_x1_bnezt
;
535 return (GX_INSN_BSWAP(__unalign_jit_x1_bnezt
) &
537 create_SrcA_X1(ra
) | create_BrOff_X1(broff
);
543 * This function generates unalign fixup JIT.
545 * We first find unalign load/store instruction's destination, source
546 * registers: ra, rb and rd. and 3 scratch registers by calling
547 * find_regs(...). 3 scratch clobbers should not alias with any register
548 * used in the fault bundle. Then analyze the fault bundle to determine
549 * if it's a load or store, operand width, branch or address increment etc.
550 * At last generated JIT is copied into JIT code area in user space.
554 void jit_bundle_gen(struct pt_regs
*regs
, tilegx_bundle_bits bundle
,
557 struct thread_info
*info
= current_thread_info();
558 struct unaligned_jit_fragment frag
;
559 struct unaligned_jit_fragment
*jit_code_area
;
560 tilegx_bundle_bits bundle_2
= 0;
561 /* If bundle_2_enable = false, bundle_2 is fnop/nop operation. */
562 bool bundle_2_enable
= true;
563 uint64_t ra
= -1, rb
= -1, rd
= -1, clob1
= -1, clob2
= -1, clob3
= -1;
565 * Indicate if the unalign access
566 * instruction's registers hit with
567 * others in the same bundle.
570 bool load_n_store
= true;
571 bool load_store_signed
= false;
572 unsigned int load_store_size
= 8;
573 bool y1_br
= false; /* True, for a branch in same bundle at Y1.*/
575 /* True for link operation. i.e. jalr or lnk at Y1 */
578 bool x1_add
= false;/* True, for load/store ADD instruction at X1*/
580 bool unexpected
= false;
584 (struct unaligned_jit_fragment
*)(info
->unalign_jit_base
);
586 memset((void *)&frag
, 0, sizeof(frag
));
588 /* 0: X mode, Otherwise: Y mode. */
589 if (bundle
& TILEGX_BUNDLE_MODE_MASK
) {
590 unsigned int mod
, opcode
;
592 if (get_Opcode_Y1(bundle
) == RRR_1_OPCODE_Y1
&&
593 get_RRROpcodeExtension_Y1(bundle
) ==
594 UNARY_RRR_1_OPCODE_Y1
) {
596 opcode
= get_UnaryOpcodeExtension_Y1(bundle
);
599 * Test "jalr", "jalrp", "jr", "jrp" instruction at Y1
603 case JALR_UNARY_OPCODE_Y1
:
604 case JALRP_UNARY_OPCODE_Y1
:
606 y1_lr_reg
= 55; /* Link register. */
608 case JR_UNARY_OPCODE_Y1
:
609 case JRP_UNARY_OPCODE_Y1
:
611 y1_br_reg
= get_SrcA_Y1(bundle
);
613 case LNK_UNARY_OPCODE_Y1
:
614 /* "lnk" at Y1 pipeline. */
616 y1_lr_reg
= get_Dest_Y1(bundle
);
621 opcode
= get_Opcode_Y2(bundle
);
622 mod
= get_Mode(bundle
);
625 * bundle_2 is bundle after making Y2 as a dummy operation
628 bundle_2
= (bundle
& (~GX_INSN_Y2_MASK
)) | jit_y2_dummy();
630 /* Make Y1 as fnop if Y1 is a branch or lnk operation. */
631 if (y1_br
|| y1_lr
) {
632 bundle_2
&= ~(GX_INSN_Y1_MASK
);
633 bundle_2
|= jit_y1_fnop();
636 if (is_y0_y1_nop(bundle_2
))
637 bundle_2_enable
= false;
639 if (mod
== MODE_OPCODE_YC2
) {
641 load_n_store
= false;
642 load_store_size
= 1 << opcode
;
643 load_store_signed
= false;
644 find_regs(bundle
, 0, &ra
, &rb
, &clob1
, &clob2
,
646 if (load_store_size
> 8)
651 if (mod
== MODE_OPCODE_YB2
) {
654 load_store_signed
= false;
658 load_store_signed
= true;
662 load_store_signed
= false;
668 } else if (mod
== MODE_OPCODE_YA2
) {
669 if (opcode
== LD2S_OPCODE_Y2
) {
670 load_store_signed
= true;
672 } else if (opcode
== LD2U_OPCODE_Y2
) {
673 load_store_signed
= false;
679 find_regs(bundle
, &rd
, &ra
, &rb
, &clob1
, &clob2
,
685 /* bundle_2 is bundle after making X1 as "fnop". */
686 bundle_2
= (bundle
& (~GX_INSN_X1_MASK
)) | jit_x1_fnop();
688 if (is_x0_x1_nop(bundle_2
))
689 bundle_2_enable
= false;
691 if (get_Opcode_X1(bundle
) == RRR_0_OPCODE_X1
) {
692 opcode
= get_UnaryOpcodeExtension_X1(bundle
);
694 if (get_RRROpcodeExtension_X1(bundle
) ==
695 UNARY_RRR_0_OPCODE_X1
) {
697 find_regs(bundle
, &rd
, &ra
, &rb
, &clob1
,
698 &clob2
, &clob3
, &alias
);
701 case LD_UNARY_OPCODE_X1
:
702 load_store_signed
= false;
705 case LD4S_UNARY_OPCODE_X1
:
706 load_store_signed
= true;
708 case LD4U_UNARY_OPCODE_X1
:
712 case LD2S_UNARY_OPCODE_X1
:
713 load_store_signed
= true;
715 case LD2U_UNARY_OPCODE_X1
:
722 load_n_store
= false;
723 load_store_signed
= false;
724 find_regs(bundle
, 0, &ra
, &rb
,
725 &clob1
, &clob2
, &clob3
,
728 opcode
= get_RRROpcodeExtension_X1(bundle
);
730 case ST_RRR_0_OPCODE_X1
:
733 case ST4_RRR_0_OPCODE_X1
:
736 case ST2_RRR_0_OPCODE_X1
:
743 } else if (get_Opcode_X1(bundle
) == IMM8_OPCODE_X1
) {
745 opcode
= get_Imm8OpcodeExtension_X1(bundle
);
747 case LD_ADD_IMM8_OPCODE_X1
:
751 case LD4S_ADD_IMM8_OPCODE_X1
:
752 load_store_signed
= true;
754 case LD4U_ADD_IMM8_OPCODE_X1
:
758 case LD2S_ADD_IMM8_OPCODE_X1
:
759 load_store_signed
= true;
761 case LD2U_ADD_IMM8_OPCODE_X1
:
765 case ST_ADD_IMM8_OPCODE_X1
:
766 load_n_store
= false;
769 case ST4_ADD_IMM8_OPCODE_X1
:
770 load_n_store
= false;
773 case ST2_ADD_IMM8_OPCODE_X1
:
774 load_n_store
= false;
784 x1_add_imm8
= get_Imm8_X1(bundle
);
786 x1_add_imm8
= get_Dest_Imm8_X1(bundle
);
789 find_regs(bundle
, load_n_store
? (&rd
) : NULL
,
790 &ra
, &rb
, &clob1
, &clob2
, &clob3
, &alias
);
796 * Some sanity check for register numbers extracted from fault bundle.
798 if (check_regs(rd
, ra
, rb
, clob1
, clob2
, clob3
) == true)
801 /* Give warning if register ra has an aligned address. */
803 WARN_ON(!((load_store_size
- 1) & (regs
->regs
[ra
])));
807 * Fault came from kernel space, here we only need take care of
808 * unaligned "get_user/put_user" macros defined in "uaccess.h".
809 * Basically, we will handle bundle like this:
810 * {ld/2u/4s rd, ra; movei rx, 0} or {st/2/4 ra, rb; movei rx, 0}
811 * (Refer to file "arch/tile/include/asm/uaccess.h" for details).
812 * For either load or store, byte-wise operation is performed by calling
813 * get_user() or put_user(). If the macro returns non-zero value,
814 * set the value to rx, otherwise set zero to rx. Finally make pc point
815 * to next bundle and return.
818 if (EX1_PL(regs
->ex1
) != USER_PL
) {
820 unsigned long rx
= 0;
821 unsigned long x
= 0, ret
= 0;
823 if (y1_br
|| y1_lr
|| x1_add
||
824 (load_store_signed
!=
825 (load_n_store
&& load_store_size
== 4))) {
826 /* No branch, link, wrong sign-ext or load/store add. */
828 } else if (!unexpected
) {
829 if (bundle
& TILEGX_BUNDLE_MODE_MASK
) {
831 * Fault bundle is Y mode.
832 * Check if the Y1 and Y0 is the form of
833 * { movei rx, 0; nop/fnop }, if yes,
837 if ((get_Opcode_Y1(bundle
) == ADDI_OPCODE_Y1
)
838 && (get_SrcA_Y1(bundle
) == TREG_ZERO
) &&
839 (get_Imm8_Y1(bundle
) == 0) &&
840 is_bundle_y0_nop(bundle
)) {
841 rx
= get_Dest_Y1(bundle
);
842 } else if ((get_Opcode_Y0(bundle
) ==
844 (get_SrcA_Y0(bundle
) == TREG_ZERO
) &&
845 (get_Imm8_Y0(bundle
) == 0) &&
846 is_bundle_y1_nop(bundle
)) {
847 rx
= get_Dest_Y0(bundle
);
853 * Fault bundle is X mode.
854 * Check if the X0 is 'movei rx, 0',
855 * if yes, find the rx.
858 if ((get_Opcode_X0(bundle
) == IMM8_OPCODE_X0
)
859 && (get_Imm8OpcodeExtension_X0(bundle
) ==
860 ADDI_IMM8_OPCODE_X0
) &&
861 (get_SrcA_X0(bundle
) == TREG_ZERO
) &&
862 (get_Imm8_X0(bundle
) == 0)) {
863 rx
= get_Dest_X0(bundle
);
869 /* rx should be less than 56. */
870 if (!unexpected
&& (rx
>= 56))
874 if (!search_exception_tables(regs
->pc
)) {
875 /* No fixup in the exception tables for the pc. */
880 /* Unexpected unalign kernel fault. */
881 struct task_struct
*tsk
= validate_current();
887 if (unlikely(tsk
->pid
< 2)) {
888 panic("Kernel unalign fault running %s!",
889 tsk
->pid
? "init" : "the idle task");
896 do_group_exit(SIGKILL
);
899 unsigned long i
, b
= 0;
901 (unsigned char *)regs
->regs
[ra
];
903 /* handle get_user(x, ptr) */
904 for (i
= 0; i
< load_store_size
; i
++) {
905 ret
= get_user(b
, ptr
++);
907 /* Success! update x. */
908 #ifdef __LITTLE_ENDIAN
913 #endif /* __LITTLE_ENDIAN */
920 /* Sign-extend 4-byte loads. */
921 if (load_store_size
== 4)
924 /* Set register rd. */
927 /* Set register rx. */
928 regs
->regs
[rx
] = ret
;
934 /* Handle put_user(x, ptr) */
936 #ifdef __LITTLE_ENDIAN
940 * Swap x in order to store x from low
941 * to high memory same as the
942 * little-endian case.
944 switch (load_store_size
) {
955 #endif /* __LITTLE_ENDIAN */
956 for (i
= 0; i
< load_store_size
; i
++) {
957 ret
= put_user(b
, ptr
++);
960 /* Success! shift 1 byte. */
963 /* Set register rx. */
964 regs
->regs
[rx
] = ret
;
971 unaligned_fixup_count
++;
973 if (unaligned_printk
) {
974 pr_info("%s/%d - Unalign fixup for kernel access to userspace %lx\n",
975 current
->comm
, current
->pid
, regs
->regs
[ra
]);
978 /* Done! Return to the exception handler. */
982 if ((align_ctl
== 0) || unexpected
) {
985 .si_code
= BUS_ADRALN
,
986 .si_addr
= (unsigned char __user
*)0
988 if (unaligned_printk
)
989 pr_info("Unalign bundle: unexp @%llx, %llx\n",
990 (unsigned long long)regs
->pc
,
991 (unsigned long long)bundle
);
994 unsigned long uaa
= (unsigned long)regs
->regs
[ra
];
995 /* Set bus Address. */
996 info
.si_addr
= (unsigned char __user
*)uaa
;
999 unaligned_fixup_count
++;
1001 trace_unhandled_signal("unaligned fixup trap", regs
,
1002 (unsigned long)info
.si_addr
, SIGBUS
);
1003 force_sig_info(info
.si_signo
, &info
, current
);
1007 #ifdef __LITTLE_ENDIAN
1008 #define UA_FIXUP_ADDR_DELTA 1
1009 #define UA_FIXUP_BFEXT_START(_B_) 0
1010 #define UA_FIXUP_BFEXT_END(_B_) (8 * (_B_) - 1)
1011 #else /* __BIG_ENDIAN */
1012 #define UA_FIXUP_ADDR_DELTA -1
1013 #define UA_FIXUP_BFEXT_START(_B_) (64 - 8 * (_B_))
1014 #define UA_FIXUP_BFEXT_END(_B_) 63
1015 #endif /* __LITTLE_ENDIAN */
1019 if ((ra
!= rb
) && (rd
!= TREG_SP
) && !alias
&&
1020 !y1_br
&& !y1_lr
&& !x1_add
) {
1022 * Simple case: ra != rb and no register alias found,
1023 * and no branch or link. This will be the majority.
1024 * We can do a little better for simplae case than the
1025 * generic scheme below.
1027 if (!load_n_store
) {
1029 * Simple store: ra != rb, no need for scratch register.
1030 * Just store and rotate to right bytewise.
1034 jit_x0_addi(ra
, ra
, load_store_size
- 1) |
1036 #endif /* __BIG_ENDIAN */
1037 for (k
= 0; k
< load_store_size
; k
++) {
1040 jit_x0_rotli(rb
, rb
, 56) |
1041 jit_x1_st1_add(ra
, rb
,
1042 UA_FIXUP_ADDR_DELTA
);
1045 frag
.insn
[n
] = jit_x1_addi(ra
, ra
, 1);
1047 frag
.insn
[n
] = jit_x1_addi(ra
, ra
,
1048 -1 * load_store_size
);
1049 #endif /* __LITTLE_ENDIAN */
1051 if (load_store_size
== 8) {
1052 frag
.insn
[n
] |= jit_x0_fnop();
1053 } else if (load_store_size
== 4) {
1054 frag
.insn
[n
] |= jit_x0_rotli(rb
, rb
, 32);
1056 frag
.insn
[n
] |= jit_x0_rotli(rb
, rb
, 16);
1059 if (bundle_2_enable
)
1060 frag
.insn
[n
++] = bundle_2
;
1061 frag
.insn
[n
++] = jit_x0_fnop() | jit_x1_iret();
1064 /* Use two clobber registers: clob1/2. */
1066 jit_x0_addi(TREG_SP
, TREG_SP
, -16) |
1069 jit_x0_addi(clob1
, ra
, 7) |
1070 jit_x1_st_add(TREG_SP
, clob1
, -8);
1072 jit_x0_addi(clob2
, ra
, 0) |
1073 jit_x1_st(TREG_SP
, clob2
);
1076 jit_x1_ldna(rd
, ra
);
1079 jit_x1_ldna(clob1
, clob1
);
1081 * Note: we must make sure that rd must not
1082 * be sp. Recover clob1/2 from stack.
1085 jit_x0_dblalign(rd
, clob1
, clob2
) |
1086 jit_x1_ld_add(clob2
, TREG_SP
, 8);
1089 jit_x1_ld_add(clob1
, TREG_SP
, 16);
1091 /* Use one clobber register: clob1 only. */
1093 jit_x0_addi(TREG_SP
, TREG_SP
, -16) |
1096 jit_x0_addi(clob1
, ra
, 7) |
1097 jit_x1_st(TREG_SP
, clob1
);
1100 jit_x1_ldna(rd
, ra
);
1103 jit_x1_ldna(clob1
, clob1
);
1105 * Note: we must make sure that rd must not
1106 * be sp. Recover clob1 from stack.
1109 jit_x0_dblalign(rd
, clob1
, ra
) |
1110 jit_x1_ld_add(clob1
, TREG_SP
, 16);
1113 if (bundle_2_enable
)
1114 frag
.insn
[n
++] = bundle_2
;
1116 * For non 8-byte load, extract corresponding bytes and
1119 if (load_store_size
== 4) {
1120 if (load_store_signed
)
1124 UA_FIXUP_BFEXT_START(4),
1125 UA_FIXUP_BFEXT_END(4)) |
1131 UA_FIXUP_BFEXT_START(4),
1132 UA_FIXUP_BFEXT_END(4)) |
1134 } else if (load_store_size
== 2) {
1135 if (load_store_signed
)
1139 UA_FIXUP_BFEXT_START(2),
1140 UA_FIXUP_BFEXT_END(2)) |
1146 UA_FIXUP_BFEXT_START(2),
1147 UA_FIXUP_BFEXT_END(2)) |
1155 } else if (!load_n_store
) {
1158 * Generic memory store cases: use 3 clobber registers.
1160 * Alloc space for saveing clob2,1,3 on user's stack.
1161 * register clob3 points to where clob2 saved, followed by
1162 * clob1 and 3 from high to low memory.
1165 jit_x0_addi(TREG_SP
, TREG_SP
, -32) |
1168 jit_x0_addi(clob3
, TREG_SP
, 16) |
1169 jit_x1_st_add(TREG_SP
, clob3
, 8);
1170 #ifdef __LITTLE_ENDIAN
1172 jit_x0_addi(clob1
, ra
, 0) |
1173 jit_x1_st_add(TREG_SP
, clob1
, 8);
1176 jit_x0_addi(clob1
, ra
, load_store_size
- 1) |
1177 jit_x1_st_add(TREG_SP
, clob1
, 8);
1179 if (load_store_size
== 8) {
1181 * We save one byte a time, not for fast, but compact
1182 * code. After each store, data source register shift
1183 * right one byte. unchanged after 8 stores.
1186 jit_x0_addi(clob2
, TREG_ZERO
, 7) |
1187 jit_x1_st_add(TREG_SP
, clob2
, 16);
1189 jit_x0_rotli(rb
, rb
, 56) |
1190 jit_x1_st1_add(clob1
, rb
, UA_FIXUP_ADDR_DELTA
);
1192 jit_x0_addi(clob2
, clob2
, -1) |
1193 jit_x1_bnezt(clob2
, -1);
1196 jit_x1_addi(clob2
, y1_br_reg
, 0);
1197 } else if (load_store_size
== 4) {
1199 jit_x0_addi(clob2
, TREG_ZERO
, 3) |
1200 jit_x1_st_add(TREG_SP
, clob2
, 16);
1202 jit_x0_rotli(rb
, rb
, 56) |
1203 jit_x1_st1_add(clob1
, rb
, UA_FIXUP_ADDR_DELTA
);
1205 jit_x0_addi(clob2
, clob2
, -1) |
1206 jit_x1_bnezt(clob2
, -1);
1208 * same as 8-byte case, but need shift another 4
1209 * byte to recover rb for 4-byte store.
1211 frag
.insn
[n
++] = jit_x0_rotli(rb
, rb
, 32) |
1212 jit_x1_addi(clob2
, y1_br_reg
, 0);
1215 jit_x0_addi(clob2
, rb
, 0) |
1216 jit_x1_st_add(TREG_SP
, clob2
, 16);
1217 for (k
= 0; k
< 2; k
++) {
1219 jit_x0_shrui(rb
, rb
, 8) |
1220 jit_x1_st1_add(clob1
, rb
,
1221 UA_FIXUP_ADDR_DELTA
);
1224 jit_x0_addi(rb
, clob2
, 0) |
1225 jit_x1_addi(clob2
, y1_br_reg
, 0);
1228 if (bundle_2_enable
)
1229 frag
.insn
[n
++] = bundle_2
;
1234 jit_x1_mfspr(y1_lr_reg
,
1235 SPR_EX_CONTEXT_0_0
);
1240 jit_x1_mtspr(SPR_EX_CONTEXT_0_0
,
1245 jit_x0_addi(ra
, ra
, x1_add_imm8
) |
1246 jit_x1_ld_add(clob2
, clob3
, -8);
1250 jit_x1_ld_add(clob2
, clob3
, -8);
1254 jit_x1_ld_add(clob1
, clob3
, -8);
1255 frag
.insn
[n
++] = jit_x0_fnop() | jit_x1_ld(clob3
, clob3
);
1256 frag
.insn
[n
++] = jit_x0_fnop() | jit_x1_iret();
1260 * Generic memory load cases.
1262 * Alloc space for saveing clob1,2,3 on user's stack.
1263 * register clob3 points to where clob1 saved, followed
1264 * by clob2 and 3 from high to low memory.
1268 jit_x0_addi(TREG_SP
, TREG_SP
, -32) |
1271 jit_x0_addi(clob3
, TREG_SP
, 16) |
1272 jit_x1_st_add(TREG_SP
, clob3
, 8);
1274 jit_x0_addi(clob2
, ra
, 0) |
1275 jit_x1_st_add(TREG_SP
, clob2
, 8);
1279 jit_x0_addi(clob1
, y1_br_reg
, 0) |
1280 jit_x1_st_add(TREG_SP
, clob1
, 16);
1284 jit_x1_st_add(TREG_SP
, clob1
, 16);
1287 if (bundle_2_enable
)
1288 frag
.insn
[n
++] = bundle_2
;
1293 jit_x1_mfspr(y1_lr_reg
,
1294 SPR_EX_CONTEXT_0_0
);
1300 jit_x1_mtspr(SPR_EX_CONTEXT_0_0
,
1305 jit_x0_addi(clob1
, clob2
, 7) |
1306 jit_x1_ldna(rd
, clob2
);
1309 jit_x1_ldna(clob1
, clob1
);
1311 jit_x0_dblalign(rd
, clob1
, clob2
) |
1312 jit_x1_ld_add(clob1
, clob3
, -8);
1315 jit_x0_addi(ra
, ra
, x1_add_imm8
) |
1316 jit_x1_ld_add(clob2
, clob3
, -8);
1320 jit_x1_ld_add(clob2
, clob3
, -8);
1325 jit_x1_ld(clob3
, clob3
);
1327 if (load_store_size
== 4) {
1328 if (load_store_signed
)
1332 UA_FIXUP_BFEXT_START(4),
1333 UA_FIXUP_BFEXT_END(4)) |
1339 UA_FIXUP_BFEXT_START(4),
1340 UA_FIXUP_BFEXT_END(4)) |
1342 } else if (load_store_size
== 2) {
1343 if (load_store_signed
)
1347 UA_FIXUP_BFEXT_START(2),
1348 UA_FIXUP_BFEXT_END(2)) |
1354 UA_FIXUP_BFEXT_START(2),
1355 UA_FIXUP_BFEXT_END(2)) |
1359 frag
.insn
[n
++] = jit_x0_fnop() | jit_x1_iret();
1362 /* Max JIT bundle count is 14. */
1367 int idx
= (regs
->pc
>> 3) &
1368 ((1ULL << (PAGE_SHIFT
- UNALIGN_JIT_SHIFT
)) - 1);
1371 frag
.bundle
= bundle
;
1373 if (unaligned_printk
) {
1374 pr_info("%s/%d, Unalign fixup: pc=%lx bundle=%lx %d %d %d %d %d %d %d %d\n",
1375 current
->comm
, current
->pid
,
1376 (unsigned long)frag
.pc
,
1377 (unsigned long)frag
.bundle
,
1378 (int)alias
, (int)rd
, (int)ra
,
1379 (int)rb
, (int)bundle_2_enable
,
1380 (int)y1_lr
, (int)y1_br
, (int)x1_add
);
1382 for (k
= 0; k
< n
; k
+= 2)
1383 pr_info("[%d] %016llx %016llx\n",
1384 k
, (unsigned long long)frag
.insn
[k
],
1385 (unsigned long long)frag
.insn
[k
+1]);
1388 /* Swap bundle byte order for big endian sys. */
1390 frag
.bundle
= GX_INSN_BSWAP(frag
.bundle
);
1391 for (k
= 0; k
< n
; k
++)
1392 frag
.insn
[k
] = GX_INSN_BSWAP(frag
.insn
[k
]);
1393 #endif /* __BIG_ENDIAN */
1395 status
= copy_to_user((void __user
*)&jit_code_area
[idx
],
1396 &frag
, sizeof(frag
));
1398 /* Fail to copy JIT into user land. send SIGSEGV. */
1400 .si_signo
= SIGSEGV
,
1401 .si_code
= SEGV_MAPERR
,
1402 .si_addr
= (void __user
*)&jit_code_area
[idx
]
1405 pr_warn("Unalign fixup: pid=%d %s jit_code_area=%llx\n",
1406 current
->pid
, current
->comm
,
1407 (unsigned long long)&jit_code_area
[idx
]);
1409 trace_unhandled_signal("segfault in unalign fixup",
1411 (unsigned long)info
.si_addr
,
1413 force_sig_info(info
.si_signo
, &info
, current
);
1418 /* Do a cheaper increment, not accurate. */
1419 unaligned_fixup_count
++;
1420 __flush_icache_range((unsigned long)&jit_code_area
[idx
],
1421 (unsigned long)&jit_code_area
[idx
] +
1424 /* Setup SPR_EX_CONTEXT_0_0/1 for returning to user program.*/
1425 __insn_mtspr(SPR_EX_CONTEXT_0_0
, regs
->pc
+ 8);
1426 __insn_mtspr(SPR_EX_CONTEXT_0_1
, PL_ICS_EX1(USER_PL
, 0));
1428 /* Modify pc at the start of new JIT. */
1429 regs
->pc
= (unsigned long)&jit_code_area
[idx
].insn
[0];
1430 /* Set ICS in SPR_EX_CONTEXT_K_1. */
1431 regs
->ex1
= PL_ICS_EX1(USER_PL
, 1);
1437 * C function to generate unalign data JIT. Called from unalign data
1438 * interrupt handler.
1440 * First check if unalign fix is disabled or exception did not not come from
1441 * user space or sp register points to unalign address, if true, generate a
1442 * SIGBUS. Then map a page into user space as JIT area if it is not mapped
1443 * yet. Genenerate JIT code by calling jit_bundle_gen(). After that return
1444 * back to exception handler.
1446 * The exception handler will "iret" to new generated JIT code after
1447 * restoring caller saved registers. In theory, the JIT code will perform
1448 * another "iret" to resume user's program.
1451 void do_unaligned(struct pt_regs
*regs
, int vecnum
)
1453 tilegx_bundle_bits __user
*pc
;
1454 tilegx_bundle_bits bundle
;
1455 struct thread_info
*info
= current_thread_info();
1458 /* Checks the per-process unaligned JIT flags */
1459 align_ctl
= unaligned_fixup
;
1460 switch (task_thread_info(current
)->align_ctl
) {
1461 case PR_UNALIGN_NOPRINT
:
1464 case PR_UNALIGN_SIGBUS
:
1469 /* Enable iterrupt in order to access user land. */
1473 * The fault came from kernel space. Two choices:
1474 * (a) unaligned_fixup < 1, we will first call get/put_user fixup
1475 * to return -EFAULT. If no fixup, simply panic the kernel.
1476 * (b) unaligned_fixup >=1, we will try to fix the unaligned access
1477 * if it was triggered by get_user/put_user() macros. Panic the
1478 * kernel if it is not fixable.
1481 if (EX1_PL(regs
->ex1
) != USER_PL
) {
1483 if (align_ctl
< 1) {
1484 unaligned_fixup_count
++;
1485 /* If exception came from kernel, try fix it up. */
1486 if (fixup_exception(regs
)) {
1487 if (unaligned_printk
)
1488 pr_info("Unalign fixup: %d %llx @%llx\n",
1489 (int)unaligned_fixup
,
1490 (unsigned long long)regs
->ex1
,
1491 (unsigned long long)regs
->pc
);
1493 /* Not fixable. Go panic. */
1494 panic("Unalign exception in Kernel. pc=%lx",
1499 * Try to fix the exception. If we can't, panic the
1502 bundle
= GX_INSN_BSWAP(
1503 *((tilegx_bundle_bits
*)(regs
->pc
)));
1504 jit_bundle_gen(regs
, bundle
, align_ctl
);
1510 * Fault came from user with ICS or stack is not aligned.
1511 * If so, we will trigger SIGBUS.
1513 if ((regs
->sp
& 0x7) || (regs
->ex1
) || (align_ctl
< 0)) {
1516 .si_code
= BUS_ADRALN
,
1517 .si_addr
= (unsigned char __user
*)0
1520 if (unaligned_printk
)
1521 pr_info("Unalign fixup: %d %llx @%llx\n",
1522 (int)unaligned_fixup
,
1523 (unsigned long long)regs
->ex1
,
1524 (unsigned long long)regs
->pc
);
1526 unaligned_fixup_count
++;
1528 trace_unhandled_signal("unaligned fixup trap", regs
, 0, SIGBUS
);
1529 force_sig_info(info
.si_signo
, &info
, current
);
1534 /* Read the bundle caused the exception! */
1535 pc
= (tilegx_bundle_bits __user
*)(regs
->pc
);
1536 if (get_user(bundle
, pc
) != 0) {
1537 /* Probably never be here since pc is valid user address.*/
1539 .si_signo
= SIGSEGV
,
1540 .si_code
= SEGV_MAPERR
,
1541 .si_addr
= (void __user
*)pc
1543 pr_err("Couldn't read instruction at %p trying to step\n", pc
);
1544 trace_unhandled_signal("segfault in unalign fixup", regs
,
1545 (unsigned long)info
.si_addr
, SIGSEGV
);
1546 force_sig_info(info
.si_signo
, &info
, current
);
1550 if (!info
->unalign_jit_base
) {
1551 void __user
*user_page
;
1554 * Allocate a page in userland.
1555 * For 64-bit processes we try to place the mapping far
1556 * from anything else that might be going on (specifically
1557 * 64 GB below the top of the user address space). If it
1558 * happens not to be possible to put it there, it's OK;
1559 * the kernel will choose another location and we'll
1560 * remember it for later.
1562 if (is_compat_task())
1565 user_page
= (void __user
*)(TASK_SIZE
- (1UL << 36)) +
1566 (current
->pid
<< PAGE_SHIFT
);
1568 user_page
= (void __user
*) vm_mmap(NULL
,
1569 (unsigned long)user_page
,
1571 PROT_EXEC
| PROT_READ
|
1573 #ifdef CONFIG_HOMECACHE
1574 MAP_CACHE_HOME_TASK
|
1580 if (IS_ERR((void __force
*)user_page
)) {
1581 pr_err("Out of kernel pages trying do_mmap\n");
1585 /* Save the address in the thread_info struct */
1586 info
->unalign_jit_base
= user_page
;
1587 if (unaligned_printk
)
1588 pr_info("Unalign bundle: %d:%d, allocate page @%llx\n",
1589 raw_smp_processor_id(), current
->pid
,
1590 (unsigned long long)user_page
);
1593 /* Generate unalign JIT */
1594 jit_bundle_gen(regs
, GX_INSN_BSWAP(bundle
), align_ctl
);
1597 #endif /* __tilegx__ */