2 * Copyright (c) 2003 Marcel Moolenaar
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include <machine/asm.h>
35 * void restorectx(struct pcb *)
46 ld8 r16=[r31],16 // unat (before)
51 ld8 r17=[r30],16 // rp
52 ld8 r18=[r31],16 // pr
53 add r14=SIZEOF_SPECIAL,r32
57 ld8 r19=[r30],16 // pfs
58 ld8 r20=[r31],16 // bspstore
64 ld8 r21=[r30],16 // rnat
69 ld8 r17=[r14],8 // unat (after)
81 ld8.fill r4=[r14],16 // r4
82 ld8.fill r5=[r15],16 // r5
87 ld8.fill r6=[r14],16 // r6
88 ld8.fill r7=[r15],16 // r7
98 ld8 r17=[r14],16 // b1
99 ld8 r18=[r15],16 // b2
104 ld8 r19=[r14],16 // b3
105 ld8 r20=[r15],16 // b4
110 ld8 r16=[r14],24 // b5
111 ld8 r17=[r15],32 // lc
128 ldf.fill f16=[r14],32
129 ldf.fill f17=[r15],32
134 ldf.fill f18=[r14],32
135 ldf.fill f19=[r15],32
139 ldf.fill f20=[r14],32
140 ldf.fill f21=[r15],32
142 ldf.fill f22=[r14],32
143 ldf.fill f23=[r15],32
145 ldf.fill f24=[r14],32
146 ldf.fill f25=[r15],32
148 ldf.fill f26=[r14],32
149 ldf.fill f27=[r15],32
152 ldf.fill f28=[r14],32
153 ldf.fill f29=[r15],32
166 * void swapctx(struct pcb *old, struct pcb *new)
178 st8 [r32]=sp,16 // sp
183 st8 [r31]=r16,16 // unat (before)
184 st8 [r32]=r17,16 // rp
189 st8 [r31]=r16,16 // pr
195 st8 [r32]=r16,16 // pfs
196 st8 [r31]=r17,16 // bspstore
203 add r30=SIZEOF_SPECIAL-(6*8),r32
207 st8 [r32]=r16,SIZEOF_SPECIAL-(4*8) // rnat
208 st8 [r31]=r0,SIZEOF_SPECIAL-(6*8) // __spare
215 st8.spill [r31]=r4,16 // r4
217 st8.spill [r32]=r5,16 // r5
223 st8.spill [r31]=r6,16 // r6
225 st8.spill [r32]=r7,16 // r7
230 st8 [r31]=r16,16 // b1
236 st8 [r30]=r16 // unat (after)
237 st8 [r32]=r17,16 // b2
242 st8 [r31]=r18,16 // b3
243 st8 [r32]=r19,16 // b4
247 st8 [r31]=r16,16 // b5
248 st8 [r32]=r17,16 // lc
250 st8 [r31]=r0,24 // __spare
251 stf.spill [r32]=f2,32
253 stf.spill [r31]=f3,32
254 stf.spill [r32]=f4,32
256 stf.spill [r31]=f5,32
257 stf.spill [r32]=f16,32
259 stf.spill [r31]=f17,32
260 stf.spill [r32]=f18,32
262 stf.spill [r31]=f19,32
263 stf.spill [r32]=f20,32
265 stf.spill [r31]=f21,32
266 stf.spill [r32]=f22,32
268 stf.spill [r31]=f23,32
269 stf.spill [r32]=f24,32
271 stf.spill [r31]=f25,32
272 stf.spill [r32]=f26,32
274 stf.spill [r31]=f27,32
275 stf.spill [r32]=f28,32
278 stf.spill [r31]=f29,32
298 * save_callee_saved(struct _callee_saved *)
300 ENTRY(save_callee_saved, 1)
309 st8.spill [r14]=r4,16 // r4
311 st8.spill [r15]=r5,16 // r5
317 st8.spill [r14]=r6,16 // r6
319 st8.spill [r15]=r7,16 // r7
324 st8 [r14]=r16,16 // b1
330 st8 [r32]=r18 // nat (after)
331 st8 [r15]=r17,16 // b2
336 st8 [r14]=r19,16 // b3
337 st8 [r15]=r16,16 // b4
342 st8 [r14]=r17,16 // b5
348 st8 [r15]=r16 // ar.lc
349 st8 [r14]=r0 // __spare
353 END(save_callee_saved)
356 * restore_callee_saved(struct _callee_saved *)
358 ENTRY(restore_callee_saved, 1)
360 ld8 r30=[r32],16 // nat (after)
367 ld8.fill r4=[r31],16 // r4
368 ld8.fill r5=[r32],16 // r5
373 ld8.fill r6=[r31],16 // r6
374 ld8.fill r7=[r32],16 // r7
379 ld8 r30=[r31],16 // b1
380 ld8 r29=[r32],16 // b2
385 ld8 r28=[r31],16 // b3
386 ld8 r27=[r32],16 // b4
408 END(restore_callee_saved)
411 * save_callee_saved_fp(struct _callee_saved_fp *)
413 ENTRY(save_callee_saved_fp, 1)
415 stf.spill [r32]=f2,32
417 stf.spill [r31]=f3,32
418 stf.spill [r32]=f4,32
420 stf.spill [r31]=f5,32
421 stf.spill [r32]=f16,32
423 stf.spill [r31]=f17,32
424 stf.spill [r32]=f18,32
426 stf.spill [r31]=f19,32
427 stf.spill [r32]=f20,32
429 stf.spill [r31]=f21,32
430 stf.spill [r32]=f22,32
432 stf.spill [r31]=f23,32
433 stf.spill [r32]=f24,32
435 stf.spill [r31]=f25,32
436 stf.spill [r32]=f26,32
438 stf.spill [r31]=f27,32
439 stf.spill [r32]=f28,32
441 stf.spill [r31]=f29,32
447 END(save_callee_saved_fp)
450 * restore_callee_saved_fp(struct _callee_saved_fp *)
452 ENTRY(restore_callee_saved_fp, 1)
460 ldf.fill f16=[r32],32
462 ldf.fill f17=[r31],32
463 ldf.fill f18=[r32],32
465 ldf.fill f19=[r31],32
466 ldf.fill f20=[r32],32
468 ldf.fill f21=[r31],32
469 ldf.fill f22=[r32],32
471 ldf.fill f23=[r31],32
472 ldf.fill f24=[r32],32
474 ldf.fill f25=[r31],32
475 ldf.fill f26=[r32],32
477 ldf.fill f27=[r31],32
478 ldf.fill f28=[r32],32
480 ldf.fill f29=[r31],32
486 END(restore_callee_saved_fp)
489 * save_high_fp(struct _high_fp *)
491 ENTRY(save_high_fp, 1)
496 stf.spill [r32]=f32,32
498 stf.spill [r31]=f33,32
499 stf.spill [r32]=f34,32
501 stf.spill [r31]=f35,32
502 stf.spill [r32]=f36,32
504 stf.spill [r31]=f37,32
505 stf.spill [r32]=f38,32
507 stf.spill [r31]=f39,32
508 stf.spill [r32]=f40,32
510 stf.spill [r31]=f41,32
511 stf.spill [r32]=f42,32
513 stf.spill [r31]=f43,32
514 stf.spill [r32]=f44,32
516 stf.spill [r31]=f45,32
517 stf.spill [r32]=f46,32
519 stf.spill [r31]=f47,32
520 stf.spill [r32]=f48,32
522 stf.spill [r31]=f49,32
523 stf.spill [r32]=f50,32
525 stf.spill [r31]=f51,32
526 stf.spill [r32]=f52,32
528 stf.spill [r31]=f53,32
529 stf.spill [r32]=f54,32
531 stf.spill [r31]=f55,32
532 stf.spill [r32]=f56,32
534 stf.spill [r31]=f57,32
535 stf.spill [r32]=f58,32
537 stf.spill [r31]=f59,32
538 stf.spill [r32]=f60,32
540 stf.spill [r31]=f61,32
541 stf.spill [r32]=f62,32
543 stf.spill [r31]=f63,32
544 stf.spill [r32]=f64,32
546 stf.spill [r31]=f65,32
547 stf.spill [r32]=f66,32
549 stf.spill [r31]=f67,32
550 stf.spill [r32]=f68,32
552 stf.spill [r31]=f69,32
553 stf.spill [r32]=f70,32
555 stf.spill [r31]=f71,32
556 stf.spill [r32]=f72,32
558 stf.spill [r31]=f73,32
559 stf.spill [r32]=f74,32
561 stf.spill [r31]=f75,32
562 stf.spill [r32]=f76,32
564 stf.spill [r31]=f77,32
565 stf.spill [r32]=f78,32
567 stf.spill [r31]=f79,32
568 stf.spill [r32]=f80,32
570 stf.spill [r31]=f81,32
571 stf.spill [r32]=f82,32
573 stf.spill [r31]=f83,32
574 stf.spill [r32]=f84,32
576 stf.spill [r31]=f85,32
577 stf.spill [r32]=f86,32
579 stf.spill [r31]=f87,32
580 stf.spill [r32]=f88,32
582 stf.spill [r31]=f89,32
583 stf.spill [r32]=f90,32
585 stf.spill [r31]=f91,32
586 stf.spill [r32]=f92,32
588 stf.spill [r31]=f93,32
589 stf.spill [r32]=f94,32
591 stf.spill [r31]=f95,32
592 stf.spill [r32]=f96,32
594 stf.spill [r31]=f97,32
595 stf.spill [r32]=f98,32
597 stf.spill [r31]=f99,32
598 stf.spill [r32]=f100,32
600 stf.spill [r31]=f101,32
601 stf.spill [r32]=f102,32
603 stf.spill [r31]=f103,32
604 stf.spill [r32]=f104,32
606 stf.spill [r31]=f105,32
607 stf.spill [r32]=f106,32
609 stf.spill [r31]=f107,32
610 stf.spill [r32]=f108,32
612 stf.spill [r31]=f109,32
613 stf.spill [r32]=f110,32
615 stf.spill [r31]=f111,32
616 stf.spill [r32]=f112,32
618 stf.spill [r31]=f113,32
619 stf.spill [r32]=f114,32
621 stf.spill [r31]=f115,32
622 stf.spill [r32]=f116,32
624 stf.spill [r31]=f117,32
625 stf.spill [r32]=f118,32
627 stf.spill [r31]=f119,32
628 stf.spill [r32]=f120,32
630 stf.spill [r31]=f121,32
631 stf.spill [r32]=f122,32
633 stf.spill [r31]=f123,32
634 stf.spill [r32]=f124,32
636 stf.spill [r31]=f125,32
648 * restore_high_fp(struct _high_fp *)
650 ENTRY(restore_high_fp, 1)
655 ldf.fill f32=[r32],32
657 ldf.fill f33=[r31],32
658 ldf.fill f34=[r32],32
660 ldf.fill f35=[r31],32
661 ldf.fill f36=[r32],32
663 ldf.fill f37=[r31],32
664 ldf.fill f38=[r32],32
666 ldf.fill f39=[r31],32
667 ldf.fill f40=[r32],32
669 ldf.fill f41=[r31],32
670 ldf.fill f42=[r32],32
672 ldf.fill f43=[r31],32
673 ldf.fill f44=[r32],32
675 ldf.fill f45=[r31],32
676 ldf.fill f46=[r32],32
678 ldf.fill f47=[r31],32
679 ldf.fill f48=[r32],32
681 ldf.fill f49=[r31],32
682 ldf.fill f50=[r32],32
684 ldf.fill f51=[r31],32
685 ldf.fill f52=[r32],32
687 ldf.fill f53=[r31],32
688 ldf.fill f54=[r32],32
690 ldf.fill f55=[r31],32
691 ldf.fill f56=[r32],32
693 ldf.fill f57=[r31],32
694 ldf.fill f58=[r32],32
696 ldf.fill f59=[r31],32
697 ldf.fill f60=[r32],32
699 ldf.fill f61=[r31],32
700 ldf.fill f62=[r32],32
702 ldf.fill f63=[r31],32
703 ldf.fill f64=[r32],32
705 ldf.fill f65=[r31],32
706 ldf.fill f66=[r32],32
708 ldf.fill f67=[r31],32
709 ldf.fill f68=[r32],32
711 ldf.fill f69=[r31],32
712 ldf.fill f70=[r32],32
714 ldf.fill f71=[r31],32
715 ldf.fill f72=[r32],32
717 ldf.fill f73=[r31],32
718 ldf.fill f74=[r32],32
720 ldf.fill f75=[r31],32
721 ldf.fill f76=[r32],32
723 ldf.fill f77=[r31],32
724 ldf.fill f78=[r32],32
726 ldf.fill f79=[r31],32
727 ldf.fill f80=[r32],32
729 ldf.fill f81=[r31],32
730 ldf.fill f82=[r32],32
732 ldf.fill f83=[r31],32
733 ldf.fill f84=[r32],32
735 ldf.fill f85=[r31],32
736 ldf.fill f86=[r32],32
738 ldf.fill f87=[r31],32
739 ldf.fill f88=[r32],32
741 ldf.fill f89=[r31],32
742 ldf.fill f90=[r32],32
744 ldf.fill f91=[r31],32
745 ldf.fill f92=[r32],32
747 ldf.fill f93=[r31],32
748 ldf.fill f94=[r32],32
750 ldf.fill f95=[r31],32
751 ldf.fill f96=[r32],32
753 ldf.fill f97=[r31],32
754 ldf.fill f98=[r32],32
756 ldf.fill f99=[r31],32
757 ldf.fill f100=[r32],32
759 ldf.fill f101=[r31],32
760 ldf.fill f102=[r32],32
762 ldf.fill f103=[r31],32
763 ldf.fill f104=[r32],32
765 ldf.fill f105=[r31],32
766 ldf.fill f106=[r32],32
768 ldf.fill f107=[r31],32
769 ldf.fill f108=[r32],32
771 ldf.fill f109=[r31],32
772 ldf.fill f110=[r32],32
774 ldf.fill f111=[r31],32
775 ldf.fill f112=[r32],32
777 ldf.fill f113=[r31],32
778 ldf.fill f114=[r32],32
780 ldf.fill f115=[r31],32
781 ldf.fill f116=[r32],32
783 ldf.fill f117=[r31],32
784 ldf.fill f118=[r32],32
786 ldf.fill f119=[r31],32
787 ldf.fill f120=[r32],32
789 ldf.fill f121=[r31],32
790 ldf.fill f122=[r32],32
792 ldf.fill f123=[r31],32
793 ldf.fill f124=[r32],32
795 ldf.fill f125=[r31],32