diff a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/x64/sysv/SysVx64Linker.java b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/x64/sysv/SysVx64Linker.java
--- a/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/x64/sysv/SysVx64Linker.java
+++ b/src/jdk.incubator.foreign/share/classes/jdk/internal/foreign/abi/x64/sysv/SysVx64Linker.java
@@ -28,10 +28,11 @@
 import jdk.incubator.foreign.ForeignLinker;
 import jdk.incubator.foreign.FunctionDescriptor;
 import jdk.incubator.foreign.MemoryAddress;
 import jdk.incubator.foreign.MemoryLayout;
 import jdk.incubator.foreign.MemorySegment;
+import jdk.internal.foreign.abi.SharedUtils;
 import jdk.internal.foreign.abi.UpcallStubs;
 
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.invoke.MethodType;
@@ -58,13 +59,13 @@
     private static final MethodHandle MH_boxVaList;
 
     static {
         try {
             MethodHandles.Lookup lookup = MethodHandles.lookup();
-            MH_unboxVaList = lookup.findStatic(SysVx64Linker.class, "unboxVaList",
-                MethodType.methodType(MemoryAddress.class, CSupport.VaList.class));
-            MH_boxVaList = lookup.findStatic(SysVx64Linker.class, "boxVaList",
+            MH_unboxVaList = lookup.findVirtual(CSupport.VaList.class, "address",
+                MethodType.methodType(MemoryAddress.class));
+            MH_boxVaList = lookup.findStatic(SysVx64Linker.class, "newVaListOfAddress",
                 MethodType.methodType(VaList.class, MemoryAddress.class));
         } catch (ReflectiveOperationException e) {
             throw new ExceptionInInitializerError(e);
         }
     }
@@ -80,49 +81,21 @@
         SysVVaList.Builder builder = SysVVaList.builder();
         actions.accept(builder);
         return builder.build();
     }
 
-    private static MethodType convertVaListCarriers(MethodType mt) {
-        Class<?>[] params = new Class<?>[mt.parameterCount()];
-        for (int i = 0; i < params.length; i++) {
-            Class<?> pType = mt.parameterType(i);
-            params[i] = ((pType == CSupport.VaList.class) ? SysVVaList.CARRIER : pType);
-        }
-        return MethodType.methodType(mt.returnType(), params);
-    }
-
-    private static MethodHandle unxboxVaLists(MethodType type, MethodHandle handle) {
-        for (int i = 0; i < type.parameterCount(); i++) {
-            if (type.parameterType(i) == VaList.class) {
-               handle = MethodHandles.filterArguments(handle, i, MH_unboxVaList);
-            }
-        }
-        return handle;
-    }
-
     @Override
     public MethodHandle downcallHandle(MemoryAddress symbol, MethodType type, FunctionDescriptor function) {
-        MethodType llMt = convertVaListCarriers(type);
+        MethodType llMt = SharedUtils.convertVaListCarriers(type, SysVVaList.CARRIER);
         MethodHandle handle = CallArranger.arrangeDowncall(symbol, llMt, function);
-        handle = unxboxVaLists(type, handle);
-        return handle;
-    }
-
-    private static MethodHandle boxVaLists(MethodHandle handle) {
-        MethodType type = handle.type();
-        for (int i = 0; i < type.parameterCount(); i++) {
-            if (type.parameterType(i) == VaList.class) {
-               handle = MethodHandles.filterArguments(handle, i, MH_boxVaList);
-            }
-        }
+        handle = SharedUtils.unboxVaLists(type, handle, MH_unboxVaList);
         return handle;
     }
 
     @Override
     public MemorySegment upcallStub(MethodHandle target, FunctionDescriptor function) {
-        target = boxVaLists(target);
+        target = SharedUtils.boxVaLists(target, MH_boxVaList);
         return UpcallStubs.upcallAddress(CallArranger.arrangeUpcall(target, target.type(), function));
     }
 
     @Override
     public String name() {
@@ -141,17 +114,13 @@
             case POINTER -> ArgumentClassImpl.POINTER;
             default -> null;
         });
     }
 
-    private static MemoryAddress unboxVaList(CSupport.VaList list) {
-        return ((SysVVaList) list).getSegment().baseAddress();
-    }
-
-    private static CSupport.VaList boxVaList(MemoryAddress ma) {
+    public static VaList newVaListOfAddress(MemoryAddress ma) {
         return SysVVaList.ofAddress(ma);
     }
 
-    public static VaList newVaListOfAddress(MemoryAddress ma) {
-        return SysVVaList.ofAddress(ma);
+    public static VaList emptyVaList() {
+        return SysVVaList.empty();
     }
 }
