github.com/metacubex/gvisor@v0.0.0-20240320004321-933faba989ec/pkg/sentry/arch/arch_arm64_abi_autogen_unsafe.go (about)

     1  // Automatically generated marshal implementation. See tools/go_marshal.
     2  
     3  // If there are issues with build constraint aggregation, see
     4  // tools/go_marshal/gomarshal/generator.go:writeHeader(). The constraints here
     5  // come from the input set of files used to generate this file. This input set
     6  // is filtered based on pre-defined file suffixes related to build constraints,
     7  // see tools/defs.bzl:calculate_sets().
     8  
     9  //go:build arm64 && arm64 && arm64
    10  // +build arm64,arm64,arm64
    11  
    12  package arch
    13  
    14  import (
    15      "github.com/metacubex/gvisor/pkg/abi/linux"
    16      "github.com/metacubex/gvisor/pkg/gohacks"
    17      "github.com/metacubex/gvisor/pkg/hostarch"
    18      "github.com/metacubex/gvisor/pkg/marshal"
    19      "io"
    20      "reflect"
    21      "runtime"
    22      "unsafe"
    23  )
    24  
    25  // Marshallable types used by this file.
    26  var _ marshal.Marshallable = (*FpsimdContext)(nil)
    27  var _ marshal.Marshallable = (*SignalContext64)(nil)
    28  var _ marshal.Marshallable = (*UContext64)(nil)
    29  var _ marshal.Marshallable = (*aarch64Ctx)(nil)
    30  var _ marshal.Marshallable = (*linux.SignalSet)(nil)
    31  var _ marshal.Marshallable = (*linux.SignalStack)(nil)
    32  
    33  // SizeBytes implements marshal.Marshallable.SizeBytes.
    34  func (f *FpsimdContext) SizeBytes() int {
    35      return 8 +
    36          (*aarch64Ctx)(nil).SizeBytes() +
    37          8*64
    38  }
    39  
    40  // MarshalBytes implements marshal.Marshallable.MarshalBytes.
    41  func (f *FpsimdContext) MarshalBytes(dst []byte) []byte {
    42      dst = f.Head.MarshalUnsafe(dst)
    43      hostarch.ByteOrder.PutUint32(dst[:4], uint32(f.Fpsr))
    44      dst = dst[4:]
    45      hostarch.ByteOrder.PutUint32(dst[:4], uint32(f.Fpcr))
    46      dst = dst[4:]
    47      for idx := 0; idx < 64; idx++ {
    48          hostarch.ByteOrder.PutUint64(dst[:8], uint64(f.Vregs[idx]))
    49          dst = dst[8:]
    50      }
    51      return dst
    52  }
    53  
    54  // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes.
    55  func (f *FpsimdContext) UnmarshalBytes(src []byte) []byte {
    56      src = f.Head.UnmarshalUnsafe(src)
    57      f.Fpsr = uint32(hostarch.ByteOrder.Uint32(src[:4]))
    58      src = src[4:]
    59      f.Fpcr = uint32(hostarch.ByteOrder.Uint32(src[:4]))
    60      src = src[4:]
    61      for idx := 0; idx < 64; idx++ {
    62          f.Vregs[idx] = uint64(hostarch.ByteOrder.Uint64(src[:8]))
    63          src = src[8:]
    64      }
    65      return src
    66  }
    67  
    68  // Packed implements marshal.Marshallable.Packed.
    69  //go:nosplit
    70  func (f *FpsimdContext) Packed() bool {
    71      return f.Head.Packed()
    72  }
    73  
    74  // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe.
    75  func (f *FpsimdContext) MarshalUnsafe(dst []byte) []byte {
    76      if f.Head.Packed() {
    77          size := f.SizeBytes()
    78          gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(f), uintptr(size))
    79          return dst[size:]
    80      }
    81      // Type FpsimdContext doesn't have a packed layout in memory, fallback to MarshalBytes.
    82      return f.MarshalBytes(dst)
    83  }
    84  
    85  // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe.
    86  func (f *FpsimdContext) UnmarshalUnsafe(src []byte) []byte {
    87      if f.Head.Packed() {
    88          size := f.SizeBytes()
    89          gohacks.Memmove(unsafe.Pointer(f), unsafe.Pointer(&src[0]), uintptr(size))
    90          return src[size:]
    91      }
    92      // Type FpsimdContext doesn't have a packed layout in memory, fallback to UnmarshalBytes.
    93      return f.UnmarshalBytes(src)
    94  }
    95  
    96  // CopyOutN implements marshal.Marshallable.CopyOutN.
    97  func (f *FpsimdContext) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
    98      if !f.Head.Packed() {
    99          // Type FpsimdContext doesn't have a packed layout in memory, fall back to MarshalBytes.
   100          buf := cc.CopyScratchBuffer(f.SizeBytes()) // escapes: okay.
   101          f.MarshalBytes(buf) // escapes: fallback.
   102          return cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay.
   103      }
   104  
   105      // Construct a slice backed by dst's underlying memory.
   106      var buf []byte
   107      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   108      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(f)))
   109      hdr.Len = f.SizeBytes()
   110      hdr.Cap = f.SizeBytes()
   111  
   112      length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay.
   113      // Since we bypassed the compiler's escape analysis, indicate that f
   114      // must live until the use above.
   115      runtime.KeepAlive(f) // escapes: replaced by intrinsic.
   116      return length, err
   117  }
   118  
   119  // CopyOut implements marshal.Marshallable.CopyOut.
   120  func (f *FpsimdContext) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   121      return f.CopyOutN(cc, addr, f.SizeBytes())
   122  }
   123  
   124  // CopyInN implements marshal.Marshallable.CopyInN.
   125  func (f *FpsimdContext) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
   126      if !f.Head.Packed() {
   127          // Type FpsimdContext doesn't have a packed layout in memory, fall back to UnmarshalBytes.
   128          buf := cc.CopyScratchBuffer(f.SizeBytes()) // escapes: okay.
   129          length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay.
   130          // Unmarshal unconditionally. If we had a short copy-in, this results in a
   131          // partially unmarshalled struct.
   132          f.UnmarshalBytes(buf) // escapes: fallback.
   133          return length, err
   134      }
   135  
   136      // Construct a slice backed by dst's underlying memory.
   137      var buf []byte
   138      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   139      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(f)))
   140      hdr.Len = f.SizeBytes()
   141      hdr.Cap = f.SizeBytes()
   142  
   143      length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay.
   144      // Since we bypassed the compiler's escape analysis, indicate that f
   145      // must live until the use above.
   146      runtime.KeepAlive(f) // escapes: replaced by intrinsic.
   147      return length, err
   148  }
   149  
   150  // CopyIn implements marshal.Marshallable.CopyIn.
   151  func (f *FpsimdContext) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   152      return f.CopyInN(cc, addr, f.SizeBytes())
   153  }
   154  
   155  // WriteTo implements io.WriterTo.WriteTo.
   156  func (f *FpsimdContext) WriteTo(writer io.Writer) (int64, error) {
   157      if !f.Head.Packed() {
   158          // Type FpsimdContext doesn't have a packed layout in memory, fall back to MarshalBytes.
   159          buf := make([]byte, f.SizeBytes())
   160          f.MarshalBytes(buf)
   161          length, err := writer.Write(buf)
   162          return int64(length), err
   163      }
   164  
   165      // Construct a slice backed by dst's underlying memory.
   166      var buf []byte
   167      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   168      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(f)))
   169      hdr.Len = f.SizeBytes()
   170      hdr.Cap = f.SizeBytes()
   171  
   172      length, err := writer.Write(buf)
   173      // Since we bypassed the compiler's escape analysis, indicate that f
   174      // must live until the use above.
   175      runtime.KeepAlive(f) // escapes: replaced by intrinsic.
   176      return int64(length), err
   177  }
   178  
   179  // SizeBytes implements marshal.Marshallable.SizeBytes.
   180  func (s *SignalContext64) SizeBytes() int {
   181      return 32 +
   182          8*31 +
   183          1*8 +
   184          (*FpsimdContext)(nil).SizeBytes()
   185  }
   186  
   187  // MarshalBytes implements marshal.Marshallable.MarshalBytes.
   188  func (s *SignalContext64) MarshalBytes(dst []byte) []byte {
   189      hostarch.ByteOrder.PutUint64(dst[:8], uint64(s.FaultAddr))
   190      dst = dst[8:]
   191      for idx := 0; idx < 31; idx++ {
   192          hostarch.ByteOrder.PutUint64(dst[:8], uint64(s.Regs[idx]))
   193          dst = dst[8:]
   194      }
   195      hostarch.ByteOrder.PutUint64(dst[:8], uint64(s.Sp))
   196      dst = dst[8:]
   197      hostarch.ByteOrder.PutUint64(dst[:8], uint64(s.Pc))
   198      dst = dst[8:]
   199      hostarch.ByteOrder.PutUint64(dst[:8], uint64(s.Pstate))
   200      dst = dst[8:]
   201      for idx := 0; idx < 8; idx++ {
   202          dst[0] = byte(s._pad[idx])
   203          dst = dst[1:]
   204      }
   205      dst = s.Fpsimd64.MarshalUnsafe(dst)
   206      return dst
   207  }
   208  
   209  // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes.
   210  func (s *SignalContext64) UnmarshalBytes(src []byte) []byte {
   211      s.FaultAddr = uint64(hostarch.ByteOrder.Uint64(src[:8]))
   212      src = src[8:]
   213      for idx := 0; idx < 31; idx++ {
   214          s.Regs[idx] = uint64(hostarch.ByteOrder.Uint64(src[:8]))
   215          src = src[8:]
   216      }
   217      s.Sp = uint64(hostarch.ByteOrder.Uint64(src[:8]))
   218      src = src[8:]
   219      s.Pc = uint64(hostarch.ByteOrder.Uint64(src[:8]))
   220      src = src[8:]
   221      s.Pstate = uint64(hostarch.ByteOrder.Uint64(src[:8]))
   222      src = src[8:]
   223      for idx := 0; idx < 8; idx++ {
   224          s._pad[idx] = src[0]
   225          src = src[1:]
   226      }
   227      src = s.Fpsimd64.UnmarshalUnsafe(src)
   228      return src
   229  }
   230  
   231  // Packed implements marshal.Marshallable.Packed.
   232  //go:nosplit
   233  func (s *SignalContext64) Packed() bool {
   234      return s.Fpsimd64.Packed()
   235  }
   236  
   237  // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe.
   238  func (s *SignalContext64) MarshalUnsafe(dst []byte) []byte {
   239      if s.Fpsimd64.Packed() {
   240          size := s.SizeBytes()
   241          gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(s), uintptr(size))
   242          return dst[size:]
   243      }
   244      // Type SignalContext64 doesn't have a packed layout in memory, fallback to MarshalBytes.
   245      return s.MarshalBytes(dst)
   246  }
   247  
   248  // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe.
   249  func (s *SignalContext64) UnmarshalUnsafe(src []byte) []byte {
   250      if s.Fpsimd64.Packed() {
   251          size := s.SizeBytes()
   252          gohacks.Memmove(unsafe.Pointer(s), unsafe.Pointer(&src[0]), uintptr(size))
   253          return src[size:]
   254      }
   255      // Type SignalContext64 doesn't have a packed layout in memory, fallback to UnmarshalBytes.
   256      return s.UnmarshalBytes(src)
   257  }
   258  
   259  // CopyOutN implements marshal.Marshallable.CopyOutN.
   260  func (s *SignalContext64) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
   261      if !s.Fpsimd64.Packed() {
   262          // Type SignalContext64 doesn't have a packed layout in memory, fall back to MarshalBytes.
   263          buf := cc.CopyScratchBuffer(s.SizeBytes()) // escapes: okay.
   264          s.MarshalBytes(buf) // escapes: fallback.
   265          return cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay.
   266      }
   267  
   268      // Construct a slice backed by dst's underlying memory.
   269      var buf []byte
   270      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   271      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(s)))
   272      hdr.Len = s.SizeBytes()
   273      hdr.Cap = s.SizeBytes()
   274  
   275      length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay.
   276      // Since we bypassed the compiler's escape analysis, indicate that s
   277      // must live until the use above.
   278      runtime.KeepAlive(s) // escapes: replaced by intrinsic.
   279      return length, err
   280  }
   281  
   282  // CopyOut implements marshal.Marshallable.CopyOut.
   283  func (s *SignalContext64) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   284      return s.CopyOutN(cc, addr, s.SizeBytes())
   285  }
   286  
   287  // CopyInN implements marshal.Marshallable.CopyInN.
   288  func (s *SignalContext64) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
   289      if !s.Fpsimd64.Packed() {
   290          // Type SignalContext64 doesn't have a packed layout in memory, fall back to UnmarshalBytes.
   291          buf := cc.CopyScratchBuffer(s.SizeBytes()) // escapes: okay.
   292          length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay.
   293          // Unmarshal unconditionally. If we had a short copy-in, this results in a
   294          // partially unmarshalled struct.
   295          s.UnmarshalBytes(buf) // escapes: fallback.
   296          return length, err
   297      }
   298  
   299      // Construct a slice backed by dst's underlying memory.
   300      var buf []byte
   301      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   302      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(s)))
   303      hdr.Len = s.SizeBytes()
   304      hdr.Cap = s.SizeBytes()
   305  
   306      length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay.
   307      // Since we bypassed the compiler's escape analysis, indicate that s
   308      // must live until the use above.
   309      runtime.KeepAlive(s) // escapes: replaced by intrinsic.
   310      return length, err
   311  }
   312  
   313  // CopyIn implements marshal.Marshallable.CopyIn.
   314  func (s *SignalContext64) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   315      return s.CopyInN(cc, addr, s.SizeBytes())
   316  }
   317  
   318  // WriteTo implements io.WriterTo.WriteTo.
   319  func (s *SignalContext64) WriteTo(writer io.Writer) (int64, error) {
   320      if !s.Fpsimd64.Packed() {
   321          // Type SignalContext64 doesn't have a packed layout in memory, fall back to MarshalBytes.
   322          buf := make([]byte, s.SizeBytes())
   323          s.MarshalBytes(buf)
   324          length, err := writer.Write(buf)
   325          return int64(length), err
   326      }
   327  
   328      // Construct a slice backed by dst's underlying memory.
   329      var buf []byte
   330      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   331      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(s)))
   332      hdr.Len = s.SizeBytes()
   333      hdr.Cap = s.SizeBytes()
   334  
   335      length, err := writer.Write(buf)
   336      // Since we bypassed the compiler's escape analysis, indicate that s
   337      // must live until the use above.
   338      runtime.KeepAlive(s) // escapes: replaced by intrinsic.
   339      return int64(length), err
   340  }
   341  
   342  // SizeBytes implements marshal.Marshallable.SizeBytes.
   343  func (u *UContext64) SizeBytes() int {
   344      return 16 +
   345          (*linux.SignalStack)(nil).SizeBytes() +
   346          (*linux.SignalSet)(nil).SizeBytes() +
   347          1*120 +
   348          1*8 +
   349          (*SignalContext64)(nil).SizeBytes()
   350  }
   351  
   352  // MarshalBytes implements marshal.Marshallable.MarshalBytes.
   353  func (u *UContext64) MarshalBytes(dst []byte) []byte {
   354      hostarch.ByteOrder.PutUint64(dst[:8], uint64(u.Flags))
   355      dst = dst[8:]
   356      hostarch.ByteOrder.PutUint64(dst[:8], uint64(u.Link))
   357      dst = dst[8:]
   358      dst = u.Stack.MarshalUnsafe(dst)
   359      dst = u.Sigset.MarshalUnsafe(dst)
   360      for idx := 0; idx < 120; idx++ {
   361          dst[0] = byte(u._pad[idx])
   362          dst = dst[1:]
   363      }
   364      for idx := 0; idx < 8; idx++ {
   365          dst[0] = byte(u._pad2[idx])
   366          dst = dst[1:]
   367      }
   368      dst = u.MContext.MarshalUnsafe(dst)
   369      return dst
   370  }
   371  
   372  // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes.
   373  func (u *UContext64) UnmarshalBytes(src []byte) []byte {
   374      u.Flags = uint64(hostarch.ByteOrder.Uint64(src[:8]))
   375      src = src[8:]
   376      u.Link = uint64(hostarch.ByteOrder.Uint64(src[:8]))
   377      src = src[8:]
   378      src = u.Stack.UnmarshalUnsafe(src)
   379      src = u.Sigset.UnmarshalUnsafe(src)
   380      for idx := 0; idx < 120; idx++ {
   381          u._pad[idx] = src[0]
   382          src = src[1:]
   383      }
   384      for idx := 0; idx < 8; idx++ {
   385          u._pad2[idx] = src[0]
   386          src = src[1:]
   387      }
   388      src = u.MContext.UnmarshalUnsafe(src)
   389      return src
   390  }
   391  
   392  // Packed implements marshal.Marshallable.Packed.
   393  //go:nosplit
   394  func (u *UContext64) Packed() bool {
   395      return u.MContext.Packed() && u.Sigset.Packed() && u.Stack.Packed()
   396  }
   397  
   398  // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe.
   399  func (u *UContext64) MarshalUnsafe(dst []byte) []byte {
   400      if u.MContext.Packed() && u.Sigset.Packed() && u.Stack.Packed() {
   401          size := u.SizeBytes()
   402          gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(u), uintptr(size))
   403          return dst[size:]
   404      }
   405      // Type UContext64 doesn't have a packed layout in memory, fallback to MarshalBytes.
   406      return u.MarshalBytes(dst)
   407  }
   408  
   409  // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe.
   410  func (u *UContext64) UnmarshalUnsafe(src []byte) []byte {
   411      if u.MContext.Packed() && u.Sigset.Packed() && u.Stack.Packed() {
   412          size := u.SizeBytes()
   413          gohacks.Memmove(unsafe.Pointer(u), unsafe.Pointer(&src[0]), uintptr(size))
   414          return src[size:]
   415      }
   416      // Type UContext64 doesn't have a packed layout in memory, fallback to UnmarshalBytes.
   417      return u.UnmarshalBytes(src)
   418  }
   419  
   420  // CopyOutN implements marshal.Marshallable.CopyOutN.
   421  func (u *UContext64) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
   422      if !u.MContext.Packed() && u.Sigset.Packed() && u.Stack.Packed() {
   423          // Type UContext64 doesn't have a packed layout in memory, fall back to MarshalBytes.
   424          buf := cc.CopyScratchBuffer(u.SizeBytes()) // escapes: okay.
   425          u.MarshalBytes(buf) // escapes: fallback.
   426          return cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay.
   427      }
   428  
   429      // Construct a slice backed by dst's underlying memory.
   430      var buf []byte
   431      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   432      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u)))
   433      hdr.Len = u.SizeBytes()
   434      hdr.Cap = u.SizeBytes()
   435  
   436      length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay.
   437      // Since we bypassed the compiler's escape analysis, indicate that u
   438      // must live until the use above.
   439      runtime.KeepAlive(u) // escapes: replaced by intrinsic.
   440      return length, err
   441  }
   442  
   443  // CopyOut implements marshal.Marshallable.CopyOut.
   444  func (u *UContext64) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   445      return u.CopyOutN(cc, addr, u.SizeBytes())
   446  }
   447  
   448  // CopyInN implements marshal.Marshallable.CopyInN.
   449  func (u *UContext64) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
   450      if !u.MContext.Packed() && u.Sigset.Packed() && u.Stack.Packed() {
   451          // Type UContext64 doesn't have a packed layout in memory, fall back to UnmarshalBytes.
   452          buf := cc.CopyScratchBuffer(u.SizeBytes()) // escapes: okay.
   453          length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay.
   454          // Unmarshal unconditionally. If we had a short copy-in, this results in a
   455          // partially unmarshalled struct.
   456          u.UnmarshalBytes(buf) // escapes: fallback.
   457          return length, err
   458      }
   459  
   460      // Construct a slice backed by dst's underlying memory.
   461      var buf []byte
   462      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   463      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u)))
   464      hdr.Len = u.SizeBytes()
   465      hdr.Cap = u.SizeBytes()
   466  
   467      length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay.
   468      // Since we bypassed the compiler's escape analysis, indicate that u
   469      // must live until the use above.
   470      runtime.KeepAlive(u) // escapes: replaced by intrinsic.
   471      return length, err
   472  }
   473  
   474  // CopyIn implements marshal.Marshallable.CopyIn.
   475  func (u *UContext64) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   476      return u.CopyInN(cc, addr, u.SizeBytes())
   477  }
   478  
   479  // WriteTo implements io.WriterTo.WriteTo.
   480  func (u *UContext64) WriteTo(writer io.Writer) (int64, error) {
   481      if !u.MContext.Packed() && u.Sigset.Packed() && u.Stack.Packed() {
   482          // Type UContext64 doesn't have a packed layout in memory, fall back to MarshalBytes.
   483          buf := make([]byte, u.SizeBytes())
   484          u.MarshalBytes(buf)
   485          length, err := writer.Write(buf)
   486          return int64(length), err
   487      }
   488  
   489      // Construct a slice backed by dst's underlying memory.
   490      var buf []byte
   491      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   492      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(u)))
   493      hdr.Len = u.SizeBytes()
   494      hdr.Cap = u.SizeBytes()
   495  
   496      length, err := writer.Write(buf)
   497      // Since we bypassed the compiler's escape analysis, indicate that u
   498      // must live until the use above.
   499      runtime.KeepAlive(u) // escapes: replaced by intrinsic.
   500      return int64(length), err
   501  }
   502  
   503  // SizeBytes implements marshal.Marshallable.SizeBytes.
   504  func (a *aarch64Ctx) SizeBytes() int {
   505      return 8
   506  }
   507  
   508  // MarshalBytes implements marshal.Marshallable.MarshalBytes.
   509  func (a *aarch64Ctx) MarshalBytes(dst []byte) []byte {
   510      hostarch.ByteOrder.PutUint32(dst[:4], uint32(a.Magic))
   511      dst = dst[4:]
   512      hostarch.ByteOrder.PutUint32(dst[:4], uint32(a.Size))
   513      dst = dst[4:]
   514      return dst
   515  }
   516  
   517  // UnmarshalBytes implements marshal.Marshallable.UnmarshalBytes.
   518  func (a *aarch64Ctx) UnmarshalBytes(src []byte) []byte {
   519      a.Magic = uint32(hostarch.ByteOrder.Uint32(src[:4]))
   520      src = src[4:]
   521      a.Size = uint32(hostarch.ByteOrder.Uint32(src[:4]))
   522      src = src[4:]
   523      return src
   524  }
   525  
   526  // Packed implements marshal.Marshallable.Packed.
   527  //go:nosplit
   528  func (a *aarch64Ctx) Packed() bool {
   529      return true
   530  }
   531  
   532  // MarshalUnsafe implements marshal.Marshallable.MarshalUnsafe.
   533  func (a *aarch64Ctx) MarshalUnsafe(dst []byte) []byte {
   534      size := a.SizeBytes()
   535      gohacks.Memmove(unsafe.Pointer(&dst[0]), unsafe.Pointer(a), uintptr(size))
   536      return dst[size:]
   537  }
   538  
   539  // UnmarshalUnsafe implements marshal.Marshallable.UnmarshalUnsafe.
   540  func (a *aarch64Ctx) UnmarshalUnsafe(src []byte) []byte {
   541      size := a.SizeBytes()
   542      gohacks.Memmove(unsafe.Pointer(a), unsafe.Pointer(&src[0]), uintptr(size))
   543      return src[size:]
   544  }
   545  
   546  // CopyOutN implements marshal.Marshallable.CopyOutN.
   547  func (a *aarch64Ctx) CopyOutN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
   548      // Construct a slice backed by dst's underlying memory.
   549      var buf []byte
   550      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   551      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(a)))
   552      hdr.Len = a.SizeBytes()
   553      hdr.Cap = a.SizeBytes()
   554  
   555      length, err := cc.CopyOutBytes(addr, buf[:limit]) // escapes: okay.
   556      // Since we bypassed the compiler's escape analysis, indicate that a
   557      // must live until the use above.
   558      runtime.KeepAlive(a) // escapes: replaced by intrinsic.
   559      return length, err
   560  }
   561  
   562  // CopyOut implements marshal.Marshallable.CopyOut.
   563  func (a *aarch64Ctx) CopyOut(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   564      return a.CopyOutN(cc, addr, a.SizeBytes())
   565  }
   566  
   567  // CopyInN implements marshal.Marshallable.CopyInN.
   568  func (a *aarch64Ctx) CopyInN(cc marshal.CopyContext, addr hostarch.Addr, limit int) (int, error) {
   569      // Construct a slice backed by dst's underlying memory.
   570      var buf []byte
   571      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   572      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(a)))
   573      hdr.Len = a.SizeBytes()
   574      hdr.Cap = a.SizeBytes()
   575  
   576      length, err := cc.CopyInBytes(addr, buf[:limit]) // escapes: okay.
   577      // Since we bypassed the compiler's escape analysis, indicate that a
   578      // must live until the use above.
   579      runtime.KeepAlive(a) // escapes: replaced by intrinsic.
   580      return length, err
   581  }
   582  
   583  // CopyIn implements marshal.Marshallable.CopyIn.
   584  func (a *aarch64Ctx) CopyIn(cc marshal.CopyContext, addr hostarch.Addr) (int, error) {
   585      return a.CopyInN(cc, addr, a.SizeBytes())
   586  }
   587  
   588  // WriteTo implements io.WriterTo.WriteTo.
   589  func (a *aarch64Ctx) WriteTo(writer io.Writer) (int64, error) {
   590      // Construct a slice backed by dst's underlying memory.
   591      var buf []byte
   592      hdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf))
   593      hdr.Data = uintptr(gohacks.Noescape(unsafe.Pointer(a)))
   594      hdr.Len = a.SizeBytes()
   595      hdr.Cap = a.SizeBytes()
   596  
   597      length, err := writer.Write(buf)
   598      // Since we bypassed the compiler's escape analysis, indicate that a
   599      // must live until the use above.
   600      runtime.KeepAlive(a) // escapes: replaced by intrinsic.
   601      return int64(length), err
   602  }
   603