golang.org/x/sys@v0.20.1-0.20240517151509-673e0f94c16d/unix/bpxsvc_zos.s (about)

     1  // Copyright 2024 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "go_asm.h"
     6  #include "textflag.h"
     7  
     8  // function to call USS assembly language services
     9  //
    10  // doc: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_3.1.0/com.ibm.zos.v3r1.bpxb100/bit64env.htm
    11  //
    12  //   arg1 unsafe.Pointer array that ressembles an OS PLIST
    13  //
    14  //   arg2 function offset as in
    15  //       doc: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_3.1.0/com.ibm.zos.v3r1.bpxb100/bpx2cr_List_of_offsets.htm
    16  //
    17  // func bpxcall(plist []unsafe.Pointer, bpx_offset int64)
    18  
    19  TEXT ·bpxcall(SB), NOSPLIT|NOFRAME, $0
    20  	MOVD  plist_base+0(FP), R1  // r1 points to plist
    21  	MOVD  bpx_offset+24(FP), R2 // r2 offset to BPX vector table
    22  	MOVD  R14, R7               // save r14
    23  	MOVD  R15, R8               // save r15
    24  	MOVWZ 16(R0), R9
    25  	MOVWZ 544(R9), R9
    26  	MOVWZ 24(R9), R9            // call vector in r9
    27  	ADD   R2, R9                // add offset to vector table
    28  	MOVWZ (R9), R9              // r9 points to entry point
    29  	BYTE  $0x0D                 // BL R14,R9 --> basr r14,r9
    30  	BYTE  $0xE9                 // clobbers 0,1,14,15
    31  	MOVD  R8, R15               // restore 15
    32  	JMP   R7                    // return via saved return address
    33  
    34  //   func A2e(arr [] byte)
    35  //   code page conversion from  819 to 1047
    36  TEXT ·A2e(SB), NOSPLIT|NOFRAME, $0
    37  	MOVD arg_base+0(FP), R2                        // pointer to arry of characters
    38  	MOVD arg_len+8(FP), R3                         // count
    39  	XOR  R0, R0
    40  	XOR  R1, R1
    41  	BYTE $0xA7; BYTE $0x15; BYTE $0x00; BYTE $0x82 // BRAS 1,(2+(256/2))
    42  
    43  	// ASCII -> EBCDIC conversion table:
    44  	BYTE $0x00; BYTE $0x01; BYTE $0x02; BYTE $0x03
    45  	BYTE $0x37; BYTE $0x2d; BYTE $0x2e; BYTE $0x2f
    46  	BYTE $0x16; BYTE $0x05; BYTE $0x15; BYTE $0x0b
    47  	BYTE $0x0c; BYTE $0x0d; BYTE $0x0e; BYTE $0x0f
    48  	BYTE $0x10; BYTE $0x11; BYTE $0x12; BYTE $0x13
    49  	BYTE $0x3c; BYTE $0x3d; BYTE $0x32; BYTE $0x26
    50  	BYTE $0x18; BYTE $0x19; BYTE $0x3f; BYTE $0x27
    51  	BYTE $0x1c; BYTE $0x1d; BYTE $0x1e; BYTE $0x1f
    52  	BYTE $0x40; BYTE $0x5a; BYTE $0x7f; BYTE $0x7b
    53  	BYTE $0x5b; BYTE $0x6c; BYTE $0x50; BYTE $0x7d
    54  	BYTE $0x4d; BYTE $0x5d; BYTE $0x5c; BYTE $0x4e
    55  	BYTE $0x6b; BYTE $0x60; BYTE $0x4b; BYTE $0x61
    56  	BYTE $0xf0; BYTE $0xf1; BYTE $0xf2; BYTE $0xf3
    57  	BYTE $0xf4; BYTE $0xf5; BYTE $0xf6; BYTE $0xf7
    58  	BYTE $0xf8; BYTE $0xf9; BYTE $0x7a; BYTE $0x5e
    59  	BYTE $0x4c; BYTE $0x7e; BYTE $0x6e; BYTE $0x6f
    60  	BYTE $0x7c; BYTE $0xc1; BYTE $0xc2; BYTE $0xc3
    61  	BYTE $0xc4; BYTE $0xc5; BYTE $0xc6; BYTE $0xc7
    62  	BYTE $0xc8; BYTE $0xc9; BYTE $0xd1; BYTE $0xd2
    63  	BYTE $0xd3; BYTE $0xd4; BYTE $0xd5; BYTE $0xd6
    64  	BYTE $0xd7; BYTE $0xd8; BYTE $0xd9; BYTE $0xe2
    65  	BYTE $0xe3; BYTE $0xe4; BYTE $0xe5; BYTE $0xe6
    66  	BYTE $0xe7; BYTE $0xe8; BYTE $0xe9; BYTE $0xad
    67  	BYTE $0xe0; BYTE $0xbd; BYTE $0x5f; BYTE $0x6d
    68  	BYTE $0x79; BYTE $0x81; BYTE $0x82; BYTE $0x83
    69  	BYTE $0x84; BYTE $0x85; BYTE $0x86; BYTE $0x87
    70  	BYTE $0x88; BYTE $0x89; BYTE $0x91; BYTE $0x92
    71  	BYTE $0x93; BYTE $0x94; BYTE $0x95; BYTE $0x96
    72  	BYTE $0x97; BYTE $0x98; BYTE $0x99; BYTE $0xa2
    73  	BYTE $0xa3; BYTE $0xa4; BYTE $0xa5; BYTE $0xa6
    74  	BYTE $0xa7; BYTE $0xa8; BYTE $0xa9; BYTE $0xc0
    75  	BYTE $0x4f; BYTE $0xd0; BYTE $0xa1; BYTE $0x07
    76  	BYTE $0x20; BYTE $0x21; BYTE $0x22; BYTE $0x23
    77  	BYTE $0x24; BYTE $0x25; BYTE $0x06; BYTE $0x17
    78  	BYTE $0x28; BYTE $0x29; BYTE $0x2a; BYTE $0x2b
    79  	BYTE $0x2c; BYTE $0x09; BYTE $0x0a; BYTE $0x1b
    80  	BYTE $0x30; BYTE $0x31; BYTE $0x1a; BYTE $0x33
    81  	BYTE $0x34; BYTE $0x35; BYTE $0x36; BYTE $0x08
    82  	BYTE $0x38; BYTE $0x39; BYTE $0x3a; BYTE $0x3b
    83  	BYTE $0x04; BYTE $0x14; BYTE $0x3e; BYTE $0xff
    84  	BYTE $0x41; BYTE $0xaa; BYTE $0x4a; BYTE $0xb1
    85  	BYTE $0x9f; BYTE $0xb2; BYTE $0x6a; BYTE $0xb5
    86  	BYTE $0xbb; BYTE $0xb4; BYTE $0x9a; BYTE $0x8a
    87  	BYTE $0xb0; BYTE $0xca; BYTE $0xaf; BYTE $0xbc
    88  	BYTE $0x90; BYTE $0x8f; BYTE $0xea; BYTE $0xfa
    89  	BYTE $0xbe; BYTE $0xa0; BYTE $0xb6; BYTE $0xb3
    90  	BYTE $0x9d; BYTE $0xda; BYTE $0x9b; BYTE $0x8b
    91  	BYTE $0xb7; BYTE $0xb8; BYTE $0xb9; BYTE $0xab
    92  	BYTE $0x64; BYTE $0x65; BYTE $0x62; BYTE $0x66
    93  	BYTE $0x63; BYTE $0x67; BYTE $0x9e; BYTE $0x68
    94  	BYTE $0x74; BYTE $0x71; BYTE $0x72; BYTE $0x73
    95  	BYTE $0x78; BYTE $0x75; BYTE $0x76; BYTE $0x77
    96  	BYTE $0xac; BYTE $0x69; BYTE $0xed; BYTE $0xee
    97  	BYTE $0xeb; BYTE $0xef; BYTE $0xec; BYTE $0xbf
    98  	BYTE $0x80; BYTE $0xfd; BYTE $0xfe; BYTE $0xfb
    99  	BYTE $0xfc; BYTE $0xba; BYTE $0xae; BYTE $0x59
   100  	BYTE $0x44; BYTE $0x45; BYTE $0x42; BYTE $0x46
   101  	BYTE $0x43; BYTE $0x47; BYTE $0x9c; BYTE $0x48
   102  	BYTE $0x54; BYTE $0x51; BYTE $0x52; BYTE $0x53
   103  	BYTE $0x58; BYTE $0x55; BYTE $0x56; BYTE $0x57
   104  	BYTE $0x8c; BYTE $0x49; BYTE $0xcd; BYTE $0xce
   105  	BYTE $0xcb; BYTE $0xcf; BYTE $0xcc; BYTE $0xe1
   106  	BYTE $0x70; BYTE $0xdd; BYTE $0xde; BYTE $0xdb
   107  	BYTE $0xdc; BYTE $0x8d; BYTE $0x8e; BYTE $0xdf
   108  
   109  retry:
   110  	WORD $0xB9931022 // TROO 2,2,b'0001'
   111  	BVS  retry
   112  	RET
   113  
   114  //   func e2a(arr [] byte)
   115  //   code page conversion from  1047 to 819
   116  TEXT ·E2a(SB), NOSPLIT|NOFRAME, $0
   117  	MOVD arg_base+0(FP), R2                        // pointer to arry of characters
   118  	MOVD arg_len+8(FP), R3                         // count
   119  	XOR  R0, R0
   120  	XOR  R1, R1
   121  	BYTE $0xA7; BYTE $0x15; BYTE $0x00; BYTE $0x82 // BRAS 1,(2+(256/2))
   122  
   123  	// EBCDIC -> ASCII conversion table:
   124  	BYTE $0x00; BYTE $0x01; BYTE $0x02; BYTE $0x03
   125  	BYTE $0x9c; BYTE $0x09; BYTE $0x86; BYTE $0x7f
   126  	BYTE $0x97; BYTE $0x8d; BYTE $0x8e; BYTE $0x0b
   127  	BYTE $0x0c; BYTE $0x0d; BYTE $0x0e; BYTE $0x0f
   128  	BYTE $0x10; BYTE $0x11; BYTE $0x12; BYTE $0x13
   129  	BYTE $0x9d; BYTE $0x0a; BYTE $0x08; BYTE $0x87
   130  	BYTE $0x18; BYTE $0x19; BYTE $0x92; BYTE $0x8f
   131  	BYTE $0x1c; BYTE $0x1d; BYTE $0x1e; BYTE $0x1f
   132  	BYTE $0x80; BYTE $0x81; BYTE $0x82; BYTE $0x83
   133  	BYTE $0x84; BYTE $0x85; BYTE $0x17; BYTE $0x1b
   134  	BYTE $0x88; BYTE $0x89; BYTE $0x8a; BYTE $0x8b
   135  	BYTE $0x8c; BYTE $0x05; BYTE $0x06; BYTE $0x07
   136  	BYTE $0x90; BYTE $0x91; BYTE $0x16; BYTE $0x93
   137  	BYTE $0x94; BYTE $0x95; BYTE $0x96; BYTE $0x04
   138  	BYTE $0x98; BYTE $0x99; BYTE $0x9a; BYTE $0x9b
   139  	BYTE $0x14; BYTE $0x15; BYTE $0x9e; BYTE $0x1a
   140  	BYTE $0x20; BYTE $0xa0; BYTE $0xe2; BYTE $0xe4
   141  	BYTE $0xe0; BYTE $0xe1; BYTE $0xe3; BYTE $0xe5
   142  	BYTE $0xe7; BYTE $0xf1; BYTE $0xa2; BYTE $0x2e
   143  	BYTE $0x3c; BYTE $0x28; BYTE $0x2b; BYTE $0x7c
   144  	BYTE $0x26; BYTE $0xe9; BYTE $0xea; BYTE $0xeb
   145  	BYTE $0xe8; BYTE $0xed; BYTE $0xee; BYTE $0xef
   146  	BYTE $0xec; BYTE $0xdf; BYTE $0x21; BYTE $0x24
   147  	BYTE $0x2a; BYTE $0x29; BYTE $0x3b; BYTE $0x5e
   148  	BYTE $0x2d; BYTE $0x2f; BYTE $0xc2; BYTE $0xc4
   149  	BYTE $0xc0; BYTE $0xc1; BYTE $0xc3; BYTE $0xc5
   150  	BYTE $0xc7; BYTE $0xd1; BYTE $0xa6; BYTE $0x2c
   151  	BYTE $0x25; BYTE $0x5f; BYTE $0x3e; BYTE $0x3f
   152  	BYTE $0xf8; BYTE $0xc9; BYTE $0xca; BYTE $0xcb
   153  	BYTE $0xc8; BYTE $0xcd; BYTE $0xce; BYTE $0xcf
   154  	BYTE $0xcc; BYTE $0x60; BYTE $0x3a; BYTE $0x23
   155  	BYTE $0x40; BYTE $0x27; BYTE $0x3d; BYTE $0x22
   156  	BYTE $0xd8; BYTE $0x61; BYTE $0x62; BYTE $0x63
   157  	BYTE $0x64; BYTE $0x65; BYTE $0x66; BYTE $0x67
   158  	BYTE $0x68; BYTE $0x69; BYTE $0xab; BYTE $0xbb
   159  	BYTE $0xf0; BYTE $0xfd; BYTE $0xfe; BYTE $0xb1
   160  	BYTE $0xb0; BYTE $0x6a; BYTE $0x6b; BYTE $0x6c
   161  	BYTE $0x6d; BYTE $0x6e; BYTE $0x6f; BYTE $0x70
   162  	BYTE $0x71; BYTE $0x72; BYTE $0xaa; BYTE $0xba
   163  	BYTE $0xe6; BYTE $0xb8; BYTE $0xc6; BYTE $0xa4
   164  	BYTE $0xb5; BYTE $0x7e; BYTE $0x73; BYTE $0x74
   165  	BYTE $0x75; BYTE $0x76; BYTE $0x77; BYTE $0x78
   166  	BYTE $0x79; BYTE $0x7a; BYTE $0xa1; BYTE $0xbf
   167  	BYTE $0xd0; BYTE $0x5b; BYTE $0xde; BYTE $0xae
   168  	BYTE $0xac; BYTE $0xa3; BYTE $0xa5; BYTE $0xb7
   169  	BYTE $0xa9; BYTE $0xa7; BYTE $0xb6; BYTE $0xbc
   170  	BYTE $0xbd; BYTE $0xbe; BYTE $0xdd; BYTE $0xa8
   171  	BYTE $0xaf; BYTE $0x5d; BYTE $0xb4; BYTE $0xd7
   172  	BYTE $0x7b; BYTE $0x41; BYTE $0x42; BYTE $0x43
   173  	BYTE $0x44; BYTE $0x45; BYTE $0x46; BYTE $0x47
   174  	BYTE $0x48; BYTE $0x49; BYTE $0xad; BYTE $0xf4
   175  	BYTE $0xf6; BYTE $0xf2; BYTE $0xf3; BYTE $0xf5
   176  	BYTE $0x7d; BYTE $0x4a; BYTE $0x4b; BYTE $0x4c
   177  	BYTE $0x4d; BYTE $0x4e; BYTE $0x4f; BYTE $0x50
   178  	BYTE $0x51; BYTE $0x52; BYTE $0xb9; BYTE $0xfb
   179  	BYTE $0xfc; BYTE $0xf9; BYTE $0xfa; BYTE $0xff
   180  	BYTE $0x5c; BYTE $0xf7; BYTE $0x53; BYTE $0x54
   181  	BYTE $0x55; BYTE $0x56; BYTE $0x57; BYTE $0x58
   182  	BYTE $0x59; BYTE $0x5a; BYTE $0xb2; BYTE $0xd4
   183  	BYTE $0xd6; BYTE $0xd2; BYTE $0xd3; BYTE $0xd5
   184  	BYTE $0x30; BYTE $0x31; BYTE $0x32; BYTE $0x33
   185  	BYTE $0x34; BYTE $0x35; BYTE $0x36; BYTE $0x37
   186  	BYTE $0x38; BYTE $0x39; BYTE $0xb3; BYTE $0xdb
   187  	BYTE $0xdc; BYTE $0xd9; BYTE $0xda; BYTE $0x9f
   188  
   189  retry:
   190  	WORD $0xB9931022 // TROO 2,2,b'0001'
   191  	BVS  retry
   192  	RET