| .. | .. |
|---|
| 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 | |
|---|