2 * Copyright (c) 1999-2007 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
26 #include <mach/vm_param.h>
29 .globl __objc_blockTrampolineImpl
30 .globl __objc_blockTrampolineStart
31 .globl __objc_blockTrampolineLast
33 .align 12 /* PAGE_SHIFT */
34 __objc_blockTrampolineImpl:
35 movl (%esp), %eax // return address pushed by trampoline
36 // 4(%esp) is return address pushed by the call site
37 movl 8(%esp), %ecx // self -> ecx
38 movl %ecx, 12(%esp) // ecx -> _cmd
39 movl -2*4096/*PAGE_SIZE */-5(%eax), %ecx // block object pointer -> ecx
40 // trampoline is -5 bytes from the return address
41 // data is -2 pages from the trampoline
42 movl %ecx, 8(%esp) // ecx -> self
43 ret // back to TrampolineEntry to preserve CPU's return stack
45 .macro TrampolineEntry
46 // This trampoline is 8 bytes long.
47 // This callq is 5 bytes long.
48 calll __objc_blockTrampolineImpl
49 jmp *12(%ecx) // tail call block->invoke
53 __objc_blockTrampolineStart:
561 __objc_blockTrampolineLast:
566 .globl __objc_blockTrampolineImpl_stret
567 .globl __objc_blockTrampolineStart_stret
568 .globl __objc_blockTrampolineLast_stret
570 .align 12 /* PAGE_SHIFT */
571 __objc_blockTrampolineImpl_stret:
572 movl (%esp), %eax // return address pushed by trampoline
573 // 4(%esp) is return address pushed by the call site
574 // 8(%esp) is struct-return address
575 movl 12(%esp), %ecx // self -> ecx
576 movl %ecx, 16(%esp) // ecx -> _cmd
577 movl -3*4096/*PAGE_SIZE*/-5(%eax), %ecx // block object pointer -> ecx
578 // trampoline is -5 bytes from the return address
579 // data is -3 pages from the trampoline
580 movl %ecx, 12(%esp) // ecx -> self
583 .macro TrampolineEntry_stret
584 // This trampoline is 8 bytes long.
585 // This callq is 5 bytes long.
586 call __objc_blockTrampolineImpl_stret
587 jmp *12(%ecx) // tail to block->invoke
591 __objc_blockTrampolineStart_stret:
592 TrampolineEntry_stret
593 TrampolineEntry_stret
594 TrampolineEntry_stret
595 TrampolineEntry_stret
596 TrampolineEntry_stret
597 TrampolineEntry_stret
598 TrampolineEntry_stret
599 TrampolineEntry_stret
600 TrampolineEntry_stret
601 TrampolineEntry_stret
602 TrampolineEntry_stret
603 TrampolineEntry_stret
604 TrampolineEntry_stret
605 TrampolineEntry_stret
606 TrampolineEntry_stret
607 TrampolineEntry_stret
608 TrampolineEntry_stret
609 TrampolineEntry_stret
610 TrampolineEntry_stret
611 TrampolineEntry_stret
612 TrampolineEntry_stret
613 TrampolineEntry_stret
614 TrampolineEntry_stret
615 TrampolineEntry_stret
616 TrampolineEntry_stret
617 TrampolineEntry_stret
618 TrampolineEntry_stret
619 TrampolineEntry_stret
620 TrampolineEntry_stret
621 TrampolineEntry_stret
622 TrampolineEntry_stret
623 TrampolineEntry_stret
624 TrampolineEntry_stret
625 TrampolineEntry_stret
626 TrampolineEntry_stret
627 TrampolineEntry_stret
628 TrampolineEntry_stret
629 TrampolineEntry_stret
630 TrampolineEntry_stret
631 TrampolineEntry_stret
632 TrampolineEntry_stret
633 TrampolineEntry_stret
634 TrampolineEntry_stret
635 TrampolineEntry_stret
636 TrampolineEntry_stret
637 TrampolineEntry_stret
638 TrampolineEntry_stret
639 TrampolineEntry_stret
640 TrampolineEntry_stret
641 TrampolineEntry_stret
642 TrampolineEntry_stret
643 TrampolineEntry_stret
644 TrampolineEntry_stret
645 TrampolineEntry_stret
646 TrampolineEntry_stret
647 TrampolineEntry_stret
648 TrampolineEntry_stret
649 TrampolineEntry_stret
650 TrampolineEntry_stret
651 TrampolineEntry_stret
652 TrampolineEntry_stret
653 TrampolineEntry_stret
654 TrampolineEntry_stret
655 TrampolineEntry_stret
656 TrampolineEntry_stret
657 TrampolineEntry_stret
658 TrampolineEntry_stret
659 TrampolineEntry_stret
660 TrampolineEntry_stret
661 TrampolineEntry_stret
662 TrampolineEntry_stret
663 TrampolineEntry_stret
664 TrampolineEntry_stret
665 TrampolineEntry_stret
666 TrampolineEntry_stret
667 TrampolineEntry_stret
668 TrampolineEntry_stret
669 TrampolineEntry_stret
670 TrampolineEntry_stret
671 TrampolineEntry_stret
672 TrampolineEntry_stret
673 TrampolineEntry_stret
674 TrampolineEntry_stret
675 TrampolineEntry_stret
676 TrampolineEntry_stret
677 TrampolineEntry_stret
678 TrampolineEntry_stret
679 TrampolineEntry_stret
680 TrampolineEntry_stret
681 TrampolineEntry_stret
682 TrampolineEntry_stret
683 TrampolineEntry_stret
684 TrampolineEntry_stret
685 TrampolineEntry_stret
686 TrampolineEntry_stret
687 TrampolineEntry_stret
688 TrampolineEntry_stret
689 TrampolineEntry_stret
690 TrampolineEntry_stret
691 TrampolineEntry_stret
692 TrampolineEntry_stret
693 TrampolineEntry_stret
694 TrampolineEntry_stret
695 TrampolineEntry_stret
696 TrampolineEntry_stret
697 TrampolineEntry_stret
698 TrampolineEntry_stret
699 TrampolineEntry_stret
700 TrampolineEntry_stret
701 TrampolineEntry_stret
702 TrampolineEntry_stret
703 TrampolineEntry_stret
704 TrampolineEntry_stret
705 TrampolineEntry_stret
706 TrampolineEntry_stret
707 TrampolineEntry_stret
708 TrampolineEntry_stret
709 TrampolineEntry_stret
710 TrampolineEntry_stret
711 TrampolineEntry_stret
712 TrampolineEntry_stret
713 TrampolineEntry_stret
714 TrampolineEntry_stret
715 TrampolineEntry_stret
716 TrampolineEntry_stret
717 TrampolineEntry_stret
718 TrampolineEntry_stret
719 TrampolineEntry_stret
720 TrampolineEntry_stret
721 TrampolineEntry_stret
722 TrampolineEntry_stret
723 TrampolineEntry_stret
724 TrampolineEntry_stret
725 TrampolineEntry_stret
726 TrampolineEntry_stret
727 TrampolineEntry_stret
728 TrampolineEntry_stret
729 TrampolineEntry_stret
730 TrampolineEntry_stret
731 TrampolineEntry_stret
732 TrampolineEntry_stret
733 TrampolineEntry_stret
734 TrampolineEntry_stret
735 TrampolineEntry_stret
736 TrampolineEntry_stret
737 TrampolineEntry_stret
738 TrampolineEntry_stret
739 TrampolineEntry_stret
740 TrampolineEntry_stret
741 TrampolineEntry_stret
742 TrampolineEntry_stret
743 TrampolineEntry_stret
744 TrampolineEntry_stret
745 TrampolineEntry_stret
746 TrampolineEntry_stret
747 TrampolineEntry_stret
748 TrampolineEntry_stret
749 TrampolineEntry_stret
750 TrampolineEntry_stret
751 TrampolineEntry_stret
752 TrampolineEntry_stret
753 TrampolineEntry_stret
754 TrampolineEntry_stret
755 TrampolineEntry_stret
756 TrampolineEntry_stret
757 TrampolineEntry_stret
758 TrampolineEntry_stret
759 TrampolineEntry_stret
760 TrampolineEntry_stret
761 TrampolineEntry_stret
762 TrampolineEntry_stret
763 TrampolineEntry_stret
764 TrampolineEntry_stret
765 TrampolineEntry_stret
766 TrampolineEntry_stret
767 TrampolineEntry_stret
768 TrampolineEntry_stret
769 TrampolineEntry_stret
770 TrampolineEntry_stret
771 TrampolineEntry_stret
772 TrampolineEntry_stret
773 TrampolineEntry_stret
774 TrampolineEntry_stret
775 TrampolineEntry_stret
776 TrampolineEntry_stret
777 TrampolineEntry_stret
778 TrampolineEntry_stret
779 TrampolineEntry_stret
780 TrampolineEntry_stret
781 TrampolineEntry_stret
782 TrampolineEntry_stret
783 TrampolineEntry_stret
784 TrampolineEntry_stret
785 TrampolineEntry_stret
786 TrampolineEntry_stret
787 TrampolineEntry_stret
788 TrampolineEntry_stret
789 TrampolineEntry_stret
790 TrampolineEntry_stret
791 TrampolineEntry_stret
792 TrampolineEntry_stret
793 TrampolineEntry_stret
794 TrampolineEntry_stret
795 TrampolineEntry_stret
796 TrampolineEntry_stret
797 TrampolineEntry_stret
798 TrampolineEntry_stret
799 TrampolineEntry_stret
800 TrampolineEntry_stret
801 TrampolineEntry_stret
802 TrampolineEntry_stret
803 TrampolineEntry_stret
804 TrampolineEntry_stret
805 TrampolineEntry_stret
806 TrampolineEntry_stret
807 TrampolineEntry_stret
808 TrampolineEntry_stret
809 TrampolineEntry_stret
810 TrampolineEntry_stret
811 TrampolineEntry_stret
812 TrampolineEntry_stret
813 TrampolineEntry_stret
814 TrampolineEntry_stret
815 TrampolineEntry_stret
816 TrampolineEntry_stret
817 TrampolineEntry_stret
818 TrampolineEntry_stret
819 TrampolineEntry_stret
820 TrampolineEntry_stret
821 TrampolineEntry_stret
822 TrampolineEntry_stret
823 TrampolineEntry_stret
824 TrampolineEntry_stret
825 TrampolineEntry_stret
826 TrampolineEntry_stret
827 TrampolineEntry_stret
828 TrampolineEntry_stret
829 TrampolineEntry_stret
830 TrampolineEntry_stret
831 TrampolineEntry_stret
832 TrampolineEntry_stret
833 TrampolineEntry_stret
834 TrampolineEntry_stret
835 TrampolineEntry_stret
836 TrampolineEntry_stret
837 TrampolineEntry_stret
838 TrampolineEntry_stret
839 TrampolineEntry_stret
840 TrampolineEntry_stret
841 TrampolineEntry_stret
842 TrampolineEntry_stret
843 TrampolineEntry_stret
844 TrampolineEntry_stret
845 TrampolineEntry_stret
846 TrampolineEntry_stret
847 TrampolineEntry_stret
848 TrampolineEntry_stret
849 TrampolineEntry_stret
850 TrampolineEntry_stret
851 TrampolineEntry_stret
852 TrampolineEntry_stret
853 TrampolineEntry_stret
854 TrampolineEntry_stret
855 TrampolineEntry_stret
856 TrampolineEntry_stret
857 TrampolineEntry_stret
858 TrampolineEntry_stret
859 TrampolineEntry_stret
860 TrampolineEntry_stret
861 TrampolineEntry_stret
862 TrampolineEntry_stret
863 TrampolineEntry_stret
864 TrampolineEntry_stret
865 TrampolineEntry_stret
866 TrampolineEntry_stret
867 TrampolineEntry_stret
868 TrampolineEntry_stret
869 TrampolineEntry_stret
870 TrampolineEntry_stret
871 TrampolineEntry_stret
872 TrampolineEntry_stret
873 TrampolineEntry_stret
874 TrampolineEntry_stret
875 TrampolineEntry_stret
876 TrampolineEntry_stret
877 TrampolineEntry_stret
878 TrampolineEntry_stret
879 TrampolineEntry_stret
880 TrampolineEntry_stret
881 TrampolineEntry_stret
882 TrampolineEntry_stret
883 TrampolineEntry_stret
884 TrampolineEntry_stret
885 TrampolineEntry_stret
886 TrampolineEntry_stret
887 TrampolineEntry_stret
888 TrampolineEntry_stret
889 TrampolineEntry_stret
890 TrampolineEntry_stret
891 TrampolineEntry_stret
892 TrampolineEntry_stret
893 TrampolineEntry_stret
894 TrampolineEntry_stret
895 TrampolineEntry_stret
896 TrampolineEntry_stret
897 TrampolineEntry_stret
898 TrampolineEntry_stret
899 TrampolineEntry_stret
900 TrampolineEntry_stret
901 TrampolineEntry_stret
902 TrampolineEntry_stret
903 TrampolineEntry_stret
904 TrampolineEntry_stret
905 TrampolineEntry_stret
906 TrampolineEntry_stret
907 TrampolineEntry_stret
908 TrampolineEntry_stret
909 TrampolineEntry_stret
910 TrampolineEntry_stret
911 TrampolineEntry_stret
912 TrampolineEntry_stret
913 TrampolineEntry_stret
914 TrampolineEntry_stret
915 TrampolineEntry_stret
916 TrampolineEntry_stret
917 TrampolineEntry_stret
918 TrampolineEntry_stret
919 TrampolineEntry_stret
920 TrampolineEntry_stret
921 TrampolineEntry_stret
922 TrampolineEntry_stret
923 TrampolineEntry_stret
924 TrampolineEntry_stret
925 TrampolineEntry_stret
926 TrampolineEntry_stret
927 TrampolineEntry_stret
928 TrampolineEntry_stret
929 TrampolineEntry_stret
930 TrampolineEntry_stret
931 TrampolineEntry_stret
932 TrampolineEntry_stret
933 TrampolineEntry_stret
934 TrampolineEntry_stret
935 TrampolineEntry_stret
936 TrampolineEntry_stret
937 TrampolineEntry_stret
938 TrampolineEntry_stret
939 TrampolineEntry_stret
940 TrampolineEntry_stret
941 TrampolineEntry_stret
942 TrampolineEntry_stret
943 TrampolineEntry_stret
944 TrampolineEntry_stret
945 TrampolineEntry_stret
946 TrampolineEntry_stret
947 TrampolineEntry_stret
948 TrampolineEntry_stret
949 TrampolineEntry_stret
950 TrampolineEntry_stret
951 TrampolineEntry_stret
952 TrampolineEntry_stret
953 TrampolineEntry_stret
954 TrampolineEntry_stret
955 TrampolineEntry_stret
956 TrampolineEntry_stret
957 TrampolineEntry_stret
958 TrampolineEntry_stret
959 TrampolineEntry_stret
960 TrampolineEntry_stret
961 TrampolineEntry_stret
962 TrampolineEntry_stret
963 TrampolineEntry_stret
964 TrampolineEntry_stret
965 TrampolineEntry_stret
966 TrampolineEntry_stret
967 TrampolineEntry_stret
968 TrampolineEntry_stret
969 TrampolineEntry_stret
970 TrampolineEntry_stret
971 TrampolineEntry_stret
972 TrampolineEntry_stret
973 TrampolineEntry_stret
974 TrampolineEntry_stret
975 TrampolineEntry_stret
976 TrampolineEntry_stret
977 TrampolineEntry_stret
978 TrampolineEntry_stret
979 TrampolineEntry_stret
980 TrampolineEntry_stret
981 TrampolineEntry_stret
982 TrampolineEntry_stret
983 TrampolineEntry_stret
984 TrampolineEntry_stret
985 TrampolineEntry_stret
986 TrampolineEntry_stret
987 TrampolineEntry_stret
988 TrampolineEntry_stret
989 TrampolineEntry_stret
990 TrampolineEntry_stret
991 TrampolineEntry_stret
992 TrampolineEntry_stret
993 TrampolineEntry_stret
994 TrampolineEntry_stret
995 TrampolineEntry_stret
996 TrampolineEntry_stret
997 TrampolineEntry_stret
998 TrampolineEntry_stret
999 TrampolineEntry_stret
1000 TrampolineEntry_stret
1001 TrampolineEntry_stret
1002 TrampolineEntry_stret
1003 TrampolineEntry_stret
1004 TrampolineEntry_stret
1005 TrampolineEntry_stret
1006 TrampolineEntry_stret
1007 TrampolineEntry_stret
1008 TrampolineEntry_stret
1009 TrampolineEntry_stret
1010 TrampolineEntry_stret
1011 TrampolineEntry_stret
1012 TrampolineEntry_stret
1013 TrampolineEntry_stret
1014 TrampolineEntry_stret
1015 TrampolineEntry_stret
1016 TrampolineEntry_stret
1017 TrampolineEntry_stret
1018 TrampolineEntry_stret
1019 TrampolineEntry_stret
1020 TrampolineEntry_stret
1021 TrampolineEntry_stret
1022 TrampolineEntry_stret
1023 TrampolineEntry_stret
1024 TrampolineEntry_stret
1025 TrampolineEntry_stret
1026 TrampolineEntry_stret
1027 TrampolineEntry_stret
1028 TrampolineEntry_stret
1029 TrampolineEntry_stret
1030 TrampolineEntry_stret
1031 TrampolineEntry_stret
1032 TrampolineEntry_stret
1033 TrampolineEntry_stret
1034 TrampolineEntry_stret
1035 TrampolineEntry_stret
1036 TrampolineEntry_stret
1037 TrampolineEntry_stret
1038 TrampolineEntry_stret
1039 TrampolineEntry_stret
1040 TrampolineEntry_stret
1041 TrampolineEntry_stret
1042 TrampolineEntry_stret
1043 TrampolineEntry_stret
1044 TrampolineEntry_stret
1045 TrampolineEntry_stret
1046 TrampolineEntry_stret
1047 TrampolineEntry_stret
1048 TrampolineEntry_stret
1049 TrampolineEntry_stret
1050 TrampolineEntry_stret
1051 TrampolineEntry_stret
1052 TrampolineEntry_stret
1053 TrampolineEntry_stret
1054 TrampolineEntry_stret
1055 TrampolineEntry_stret
1056 TrampolineEntry_stret
1057 TrampolineEntry_stret
1058 TrampolineEntry_stret
1059 TrampolineEntry_stret
1060 TrampolineEntry_stret
1061 TrampolineEntry_stret
1062 TrampolineEntry_stret
1063 TrampolineEntry_stret
1064 TrampolineEntry_stret
1065 TrampolineEntry_stret
1066 TrampolineEntry_stret
1067 TrampolineEntry_stret
1068 TrampolineEntry_stret
1069 TrampolineEntry_stret
1070 TrampolineEntry_stret
1071 TrampolineEntry_stret
1072 TrampolineEntry_stret
1073 TrampolineEntry_stret
1074 TrampolineEntry_stret
1075 TrampolineEntry_stret
1076 TrampolineEntry_stret
1077 TrampolineEntry_stret
1078 TrampolineEntry_stret
1079 TrampolineEntry_stret
1080 TrampolineEntry_stret
1081 TrampolineEntry_stret
1082 TrampolineEntry_stret
1083 TrampolineEntry_stret
1084 TrampolineEntry_stret
1085 TrampolineEntry_stret
1086 TrampolineEntry_stret
1087 TrampolineEntry_stret
1088 TrampolineEntry_stret
1089 TrampolineEntry_stret
1090 TrampolineEntry_stret
1091 TrampolineEntry_stret
1092 TrampolineEntry_stret
1093 TrampolineEntry_stret
1094 TrampolineEntry_stret
1095 TrampolineEntry_stret
1096 TrampolineEntry_stret
1097 TrampolineEntry_stret
1098 TrampolineEntry_stret
1099 __objc_blockTrampolineLast_stret:
1100 TrampolineEntry_stret