On Sat, 10 Sep 2016, Mark Kettenis wrote:
> ok kettenis@, but it is probably time to rewrite the comment above
> thie function as well.

Like this?

Index: trap.c
===================================================================
RCS file: /cvs/src/sys/arch/sparc64/sparc64/trap.c,v
retrieving revision 1.89
diff -u -p -r1.89 trap.c
--- trap.c      10 Sep 2016 18:02:15 -0000      1.89
+++ trap.c      10 Sep 2016 18:06:52 -0000
@@ -1186,27 +1186,6 @@ out:
  * `in' registers within the syscall trap code (because of the automatic
  * `save' effect of each trap).  They are, however, the %o registers of the
  * thing that made the system call, and are named that way here.
- *
- * 32-bit system calls on a 64-bit system are a problem.  Each system call
- * argument is stored in the smaller of the argument's true size or a
- * `register_t'.  Now on a 64-bit machine all normal types can be stored in a
- * `register_t'.  (The only exceptions would be 128-bit `quad's or 128-bit
- * extended precision floating point values, which we don't support.)  For
- * 32-bit syscalls, 64-bit integers like `off_t's, double precision floating
- * point values, and several other types cannot fit in a 32-bit `register_t'.
- * These will require reading in two `register_t' values for one argument.
- *
- * In order to calculate the true size of the arguments and therefore whether
- * any argument needs to be split into two slots, the system call args
- * structure needs to be built with the appropriately sized register_t.
- * Otherwise the emul needs to do some magic to split oversized arguments.
- *
- * We can handle most this stuff for normal syscalls by using either a 32-bit
- * or 64-bit array of `register_t' arguments.  Unfortunately ktrace always
- * expects arguments to be `register_t's, so it loses badly.  What's worse,
- * ktrace may need to do size translations to massage the argument array
- * appropriately according to the emulation that is doing the ktrace.
- *  
  */
 void
 syscall(tf, code, pc)
@@ -1248,10 +1227,10 @@ syscall(tf, code, pc)
         * of the user's stack frame (see <machine/frame.h>).
         *
         * Check for ``special'' codes that alter this, namely syscall and
-        * __syscall.  The latter takes a quad syscall number, so that other
-        * arguments are at their natural alignments.  Adjust the number
-        * of ``easy'' arguments as appropriate; we will copy the hard
-        * ones later as needed.
+        * __syscall.  These both pass a syscall number in the first argument
+        * register, so the other arguments are just shifted down, possibly
+        * pushing one off the end into the extension area.  This happens
+        * with mmap() and mquery() used via __syscall().
         */
        ap = &tf->tf_out[0];
        nap = 6;

Reply via email to