.. | .. |
---|
12 | 12 | #ifndef _ASM_SGIARCS_H |
---|
13 | 13 | #define _ASM_SGIARCS_H |
---|
14 | 14 | |
---|
| 15 | +#include <linux/kernel.h> |
---|
| 16 | + |
---|
15 | 17 | #include <asm/types.h> |
---|
16 | 18 | #include <asm/fw/arc/types.h> |
---|
17 | 19 | |
---|
.. | .. |
---|
368 | 370 | |
---|
369 | 371 | #if defined(CONFIG_64BIT) && defined(CONFIG_FW_ARC32) |
---|
370 | 372 | |
---|
371 | | -#define __arc_clobbers \ |
---|
372 | | - "$2", "$3" /* ... */, "$8", "$9", "$10", "$11", \ |
---|
373 | | - "$12", "$13", "$14", "$15", "$16", "$24", "$25", "$31" |
---|
| 373 | +extern long call_o32(long vec, void *stack, ...); |
---|
| 374 | + |
---|
| 375 | +extern u64 o32_stk[4096]; |
---|
| 376 | +#define O32_STK (&o32_stk[ARRAY_SIZE(o32_stk)]) |
---|
374 | 377 | |
---|
375 | 378 | #define ARC_CALL0(dest) \ |
---|
376 | 379 | ({ long __res; \ |
---|
377 | 380 | long __vec = (long) romvec->dest; \ |
---|
378 | | - __asm__ __volatile__( \ |
---|
379 | | - "dsubu\t$29, 32\n\t" \ |
---|
380 | | - "jalr\t%1\n\t" \ |
---|
381 | | - "daddu\t$29, 32\n\t" \ |
---|
382 | | - "move\t%0, $2" \ |
---|
383 | | - : "=r" (__res), "=r" (__vec) \ |
---|
384 | | - : "1" (__vec) \ |
---|
385 | | - : __arc_clobbers, "$4", "$5", "$6", "$7"); \ |
---|
386 | | - (unsigned long) __res; \ |
---|
| 381 | + __res = call_o32(__vec, O32_STK); \ |
---|
| 382 | + __res; \ |
---|
387 | 383 | }) |
---|
388 | 384 | |
---|
389 | 385 | #define ARC_CALL1(dest, a1) \ |
---|
390 | 386 | ({ long __res; \ |
---|
391 | | - register signed int __a1 __asm__("$4") = (int) (long) (a1); \ |
---|
| 387 | + int __a1 = (int) (long) (a1); \ |
---|
392 | 388 | long __vec = (long) romvec->dest; \ |
---|
393 | | - __asm__ __volatile__( \ |
---|
394 | | - "dsubu\t$29, 32\n\t" \ |
---|
395 | | - "jalr\t%1\n\t" \ |
---|
396 | | - "daddu\t$29, 32\n\t" \ |
---|
397 | | - "move\t%0, $2" \ |
---|
398 | | - : "=r" (__res), "=r" (__vec) \ |
---|
399 | | - : "1" (__vec), "r" (__a1) \ |
---|
400 | | - : __arc_clobbers, "$5", "$6", "$7"); \ |
---|
401 | | - (unsigned long) __res; \ |
---|
| 389 | + __res = call_o32(__vec, O32_STK, __a1); \ |
---|
| 390 | + __res; \ |
---|
402 | 391 | }) |
---|
403 | 392 | |
---|
404 | 393 | #define ARC_CALL2(dest, a1, a2) \ |
---|
405 | 394 | ({ long __res; \ |
---|
406 | | - register signed int __a1 __asm__("$4") = (int) (long) (a1); \ |
---|
407 | | - register signed int __a2 __asm__("$5") = (int) (long) (a2); \ |
---|
| 395 | + int __a1 = (int) (long) (a1); \ |
---|
| 396 | + int __a2 = (int) (long) (a2); \ |
---|
408 | 397 | long __vec = (long) romvec->dest; \ |
---|
409 | | - __asm__ __volatile__( \ |
---|
410 | | - "dsubu\t$29, 32\n\t" \ |
---|
411 | | - "jalr\t%1\n\t" \ |
---|
412 | | - "daddu\t$29, 32\n\t" \ |
---|
413 | | - "move\t%0, $2" \ |
---|
414 | | - : "=r" (__res), "=r" (__vec) \ |
---|
415 | | - : "1" (__vec), "r" (__a1), "r" (__a2) \ |
---|
416 | | - : __arc_clobbers, "$6", "$7"); \ |
---|
| 398 | + __res = call_o32(__vec, O32_STK, __a1, __a2); \ |
---|
417 | 399 | __res; \ |
---|
418 | 400 | }) |
---|
419 | 401 | |
---|
420 | 402 | #define ARC_CALL3(dest, a1, a2, a3) \ |
---|
421 | 403 | ({ long __res; \ |
---|
422 | | - register signed int __a1 __asm__("$4") = (int) (long) (a1); \ |
---|
423 | | - register signed int __a2 __asm__("$5") = (int) (long) (a2); \ |
---|
424 | | - register signed int __a3 __asm__("$6") = (int) (long) (a3); \ |
---|
| 404 | + int __a1 = (int) (long) (a1); \ |
---|
| 405 | + int __a2 = (int) (long) (a2); \ |
---|
| 406 | + int __a3 = (int) (long) (a3); \ |
---|
425 | 407 | long __vec = (long) romvec->dest; \ |
---|
426 | | - __asm__ __volatile__( \ |
---|
427 | | - "dsubu\t$29, 32\n\t" \ |
---|
428 | | - "jalr\t%1\n\t" \ |
---|
429 | | - "daddu\t$29, 32\n\t" \ |
---|
430 | | - "move\t%0, $2" \ |
---|
431 | | - : "=r" (__res), "=r" (__vec) \ |
---|
432 | | - : "1" (__vec), "r" (__a1), "r" (__a2), "r" (__a3) \ |
---|
433 | | - : __arc_clobbers, "$7"); \ |
---|
| 408 | + __res = call_o32(__vec, O32_STK, __a1, __a2, __a3); \ |
---|
434 | 409 | __res; \ |
---|
435 | 410 | }) |
---|
436 | 411 | |
---|
437 | 412 | #define ARC_CALL4(dest, a1, a2, a3, a4) \ |
---|
438 | 413 | ({ long __res; \ |
---|
439 | | - register signed int __a1 __asm__("$4") = (int) (long) (a1); \ |
---|
440 | | - register signed int __a2 __asm__("$5") = (int) (long) (a2); \ |
---|
441 | | - register signed int __a3 __asm__("$6") = (int) (long) (a3); \ |
---|
442 | | - register signed int __a4 __asm__("$7") = (int) (long) (a4); \ |
---|
| 414 | + int __a1 = (int) (long) (a1); \ |
---|
| 415 | + int __a2 = (int) (long) (a2); \ |
---|
| 416 | + int __a3 = (int) (long) (a3); \ |
---|
| 417 | + int __a4 = (int) (long) (a4); \ |
---|
443 | 418 | long __vec = (long) romvec->dest; \ |
---|
444 | | - __asm__ __volatile__( \ |
---|
445 | | - "dsubu\t$29, 32\n\t" \ |
---|
446 | | - "jalr\t%1\n\t" \ |
---|
447 | | - "daddu\t$29, 32\n\t" \ |
---|
448 | | - "move\t%0, $2" \ |
---|
449 | | - : "=r" (__res), "=r" (__vec) \ |
---|
450 | | - : "1" (__vec), "r" (__a1), "r" (__a2), "r" (__a3), \ |
---|
451 | | - "r" (__a4) \ |
---|
452 | | - : __arc_clobbers); \ |
---|
| 419 | + __res = call_o32(__vec, O32_STK, __a1, __a2, __a3, __a4); \ |
---|
453 | 420 | __res; \ |
---|
454 | 421 | }) |
---|
455 | 422 | |
---|
456 | | -#define ARC_CALL5(dest, a1, a2, a3, a4, a5) \ |
---|
| 423 | +#define ARC_CALL5(dest, a1, a2, a3, a4, a5) \ |
---|
457 | 424 | ({ long __res; \ |
---|
458 | | - register signed int __a1 __asm__("$4") = (int) (long) (a1); \ |
---|
459 | | - register signed int __a2 __asm__("$5") = (int) (long) (a2); \ |
---|
460 | | - register signed int __a3 __asm__("$6") = (int) (long) (a3); \ |
---|
461 | | - register signed int __a4 __asm__("$7") = (int) (long) (a4); \ |
---|
462 | | - register signed int __a5 = (int) (long) (a5); \ |
---|
| 425 | + int __a1 = (int) (long) (a1); \ |
---|
| 426 | + int __a2 = (int) (long) (a2); \ |
---|
| 427 | + int __a3 = (int) (long) (a3); \ |
---|
| 428 | + int __a4 = (int) (long) (a4); \ |
---|
| 429 | + int __a5 = (int) (long) (a5); \ |
---|
463 | 430 | long __vec = (long) romvec->dest; \ |
---|
464 | | - __asm__ __volatile__( \ |
---|
465 | | - "dsubu\t$29, 32\n\t" \ |
---|
466 | | - "sw\t%7, 16($29)\n\t" \ |
---|
467 | | - "jalr\t%1\n\t" \ |
---|
468 | | - "daddu\t$29, 32\n\t" \ |
---|
469 | | - "move\t%0, $2" \ |
---|
470 | | - : "=r" (__res), "=r" (__vec) \ |
---|
471 | | - : "1" (__vec), \ |
---|
472 | | - "r" (__a1), "r" (__a2), "r" (__a3), "r" (__a4), \ |
---|
473 | | - "r" (__a5) \ |
---|
474 | | - : __arc_clobbers); \ |
---|
| 431 | + __res = call_o32(__vec, O32_STK, __a1, __a2, __a3, __a4, __a5); \ |
---|
475 | 432 | __res; \ |
---|
476 | 433 | }) |
---|
477 | 434 | |
---|