Fix raw hipc2.nim file

This commit is contained in:
Joey Yakimowich-Payne 2022-12-06 07:36:12 -07:00
commit 22c168b67e
No known key found for this signature in database
GPG key ID: 6BFE655FA5ABD1E1

View file

@ -7,11 +7,11 @@
## ##
import import
../result, ../arm/tls, ../kernel/svc ../result, ../arm/tls
const const
HIPC_AUTO_RECV_STATIC* = uint8Max HIPC_AUTO_RECV_STATIC* = uint8.high
HIPC_RESPONSE_NO_PID* = uint32Max HIPC_RESPONSE_NO_PID* = uint32.high
type type
HipcMetadata* {.bycopy.} = object HipcMetadata* {.bycopy.} = object
@ -96,118 +96,154 @@ type
proc hipcMakeSendStatic*(buffer: pointer; size: csize_t; index: U8): HipcStaticDescriptor {. proc hipcMakeSendStatic*(buffer: pointer; size: csize_t; index: U8): HipcStaticDescriptor {.
inline, cdecl, importc: "hipcMakeSendStatic".} = inline, cdecl.} =
## !!!Ignored construct: return ( HipcStaticDescriptor ) { . index = index , . address_high = ( u32 ) ( ( uintptr_t ) buffer >> 36 ) , . address_mid = ( u32 ) ( ( uintptr_t ) buffer >> 32 ) , . size = ( u32 ) size , . address_low = ( u32 ) ( uintptr_t ) buffer , } ; return HipcStaticDescriptor(
## Error: token expected: ; but got: {!!! index : index,
address_high : (U32)(cast[uintptr_t](buffer) shr 36),
address_mid : (U32)(cast[uintptr_t](buffer) shr 32),
size : (U32)size,
address_low : (U32)cast[uintptr_t](buffer)
)
proc hipcMakeBuffer*(buffer: pointer; size: csize_t; mode: HipcBufferMode): HipcBufferDescriptor {. proc hipcMakeBuffer*(buffer: pointer; size: csize_t; mode: HipcBufferMode): HipcBufferDescriptor {.
inline, cdecl, importc: "hipcMakeBuffer".} = inline, cdecl.} =
## !!!Ignored construct: return ( HipcBufferDescriptor ) { . size_low = ( u32 ) size , . address_low = ( u32 ) ( uintptr_t ) buffer , . mode = mode , . address_high = ( u32 ) ( ( uintptr_t ) buffer >> 36 ) , . size_high = ( u32 ) ( size >> 32 ) , . address_mid = ( u32 ) ( ( uintptr_t ) buffer >> 32 ) , } ; return HipcBufferDescriptor(
## Error: token expected: ; but got: {!!! size_low : (U32)size,
address_low : (U32)cast[uintptr_t](buffer),
mode : mode.U32,
address_high : (U32)(cast[uintptr_t](buffer) shr 36),
size_high : (U32)(size shr 32),
address_mid : (U32)(cast[uintptr_t](buffer) shr 32),
)
proc hipcMakeRecvStatic*(buffer: pointer; size: csize_t): HipcRecvListEntry {.inline, proc hipcMakeRecvStatic*(buffer: pointer; size: csize_t): HipcRecvListEntry {.inline, cdecl.} =
cdecl, importc: "hipcMakeRecvStatic".} = return HipcRecvListEntry(
## !!!Ignored construct: return ( HipcRecvListEntry ) { . address_low = ( u32 ) ( ( uintptr_t ) buffer ) , . address_high = ( u32 ) ( ( uintptr_t ) buffer >> 32 ) , . size = ( u32 ) size , } ; address_low : (U32)(cast[uintptr_t](buffer)),
## Error: token expected: ; but got: {!!! address_high : (U32)(cast[uintptr_t](buffer) shr 32),
size : (U32)size,
)
proc hipcGetStaticAddress*(desc: ptr HipcStaticDescriptor): pointer {.inline, cdecl, proc hipcGetStaticAddress*(desc: ptr HipcStaticDescriptor): pointer {.inline, cdecl.} =
importc: "hipcGetStaticAddress".} =
return cast[pointer]((desc.addressLow or return cast[pointer]((desc.addressLow or
(cast[uintptrT](desc.addressMid) shl 32) or (cast[uintptrT](desc.addressMid) shl 32) or
(cast[uintptrT](desc.addressHigh) shl 36))) (cast[uintptrT](desc.addressHigh) shl 36)))
proc hipcGetStaticSize*(desc: ptr HipcStaticDescriptor): csize_t {.inline, cdecl, proc hipcGetStaticSize*(desc: ptr HipcStaticDescriptor): csize_t {.inline, cdecl.} =
importc: "hipcGetStaticSize".} =
return desc.size return desc.size
proc hipcGetBufferAddress*(desc: ptr HipcBufferDescriptor): pointer {.inline, cdecl, proc hipcGetBufferAddress*(desc: ptr HipcBufferDescriptor): pointer {.inline, cdecl.} =
importc: "hipcGetBufferAddress".} =
return cast[pointer]((desc.addressLow or return cast[pointer]((desc.addressLow or
(cast[uintptrT](desc.addressMid) shl 32) or (cast[uintptrT](desc.addressMid) shl 32) or
(cast[uintptrT](desc.addressHigh) shl 36))) (cast[uintptrT](desc.addressHigh) shl 36)))
proc hipcGetBufferSize*(desc: ptr HipcBufferDescriptor): csize_t {.inline, cdecl, proc hipcGetBufferSize*(desc: ptr HipcBufferDescriptor): csize_t {.inline, cdecl.} =
importc: "hipcGetBufferSize".} =
return desc.sizeLow or (cast[csize_t](desc.sizeHigh) shl 32) return desc.sizeLow or (cast[csize_t](desc.sizeHigh) shl 32)
proc hipcCalcRequestLayout*(meta: HipcMetadata; base: pointer): HipcRequest {.inline, proc hipcCalcRequestLayout*(meta: HipcMetadata; base: pointer): HipcRequest {.inline, cdecl.} =
cdecl, importc: "hipcCalcRequestLayout".} =
## Copy handles ## Copy handles
var base = base
var copyHandles: ptr Handle = nil var copyHandles: ptr Handle = nil
if meta.numCopyHandles: if meta.numCopyHandles.bool:
copyHandles = cast[ptr Handle](base) copyHandles = cast[ptr Handle](base)
base = copyHandles + meta.numCopyHandles base = copyHandles + meta.numCopyHandles
var moveHandles: ptr Handle = nil var moveHandles: ptr Handle = nil
if meta.numMoveHandles: if meta.numMoveHandles.bool:
moveHandles = cast[ptr Handle](base) moveHandles = cast[ptr Handle](base)
base = moveHandles + meta.numMoveHandles base = moveHandles + meta.numMoveHandles
var sendStatics: ptr HipcStaticDescriptor = nil var sendStatics: ptr HipcStaticDescriptor = nil
if meta.numSendStatics: if meta.numSendStatics.bool:
sendStatics = cast[ptr HipcStaticDescriptor](base) sendStatics = cast[ptr HipcStaticDescriptor](base)
base = sendStatics + meta.numSendStatics base = sendStatics + meta.numSendStatics
var sendBuffers: ptr HipcBufferDescriptor = nil var sendBuffers: ptr HipcBufferDescriptor = nil
if meta.numSendBuffers: if meta.numSendBuffers.bool:
sendBuffers = cast[ptr HipcBufferDescriptor](base) sendBuffers = cast[ptr HipcBufferDescriptor](base)
base = sendBuffers + meta.numSendBuffers base = sendBuffers + meta.numSendBuffers
var recvBuffers: ptr HipcBufferDescriptor = nil var recvBuffers: ptr HipcBufferDescriptor = nil
if meta.numRecvBuffers: if meta.numRecvBuffers.bool:
recvBuffers = cast[ptr HipcBufferDescriptor](base) recvBuffers = cast[ptr HipcBufferDescriptor](base)
base = recvBuffers + meta.numRecvBuffers base = recvBuffers + meta.numRecvBuffers
var exchBuffers: ptr HipcBufferDescriptor = nil var exchBuffers: ptr HipcBufferDescriptor = nil
if meta.numExchBuffers: if meta.numExchBuffers.bool:
exchBuffers = cast[ptr HipcBufferDescriptor](base) exchBuffers = cast[ptr HipcBufferDescriptor](base)
base = exchBuffers + meta.numExchBuffers base = exchBuffers + meta.numExchBuffers
var dataWords: ptr U32 = nil var dataWords: ptr U32 = nil
if meta.numDataWords: if meta.numDataWords.bool:
dataWords = cast[ptr U32](base) dataWords = cast[ptr U32](base)
base = dataWords + meta.numDataWords base = dataWords + meta.numDataWords
var recvList: ptr HipcRecvListEntry = nil var recvList: ptr HipcRecvListEntry = nil
if meta.numRecvStatics: if meta.numRecvStatics.bool:
recvList = cast[ptr HipcRecvListEntry](base) recvList = cast[ptr HipcRecvListEntry](base)
## !!!Ignored construct: return ( HipcRequest ) { . send_statics = send_statics , . send_buffers = send_buffers , . recv_buffers = recv_buffers , . exch_buffers = exch_buffers , . data_words = data_words , . recv_list = recv_list , . copy_handles = copy_handles , . move_handles = move_handles , } ; return HipcRequest(
## Error: token expected: ; but got: {!!! send_statics: send_statics,
send_buffers: send_buffers,
recv_buffers: recv_buffers,
exch_buffers: exch_buffers,
data_words: data_words,
recv_list: recv_list,
copy_handles: copy_handles,
move_handles: move_handles,
)
proc hipcMakeRequest*(base: pointer; meta: HipcMetadata): HipcRequest {.inline, cdecl, proc hipcMakeRequest*(base: pointer; meta: HipcMetadata): HipcRequest {.inline, cdecl.} =
importc: "hipcMakeRequest".} =
## Write message header ## Write message header
var base = base
var hasSpecialHeader: bool = meta.sendPid or meta.numCopyHandles or var hasSpecialHeader: bool = meta.sendPid or meta.numCopyHandles or
meta.numMoveHandles meta.numMoveHandles
var hdr: ptr HipcHeader = cast[ptr HipcHeader](base) var hdr: ptr HipcHeader = cast[ptr HipcHeader](base)
base = hdr + 1 base = hdr + 1
## !!!Ignored construct: * hdr = ( HipcHeader ) { . type = meta . type , . num_send_statics = meta . num_send_statics , . num_send_buffers = meta . num_send_buffers , . num_recv_buffers = meta . num_recv_buffers , . num_exch_buffers = meta . num_exch_buffers , . num_data_words = meta . num_data_words , . recv_static_mode = meta . num_recv_statics ? ( meta . num_recv_statics != HIPC_AUTO_RECV_STATIC ? 2u + meta . num_recv_statics : 2u ) : 0u , . padding = 0 , . recv_list_offset = 0 , . has_special_header = has_special_header , } ; ## !!!Ignored construct: * hdr = ( HipcHeader ) { . type = meta . type , . num_send_statics = meta . num_send_statics , . num_send_buffers = meta . num_send_buffers , . num_recv_buffers = meta . num_recv_buffers , . num_exch_buffers = meta . num_exch_buffers , . num_data_words = meta . num_data_words , . recv_static_mode = meta . num_recv_statics ? ( meta . num_recv_statics != HIPC_AUTO_RECV_STATIC ? 2u + meta . num_recv_statics : 2u ) : 0u , . padding = 0 , . recv_list_offset = 0 , . has_special_header = has_special_header , } ;
## Error: expected ';'!!! ## Error: expected ';'!!!
hdr[] = HipcHeader(
type: meta.type,
num_send_statics: meta.num_send_statics,
num_send_buffers: meta.num_send_buffers,
num_recv_buffers: meta.num_recv_buffers,
num_exch_buffers: meta.num_exch_buffers,
num_data_words: meta.num_data_words,
recv_static_mode: if meta.num_recv_statics.bool:
if meta.num_recv_statics != HIPC_AUTO_RECV_STATIC:
2'U32 + meta.num_recv_statics.U32
else: 2.U32
else: 0.U32,
padding: 0,
recv_list_offset: 0,
has_special_header: has_special_header.U32,
)
## Write special header ## Write special header
if hasSpecialHeader: if hasSpecialHeader:
var sphdr: ptr HipcSpecialHeader = cast[ptr HipcSpecialHeader](base) var sphdr: ptr HipcSpecialHeader = cast[ptr HipcSpecialHeader](base)
base = sphdr + 1 base = sphdr + 1
## !!!Ignored construct: * sphdr = ( HipcSpecialHeader ) { . send_pid = meta . send_pid , . num_copy_handles = meta . num_copy_handles , . num_move_handles = meta . num_move_handles , } ; sphdr[] = HipcSpecialHeader(
## Error: expected ';'!!! send_pid: meta.send_pid,
if meta.sendPid: num_copy_handles: meta.num_copy_handles,
base = cast[ptr U8](base) + sizeof((u64)) num_move_handles: meta.num_move_handles,
)
if meta.sendPid.bool:
base = cast[ptr U8](base) + sizeof((U64))
return hipcCalcRequestLayout(meta, base) return hipcCalcRequestLayout(meta, base)
proc hipcParseRequest*(base: pointer): HipcParsedRequest {.inline, cdecl, proc hipcParseRequest*(base: pointer): HipcParsedRequest {.inline, cdecl.} =
importc: "hipcParseRequest".} =
## Parse message header ## Parse message header
var hdr: HipcHeader = HipcHeader() var hdr: HipcHeader = HipcHeader()
builtinMemcpy(addr(hdr), base, sizeof((hdr))) var base = base
copyMem(addr(hdr), base, sizeof((hdr)))
base = cast[ptr U8](base) + sizeof((hdr)) base = cast[ptr U8](base) + sizeof((hdr))
var numRecvStatics: U32 = 0 var numRecvStatics: U32 = 0
var pid: U64 = 0 var pid: U64 = 0
## Parse recv static mode ## Parse recv static mode
if hdr.recvStaticMode: if hdr.recvStaticMode.bool:
if hdr.recvStaticMode == 2'u: if hdr.recvStaticMode == 2'u:
numRecvStatics = hipc_Auto_Recv_Static numRecvStatics = Hipc_Auto_Recv_Static
elif hdr.recvStaticMode > 2'u: elif hdr.recvStaticMode > 2'u:
numRecvStatics = hdr.recvStaticMode - 2'u numRecvStatics = hdr.recvStaticMode - 2.U32
var sphdr: HipcSpecialHeader = HipcSpecialHeader() var sphdr: HipcSpecialHeader = HipcSpecialHeader()
if hdr.hasSpecialHeader: if hdr.hasSpecialHeader.bool:
builtinMemcpy(addr(sphdr), base, sizeof((sphdr))) copyMem(addr(sphdr), base, sizeof((sphdr)))
base = cast[ptr U8](base) + sizeof((sphdr)) base = cast[ptr U8](base) + sizeof((sphdr))
## Read PID descriptor ## Read PID descriptor
if sphdr.sendPid: if sphdr.sendPid.bool:
pid = cast[ptr U64](base)[] pid = cast[ptr U64](base)[]
base = cast[ptr U8](base) + sizeof((u64)) base = cast[ptr U8](base) + sizeof((U64))
let meta: HipcMetadata = HipcMetadata(`type`: hdr.`type`, let meta: HipcMetadata = HipcMetadata(`type`: hdr.`type`,
numSendStatics: hdr.numSendStatics, numSendStatics: hdr.numSendStatics,
numSendBuffers: hdr.numSendBuffers, numSendBuffers: hdr.numSendBuffers,
@ -218,32 +254,35 @@ proc hipcParseRequest*(base: pointer): HipcParsedRequest {.inline, cdecl,
sendPid: sphdr.sendPid, sendPid: sphdr.sendPid,
numCopyHandles: sphdr.numCopyHandles, numCopyHandles: sphdr.numCopyHandles,
numMoveHandles: sphdr.numMoveHandles) numMoveHandles: sphdr.numMoveHandles)
## !!!Ignored construct: return ( HipcParsedRequest ) { . meta = meta , . data = hipcCalcRequestLayout ( meta , base ) , . pid = pid , } ; return HipcParsedRequest(
## Error: token expected: ; but got: {!!! meta: meta,
data: hipcCalcRequestLayout(meta, base),
pid: pid,
)
proc hipcParseResponse*(base: pointer): HipcResponse {.inline, cdecl, proc hipcParseResponse*(base: pointer): HipcResponse {.inline, cdecl.} =
importc: "hipcParseResponse".} =
## Parse header ## Parse header
var hdr: HipcHeader = HipcHeader() var hdr: HipcHeader = HipcHeader()
builtinMemcpy(addr(hdr), base, sizeof((hdr))) copyMem(addr(hdr), base, sizeof((hdr)))
var base = base
base = cast[ptr U8](base) + sizeof((hdr)) base = cast[ptr U8](base) + sizeof((hdr))
## Initialize response ## Initialize response
var response: HipcResponse = HipcResponse() var response: HipcResponse = HipcResponse()
response.numStatics = hdr.numSendStatics response.numStatics = hdr.numSendStatics
response.numDataWords = hdr.numDataWords response.numDataWords = hdr.numDataWords
response.pid = hipc_Response_No_Pid response.pid = Hipc_Response_No_Pid
## Parse special header ## Parse special header
if hdr.hasSpecialHeader: if hdr.hasSpecialHeader.bool:
var sphdr: HipcSpecialHeader = HipcSpecialHeader() var sphdr: HipcSpecialHeader = HipcSpecialHeader()
builtinMemcpy(addr(sphdr), base, sizeof((sphdr))) copyMem(addr(sphdr), base, sizeof((sphdr)))
base = cast[ptr U8](base) + sizeof((sphdr)) base = cast[ptr U8](base) + sizeof((sphdr))
## Update response ## Update response
response.numCopyHandles = sphdr.numCopyHandles response.numCopyHandles = sphdr.numCopyHandles
response.numMoveHandles = sphdr.numMoveHandles response.numMoveHandles = sphdr.numMoveHandles
## Parse PID descriptor ## Parse PID descriptor
if sphdr.sendPid: if sphdr.sendPid.bool:
response.pid = cast[ptr U64](base)[] response.pid = cast[ptr U64](base)[]
base = cast[ptr U8](base) + sizeof((u64)) base = cast[ptr U8](base) + sizeof((U64))
response.copyHandles = cast[ptr Handle](base) response.copyHandles = cast[ptr Handle](base)
base = response.copyHandles + response.numCopyHandles base = response.copyHandles + response.numCopyHandles
## Move handles ## Move handles