src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

bpxsvc_zos.go (20419B)


      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 //go:build zos
      6 
      7 package unix
      8 
      9 import (
     10 	"bytes"
     11 	"fmt"
     12 	"unsafe"
     13 )
     14 
     15 //go:noescape
     16 func bpxcall(plist []unsafe.Pointer, bpx_offset int64)
     17 
     18 //go:noescape
     19 func A2e([]byte)
     20 
     21 //go:noescape
     22 func E2a([]byte)
     23 
     24 const (
     25 	BPX4STA = 192  // stat
     26 	BPX4FST = 104  // fstat
     27 	BPX4LST = 132  // lstat
     28 	BPX4OPN = 156  // open
     29 	BPX4CLO = 72   // close
     30 	BPX4CHR = 500  // chattr
     31 	BPX4FCR = 504  // fchattr
     32 	BPX4LCR = 1180 // lchattr
     33 	BPX4CTW = 492  // cond_timed_wait
     34 	BPX4GTH = 1056 // __getthent
     35 	BPX4PTQ = 412  // pthread_quiesc
     36 	BPX4PTR = 320  // ptrace
     37 )
     38 
     39 const (
     40 	//options
     41 	//byte1
     42 	BPX_OPNFHIGH = 0x80
     43 	//byte2
     44 	BPX_OPNFEXEC = 0x80
     45 	//byte3
     46 	BPX_O_NOLARGEFILE = 0x08
     47 	BPX_O_LARGEFILE   = 0x04
     48 	BPX_O_ASYNCSIG    = 0x02
     49 	BPX_O_SYNC        = 0x01
     50 	//byte4
     51 	BPX_O_CREXCL   = 0xc0
     52 	BPX_O_CREAT    = 0x80
     53 	BPX_O_EXCL     = 0x40
     54 	BPX_O_NOCTTY   = 0x20
     55 	BPX_O_TRUNC    = 0x10
     56 	BPX_O_APPEND   = 0x08
     57 	BPX_O_NONBLOCK = 0x04
     58 	BPX_FNDELAY    = 0x04
     59 	BPX_O_RDWR     = 0x03
     60 	BPX_O_RDONLY   = 0x02
     61 	BPX_O_WRONLY   = 0x01
     62 	BPX_O_ACCMODE  = 0x03
     63 	BPX_O_GETFL    = 0x0f
     64 
     65 	//mode
     66 	// byte1 (file type)
     67 	BPX_FT_DIR      = 1
     68 	BPX_FT_CHARSPEC = 2
     69 	BPX_FT_REGFILE  = 3
     70 	BPX_FT_FIFO     = 4
     71 	BPX_FT_SYMLINK  = 5
     72 	BPX_FT_SOCKET   = 6
     73 	//byte3
     74 	BPX_S_ISUID  = 0x08
     75 	BPX_S_ISGID  = 0x04
     76 	BPX_S_ISVTX  = 0x02
     77 	BPX_S_IRWXU1 = 0x01
     78 	BPX_S_IRUSR  = 0x01
     79 	//byte4
     80 	BPX_S_IRWXU2 = 0xc0
     81 	BPX_S_IWUSR  = 0x80
     82 	BPX_S_IXUSR  = 0x40
     83 	BPX_S_IRWXG  = 0x38
     84 	BPX_S_IRGRP  = 0x20
     85 	BPX_S_IWGRP  = 0x10
     86 	BPX_S_IXGRP  = 0x08
     87 	BPX_S_IRWXOX = 0x07
     88 	BPX_S_IROTH  = 0x04
     89 	BPX_S_IWOTH  = 0x02
     90 	BPX_S_IXOTH  = 0x01
     91 
     92 	CW_INTRPT  = 1
     93 	CW_CONDVAR = 32
     94 	CW_TIMEOUT = 64
     95 
     96 	PGTHA_NEXT        = 2
     97 	PGTHA_CURRENT     = 1
     98 	PGTHA_FIRST       = 0
     99 	PGTHA_LAST        = 3
    100 	PGTHA_PROCESS     = 0x80
    101 	PGTHA_CONTTY      = 0x40
    102 	PGTHA_PATH        = 0x20
    103 	PGTHA_COMMAND     = 0x10
    104 	PGTHA_FILEDATA    = 0x08
    105 	PGTHA_THREAD      = 0x04
    106 	PGTHA_PTAG        = 0x02
    107 	PGTHA_COMMANDLONG = 0x01
    108 	PGTHA_THREADFAST  = 0x80
    109 	PGTHA_FILEPATH    = 0x40
    110 	PGTHA_THDSIGMASK  = 0x20
    111 	// thread quiece mode
    112 	QUIESCE_TERM       int32 = 1
    113 	QUIESCE_FORCE      int32 = 2
    114 	QUIESCE_QUERY      int32 = 3
    115 	QUIESCE_FREEZE     int32 = 4
    116 	QUIESCE_UNFREEZE   int32 = 5
    117 	FREEZE_THIS_THREAD int32 = 6
    118 	FREEZE_EXIT        int32 = 8
    119 	QUIESCE_SRB        int32 = 9
    120 )
    121 
    122 type Pgtha struct {
    123 	Pid        uint32 // 0
    124 	Tid0       uint32 // 4
    125 	Tid1       uint32
    126 	Accesspid  byte    // C
    127 	Accesstid  byte    // D
    128 	Accessasid uint16  // E
    129 	Loginname  [8]byte // 10
    130 	Flag1      byte    // 18
    131 	Flag1b2    byte    // 19
    132 }
    133 
    134 type Bpxystat_t struct { // DSECT BPXYSTAT
    135 	St_id           [4]uint8  // 0
    136 	St_length       uint16    // 0x4
    137 	St_version      uint16    // 0x6
    138 	St_mode         uint32    // 0x8
    139 	St_ino          uint32    // 0xc
    140 	St_dev          uint32    // 0x10
    141 	St_nlink        uint32    // 0x14
    142 	St_uid          uint32    // 0x18
    143 	St_gid          uint32    // 0x1c
    144 	St_size         uint64    // 0x20
    145 	St_atime        uint32    // 0x28
    146 	St_mtime        uint32    // 0x2c
    147 	St_ctime        uint32    // 0x30
    148 	St_rdev         uint32    // 0x34
    149 	St_auditoraudit uint32    // 0x38
    150 	St_useraudit    uint32    // 0x3c
    151 	St_blksize      uint32    // 0x40
    152 	St_createtime   uint32    // 0x44
    153 	St_auditid      [4]uint32 // 0x48
    154 	St_res01        uint32    // 0x58
    155 	Ft_ccsid        uint16    // 0x5c
    156 	Ft_flags        uint16    // 0x5e
    157 	St_res01a       [2]uint32 // 0x60
    158 	St_res02        uint32    // 0x68
    159 	St_blocks       uint32    // 0x6c
    160 	St_opaque       [3]uint8  // 0x70
    161 	St_visible      uint8     // 0x73
    162 	St_reftime      uint32    // 0x74
    163 	St_fid          uint64    // 0x78
    164 	St_filefmt      uint8     // 0x80
    165 	St_fspflag2     uint8     // 0x81
    166 	St_res03        [2]uint8  // 0x82
    167 	St_ctimemsec    uint32    // 0x84
    168 	St_seclabel     [8]uint8  // 0x88
    169 	St_res04        [4]uint8  // 0x90
    170 	// end of version 1
    171 	_               uint32    // 0x94
    172 	St_atime64      uint64    // 0x98
    173 	St_mtime64      uint64    // 0xa0
    174 	St_ctime64      uint64    // 0xa8
    175 	St_createtime64 uint64    // 0xb0
    176 	St_reftime64    uint64    // 0xb8
    177 	_               uint64    // 0xc0
    178 	St_res05        [16]uint8 // 0xc8
    179 	// end of version 2
    180 }
    181 
    182 type BpxFilestatus struct {
    183 	Oflag1 byte
    184 	Oflag2 byte
    185 	Oflag3 byte
    186 	Oflag4 byte
    187 }
    188 
    189 type BpxMode struct {
    190 	Ftype byte
    191 	Mode1 byte
    192 	Mode2 byte
    193 	Mode3 byte
    194 }
    195 
    196 // Thr attribute structure for extended attributes
    197 type Bpxyatt_t struct { // DSECT BPXYATT
    198 	Att_id           [4]uint8
    199 	Att_version      uint16
    200 	Att_res01        [2]uint8
    201 	Att_setflags1    uint8
    202 	Att_setflags2    uint8
    203 	Att_setflags3    uint8
    204 	Att_setflags4    uint8
    205 	Att_mode         uint32
    206 	Att_uid          uint32
    207 	Att_gid          uint32
    208 	Att_opaquemask   [3]uint8
    209 	Att_visblmaskres uint8
    210 	Att_opaque       [3]uint8
    211 	Att_visibleres   uint8
    212 	Att_size_h       uint32
    213 	Att_size_l       uint32
    214 	Att_atime        uint32
    215 	Att_mtime        uint32
    216 	Att_auditoraudit uint32
    217 	Att_useraudit    uint32
    218 	Att_ctime        uint32
    219 	Att_reftime      uint32
    220 	// end of version 1
    221 	Att_filefmt uint8
    222 	Att_res02   [3]uint8
    223 	Att_filetag uint32
    224 	Att_res03   [8]uint8
    225 	// end of version 2
    226 	Att_atime64   uint64
    227 	Att_mtime64   uint64
    228 	Att_ctime64   uint64
    229 	Att_reftime64 uint64
    230 	Att_seclabel  [8]uint8
    231 	Att_ver3res02 [8]uint8
    232 	// end of version 3
    233 }
    234 
    235 func BpxOpen(name string, options *BpxFilestatus, mode *BpxMode) (rv int32, rc int32, rn int32) {
    236 	if len(name) < 1024 {
    237 		var namebuf [1024]byte
    238 		sz := int32(copy(namebuf[:], name))
    239 		A2e(namebuf[:sz])
    240 		var parms [7]unsafe.Pointer
    241 		parms[0] = unsafe.Pointer(&sz)
    242 		parms[1] = unsafe.Pointer(&namebuf[0])
    243 		parms[2] = unsafe.Pointer(options)
    244 		parms[3] = unsafe.Pointer(mode)
    245 		parms[4] = unsafe.Pointer(&rv)
    246 		parms[5] = unsafe.Pointer(&rc)
    247 		parms[6] = unsafe.Pointer(&rn)
    248 		bpxcall(parms[:], BPX4OPN)
    249 		return rv, rc, rn
    250 	}
    251 	return -1, -1, -1
    252 }
    253 
    254 func BpxClose(fd int32) (rv int32, rc int32, rn int32) {
    255 	var parms [4]unsafe.Pointer
    256 	parms[0] = unsafe.Pointer(&fd)
    257 	parms[1] = unsafe.Pointer(&rv)
    258 	parms[2] = unsafe.Pointer(&rc)
    259 	parms[3] = unsafe.Pointer(&rn)
    260 	bpxcall(parms[:], BPX4CLO)
    261 	return rv, rc, rn
    262 }
    263 
    264 func BpxFileFStat(fd int32, st *Bpxystat_t) (rv int32, rc int32, rn int32) {
    265 	st.St_id = [4]uint8{0xe2, 0xe3, 0xc1, 0xe3}
    266 	st.St_version = 2
    267 	stat_sz := uint32(unsafe.Sizeof(*st))
    268 	var parms [6]unsafe.Pointer
    269 	parms[0] = unsafe.Pointer(&fd)
    270 	parms[1] = unsafe.Pointer(&stat_sz)
    271 	parms[2] = unsafe.Pointer(st)
    272 	parms[3] = unsafe.Pointer(&rv)
    273 	parms[4] = unsafe.Pointer(&rc)
    274 	parms[5] = unsafe.Pointer(&rn)
    275 	bpxcall(parms[:], BPX4FST)
    276 	return rv, rc, rn
    277 }
    278 
    279 func BpxFileStat(name string, st *Bpxystat_t) (rv int32, rc int32, rn int32) {
    280 	if len(name) < 1024 {
    281 		var namebuf [1024]byte
    282 		sz := int32(copy(namebuf[:], name))
    283 		A2e(namebuf[:sz])
    284 		st.St_id = [4]uint8{0xe2, 0xe3, 0xc1, 0xe3}
    285 		st.St_version = 2
    286 		stat_sz := uint32(unsafe.Sizeof(*st))
    287 		var parms [7]unsafe.Pointer
    288 		parms[0] = unsafe.Pointer(&sz)
    289 		parms[1] = unsafe.Pointer(&namebuf[0])
    290 		parms[2] = unsafe.Pointer(&stat_sz)
    291 		parms[3] = unsafe.Pointer(st)
    292 		parms[4] = unsafe.Pointer(&rv)
    293 		parms[5] = unsafe.Pointer(&rc)
    294 		parms[6] = unsafe.Pointer(&rn)
    295 		bpxcall(parms[:], BPX4STA)
    296 		return rv, rc, rn
    297 	}
    298 	return -1, -1, -1
    299 }
    300 
    301 func BpxFileLStat(name string, st *Bpxystat_t) (rv int32, rc int32, rn int32) {
    302 	if len(name) < 1024 {
    303 		var namebuf [1024]byte
    304 		sz := int32(copy(namebuf[:], name))
    305 		A2e(namebuf[:sz])
    306 		st.St_id = [4]uint8{0xe2, 0xe3, 0xc1, 0xe3}
    307 		st.St_version = 2
    308 		stat_sz := uint32(unsafe.Sizeof(*st))
    309 		var parms [7]unsafe.Pointer
    310 		parms[0] = unsafe.Pointer(&sz)
    311 		parms[1] = unsafe.Pointer(&namebuf[0])
    312 		parms[2] = unsafe.Pointer(&stat_sz)
    313 		parms[3] = unsafe.Pointer(st)
    314 		parms[4] = unsafe.Pointer(&rv)
    315 		parms[5] = unsafe.Pointer(&rc)
    316 		parms[6] = unsafe.Pointer(&rn)
    317 		bpxcall(parms[:], BPX4LST)
    318 		return rv, rc, rn
    319 	}
    320 	return -1, -1, -1
    321 }
    322 
    323 func BpxChattr(path string, attr *Bpxyatt_t) (rv int32, rc int32, rn int32) {
    324 	if len(path) >= 1024 {
    325 		return -1, -1, -1
    326 	}
    327 	var namebuf [1024]byte
    328 	sz := int32(copy(namebuf[:], path))
    329 	A2e(namebuf[:sz])
    330 	attr_sz := uint32(unsafe.Sizeof(*attr))
    331 	var parms [7]unsafe.Pointer
    332 	parms[0] = unsafe.Pointer(&sz)
    333 	parms[1] = unsafe.Pointer(&namebuf[0])
    334 	parms[2] = unsafe.Pointer(&attr_sz)
    335 	parms[3] = unsafe.Pointer(attr)
    336 	parms[4] = unsafe.Pointer(&rv)
    337 	parms[5] = unsafe.Pointer(&rc)
    338 	parms[6] = unsafe.Pointer(&rn)
    339 	bpxcall(parms[:], BPX4CHR)
    340 	return rv, rc, rn
    341 }
    342 
    343 func BpxLchattr(path string, attr *Bpxyatt_t) (rv int32, rc int32, rn int32) {
    344 	if len(path) >= 1024 {
    345 		return -1, -1, -1
    346 	}
    347 	var namebuf [1024]byte
    348 	sz := int32(copy(namebuf[:], path))
    349 	A2e(namebuf[:sz])
    350 	attr_sz := uint32(unsafe.Sizeof(*attr))
    351 	var parms [7]unsafe.Pointer
    352 	parms[0] = unsafe.Pointer(&sz)
    353 	parms[1] = unsafe.Pointer(&namebuf[0])
    354 	parms[2] = unsafe.Pointer(&attr_sz)
    355 	parms[3] = unsafe.Pointer(attr)
    356 	parms[4] = unsafe.Pointer(&rv)
    357 	parms[5] = unsafe.Pointer(&rc)
    358 	parms[6] = unsafe.Pointer(&rn)
    359 	bpxcall(parms[:], BPX4LCR)
    360 	return rv, rc, rn
    361 }
    362 
    363 func BpxFchattr(fd int32, attr *Bpxyatt_t) (rv int32, rc int32, rn int32) {
    364 	attr_sz := uint32(unsafe.Sizeof(*attr))
    365 	var parms [6]unsafe.Pointer
    366 	parms[0] = unsafe.Pointer(&fd)
    367 	parms[1] = unsafe.Pointer(&attr_sz)
    368 	parms[2] = unsafe.Pointer(attr)
    369 	parms[3] = unsafe.Pointer(&rv)
    370 	parms[4] = unsafe.Pointer(&rc)
    371 	parms[5] = unsafe.Pointer(&rn)
    372 	bpxcall(parms[:], BPX4FCR)
    373 	return rv, rc, rn
    374 }
    375 
    376 func BpxCondTimedWait(sec uint32, nsec uint32, events uint32, secrem *uint32, nsecrem *uint32) (rv int32, rc int32, rn int32) {
    377 	var parms [8]unsafe.Pointer
    378 	parms[0] = unsafe.Pointer(&sec)
    379 	parms[1] = unsafe.Pointer(&nsec)
    380 	parms[2] = unsafe.Pointer(&events)
    381 	parms[3] = unsafe.Pointer(secrem)
    382 	parms[4] = unsafe.Pointer(nsecrem)
    383 	parms[5] = unsafe.Pointer(&rv)
    384 	parms[6] = unsafe.Pointer(&rc)
    385 	parms[7] = unsafe.Pointer(&rn)
    386 	bpxcall(parms[:], BPX4CTW)
    387 	return rv, rc, rn
    388 }
    389 func BpxGetthent(in *Pgtha, outlen *uint32, out unsafe.Pointer) (rv int32, rc int32, rn int32) {
    390 	var parms [7]unsafe.Pointer
    391 	inlen := uint32(26) // nothing else will work. Go says Pgtha is 28-byte because of alignment, but Pgtha is "packed" and must be 26-byte
    392 	parms[0] = unsafe.Pointer(&inlen)
    393 	parms[1] = unsafe.Pointer(&in)
    394 	parms[2] = unsafe.Pointer(outlen)
    395 	parms[3] = unsafe.Pointer(&out)
    396 	parms[4] = unsafe.Pointer(&rv)
    397 	parms[5] = unsafe.Pointer(&rc)
    398 	parms[6] = unsafe.Pointer(&rn)
    399 	bpxcall(parms[:], BPX4GTH)
    400 	return rv, rc, rn
    401 }
    402 func ZosJobname() (jobname string, err error) {
    403 	var pgtha Pgtha
    404 	pgtha.Pid = uint32(Getpid())
    405 	pgtha.Accesspid = PGTHA_CURRENT
    406 	pgtha.Flag1 = PGTHA_PROCESS
    407 	var out [256]byte
    408 	var outlen uint32
    409 	outlen = 256
    410 	rv, rc, rn := BpxGetthent(&pgtha, &outlen, unsafe.Pointer(&out[0]))
    411 	if rv == 0 {
    412 		gthc := []byte{0x87, 0xa3, 0x88, 0x83} // 'gthc' in ebcdic
    413 		ix := bytes.Index(out[:], gthc)
    414 		if ix == -1 {
    415 			err = fmt.Errorf("BPX4GTH: gthc return data not found")
    416 			return
    417 		}
    418 		jn := out[ix+80 : ix+88] // we didn't declare Pgthc, but jobname is 8-byte at offset 80
    419 		E2a(jn)
    420 		jobname = string(bytes.TrimRight(jn, " "))
    421 
    422 	} else {
    423 		err = fmt.Errorf("BPX4GTH: rc=%d errno=%d reason=code=0x%x", rv, rc, rn)
    424 	}
    425 	return
    426 }
    427 func Bpx4ptq(code int32, data string) (rv int32, rc int32, rn int32) {
    428 	var userdata [8]byte
    429 	var parms [5]unsafe.Pointer
    430 	copy(userdata[:], data+"        ")
    431 	A2e(userdata[:])
    432 	parms[0] = unsafe.Pointer(&code)
    433 	parms[1] = unsafe.Pointer(&userdata[0])
    434 	parms[2] = unsafe.Pointer(&rv)
    435 	parms[3] = unsafe.Pointer(&rc)
    436 	parms[4] = unsafe.Pointer(&rn)
    437 	bpxcall(parms[:], BPX4PTQ)
    438 	return rv, rc, rn
    439 }
    440 
    441 const (
    442 	PT_TRACE_ME             = 0  // Debug this process
    443 	PT_READ_I               = 1  // Read a full word
    444 	PT_READ_D               = 2  // Read a full word
    445 	PT_READ_U               = 3  // Read control info
    446 	PT_WRITE_I              = 4  //Write a full word
    447 	PT_WRITE_D              = 5  //Write a full word
    448 	PT_CONTINUE             = 7  //Continue the process
    449 	PT_KILL                 = 8  //Terminate the process
    450 	PT_READ_GPR             = 11 // Read GPR, CR, PSW
    451 	PT_READ_FPR             = 12 // Read FPR
    452 	PT_READ_VR              = 13 // Read VR
    453 	PT_WRITE_GPR            = 14 // Write GPR, CR, PSW
    454 	PT_WRITE_FPR            = 15 // Write FPR
    455 	PT_WRITE_VR             = 16 // Write VR
    456 	PT_READ_BLOCK           = 17 // Read storage
    457 	PT_WRITE_BLOCK          = 19 // Write storage
    458 	PT_READ_GPRH            = 20 // Read GPRH
    459 	PT_WRITE_GPRH           = 21 // Write GPRH
    460 	PT_REGHSET              = 22 // Read all GPRHs
    461 	PT_ATTACH               = 30 // Attach to a process
    462 	PT_DETACH               = 31 // Detach from a process
    463 	PT_REGSET               = 32 // Read all GPRs
    464 	PT_REATTACH             = 33 // Reattach to a process
    465 	PT_LDINFO               = 34 // Read loader info
    466 	PT_MULTI                = 35 // Multi process mode
    467 	PT_LD64INFO             = 36 // RMODE64 Info Area
    468 	PT_BLOCKREQ             = 40 // Block request
    469 	PT_THREAD_INFO          = 60 // Read thread info
    470 	PT_THREAD_MODIFY        = 61
    471 	PT_THREAD_READ_FOCUS    = 62
    472 	PT_THREAD_WRITE_FOCUS   = 63
    473 	PT_THREAD_HOLD          = 64
    474 	PT_THREAD_SIGNAL        = 65
    475 	PT_EXPLAIN              = 66
    476 	PT_EVENTS               = 67
    477 	PT_THREAD_INFO_EXTENDED = 68
    478 	PT_REATTACH2            = 71
    479 	PT_CAPTURE              = 72
    480 	PT_UNCAPTURE            = 73
    481 	PT_GET_THREAD_TCB       = 74
    482 	PT_GET_ALET             = 75
    483 	PT_SWAPIN               = 76
    484 	PT_EXTENDED_EVENT       = 98
    485 	PT_RECOVER              = 99  // Debug a program check
    486 	PT_GPR0                 = 0   // General purpose register 0
    487 	PT_GPR1                 = 1   // General purpose register 1
    488 	PT_GPR2                 = 2   // General purpose register 2
    489 	PT_GPR3                 = 3   // General purpose register 3
    490 	PT_GPR4                 = 4   // General purpose register 4
    491 	PT_GPR5                 = 5   // General purpose register 5
    492 	PT_GPR6                 = 6   // General purpose register 6
    493 	PT_GPR7                 = 7   // General purpose register 7
    494 	PT_GPR8                 = 8   // General purpose register 8
    495 	PT_GPR9                 = 9   // General purpose register 9
    496 	PT_GPR10                = 10  // General purpose register 10
    497 	PT_GPR11                = 11  // General purpose register 11
    498 	PT_GPR12                = 12  // General purpose register 12
    499 	PT_GPR13                = 13  // General purpose register 13
    500 	PT_GPR14                = 14  // General purpose register 14
    501 	PT_GPR15                = 15  // General purpose register 15
    502 	PT_FPR0                 = 16  // Floating point register 0
    503 	PT_FPR1                 = 17  // Floating point register 1
    504 	PT_FPR2                 = 18  // Floating point register 2
    505 	PT_FPR3                 = 19  // Floating point register 3
    506 	PT_FPR4                 = 20  // Floating point register 4
    507 	PT_FPR5                 = 21  // Floating point register 5
    508 	PT_FPR6                 = 22  // Floating point register 6
    509 	PT_FPR7                 = 23  // Floating point register 7
    510 	PT_FPR8                 = 24  // Floating point register 8
    511 	PT_FPR9                 = 25  // Floating point register 9
    512 	PT_FPR10                = 26  // Floating point register 10
    513 	PT_FPR11                = 27  // Floating point register 11
    514 	PT_FPR12                = 28  // Floating point register 12
    515 	PT_FPR13                = 29  // Floating point register 13
    516 	PT_FPR14                = 30  // Floating point register 14
    517 	PT_FPR15                = 31  // Floating point register 15
    518 	PT_FPC                  = 32  // Floating point control register
    519 	PT_PSW                  = 40  // PSW
    520 	PT_PSW0                 = 40  // Left half of the PSW
    521 	PT_PSW1                 = 41  // Right half of the PSW
    522 	PT_CR0                  = 42  // Control register 0
    523 	PT_CR1                  = 43  // Control register 1
    524 	PT_CR2                  = 44  // Control register 2
    525 	PT_CR3                  = 45  // Control register 3
    526 	PT_CR4                  = 46  // Control register 4
    527 	PT_CR5                  = 47  // Control register 5
    528 	PT_CR6                  = 48  // Control register 6
    529 	PT_CR7                  = 49  // Control register 7
    530 	PT_CR8                  = 50  // Control register 8
    531 	PT_CR9                  = 51  // Control register 9
    532 	PT_CR10                 = 52  // Control register 10
    533 	PT_CR11                 = 53  // Control register 11
    534 	PT_CR12                 = 54  // Control register 12
    535 	PT_CR13                 = 55  // Control register 13
    536 	PT_CR14                 = 56  // Control register 14
    537 	PT_CR15                 = 57  // Control register 15
    538 	PT_GPRH0                = 58  // GP High register 0
    539 	PT_GPRH1                = 59  // GP High register 1
    540 	PT_GPRH2                = 60  // GP High register 2
    541 	PT_GPRH3                = 61  // GP High register 3
    542 	PT_GPRH4                = 62  // GP High register 4
    543 	PT_GPRH5                = 63  // GP High register 5
    544 	PT_GPRH6                = 64  // GP High register 6
    545 	PT_GPRH7                = 65  // GP High register 7
    546 	PT_GPRH8                = 66  // GP High register 8
    547 	PT_GPRH9                = 67  // GP High register 9
    548 	PT_GPRH10               = 68  // GP High register 10
    549 	PT_GPRH11               = 69  // GP High register 11
    550 	PT_GPRH12               = 70  // GP High register 12
    551 	PT_GPRH13               = 71  // GP High register 13
    552 	PT_GPRH14               = 72  // GP High register 14
    553 	PT_GPRH15               = 73  // GP High register 15
    554 	PT_VR0                  = 74  // Vector register 0
    555 	PT_VR1                  = 75  // Vector register 1
    556 	PT_VR2                  = 76  // Vector register 2
    557 	PT_VR3                  = 77  // Vector register 3
    558 	PT_VR4                  = 78  // Vector register 4
    559 	PT_VR5                  = 79  // Vector register 5
    560 	PT_VR6                  = 80  // Vector register 6
    561 	PT_VR7                  = 81  // Vector register 7
    562 	PT_VR8                  = 82  // Vector register 8
    563 	PT_VR9                  = 83  // Vector register 9
    564 	PT_VR10                 = 84  // Vector register 10
    565 	PT_VR11                 = 85  // Vector register 11
    566 	PT_VR12                 = 86  // Vector register 12
    567 	PT_VR13                 = 87  // Vector register 13
    568 	PT_VR14                 = 88  // Vector register 14
    569 	PT_VR15                 = 89  // Vector register 15
    570 	PT_VR16                 = 90  // Vector register 16
    571 	PT_VR17                 = 91  // Vector register 17
    572 	PT_VR18                 = 92  // Vector register 18
    573 	PT_VR19                 = 93  // Vector register 19
    574 	PT_VR20                 = 94  // Vector register 20
    575 	PT_VR21                 = 95  // Vector register 21
    576 	PT_VR22                 = 96  // Vector register 22
    577 	PT_VR23                 = 97  // Vector register 23
    578 	PT_VR24                 = 98  // Vector register 24
    579 	PT_VR25                 = 99  // Vector register 25
    580 	PT_VR26                 = 100 // Vector register 26
    581 	PT_VR27                 = 101 // Vector register 27
    582 	PT_VR28                 = 102 // Vector register 28
    583 	PT_VR29                 = 103 // Vector register 29
    584 	PT_VR30                 = 104 // Vector register 30
    585 	PT_VR31                 = 105 // Vector register 31
    586 	PT_PSWG                 = 106 // PSWG
    587 	PT_PSWG0                = 106 // Bytes 0-3
    588 	PT_PSWG1                = 107 // Bytes 4-7
    589 	PT_PSWG2                = 108 // Bytes 8-11 (IA high word)
    590 	PT_PSWG3                = 109 // Bytes 12-15 (IA low word)
    591 )
    592 
    593 func Bpx4ptr(request int32, pid int32, addr unsafe.Pointer, data unsafe.Pointer, buffer unsafe.Pointer) (rv int32, rc int32, rn int32) {
    594 	var parms [8]unsafe.Pointer
    595 	parms[0] = unsafe.Pointer(&request)
    596 	parms[1] = unsafe.Pointer(&pid)
    597 	parms[2] = unsafe.Pointer(&addr)
    598 	parms[3] = unsafe.Pointer(&data)
    599 	parms[4] = unsafe.Pointer(&buffer)
    600 	parms[5] = unsafe.Pointer(&rv)
    601 	parms[6] = unsafe.Pointer(&rc)
    602 	parms[7] = unsafe.Pointer(&rn)
    603 	bpxcall(parms[:], BPX4PTR)
    604 	return rv, rc, rn
    605 }
    606 
    607 func copyU8(val uint8, dest []uint8) int {
    608 	if len(dest) < 1 {
    609 		return 0
    610 	}
    611 	dest[0] = val
    612 	return 1
    613 }
    614 
    615 func copyU8Arr(src, dest []uint8) int {
    616 	if len(dest) < len(src) {
    617 		return 0
    618 	}
    619 	for i, v := range src {
    620 		dest[i] = v
    621 	}
    622 	return len(src)
    623 }
    624 
    625 func copyU16(val uint16, dest []uint16) int {
    626 	if len(dest) < 1 {
    627 		return 0
    628 	}
    629 	dest[0] = val
    630 	return 1
    631 }
    632 
    633 func copyU32(val uint32, dest []uint32) int {
    634 	if len(dest) < 1 {
    635 		return 0
    636 	}
    637 	dest[0] = val
    638 	return 1
    639 }
    640 
    641 func copyU32Arr(src, dest []uint32) int {
    642 	if len(dest) < len(src) {
    643 		return 0
    644 	}
    645 	for i, v := range src {
    646 		dest[i] = v
    647 	}
    648 	return len(src)
    649 }
    650 
    651 func copyU64(val uint64, dest []uint64) int {
    652 	if len(dest) < 1 {
    653 		return 0
    654 	}
    655 	dest[0] = val
    656 	return 1
    657 }