all repos

rss-tools @ master

get rss feed from sources that(i need and) dont provide one

rss-tools/vendor/golang.org/x/sys/unix/bpxsvc_zos.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
we're vendoring now, 7 days ago
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
}