PERFORCE change 29557 for review
Peter Wemm
peter at FreeBSD.org
Wed Apr 23 15:31:18 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=29557
Change 29557 by peter at peter_daintree on 2003/04/23 15:31:09
shameful hack for making __syscall(2) and syscall(2) work, since libc/sys/mmap.c
uses it. This will be cleaned up a lot when I reorder the trapframe.
Affected files ...
.. //depot/projects/hammer/sys/x86_64/x86_64/trap.c#28 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/x86_64/trap.c#28 (text+ko) ====
@@ -654,6 +654,7 @@
int narg;
register_t args[8];
u_int code;
+ int syscallflag = 0;
/*
* note: PCPU_LAZY_INC() can only be used if we can afford
@@ -676,7 +677,7 @@
cred_update_thread(td);
if (p->p_flag & P_THREADED)
thread_user_enter(p, td);
- params = (caddr_t)frame.tf_rsp + sizeof(long);
+ params = (caddr_t)frame.tf_rsp + sizeof(register_t);
code = frame.tf_rax;
orig_tf_rflags = frame.tf_rflags;
@@ -686,23 +687,9 @@
*/
(*p->p_sysent->sv_prepsyscall)(&frame, (int *)args, &code, ¶ms);
} else {
- /*
- * Need to check if this is a 32 bit or 64 bit syscall.
- * fuword is MP aware.
- */
- if (code == SYS_syscall) {
- /*
- * Code is first argument, followed by actual args.
- */
- code = fuword(params);
- params += sizeof(int);
- } else if (code == SYS___syscall) {
- /*
- * Like syscall, but code is a quad, so as to maintain
- * quad alignment for the rest of the arguments.
- */
- code = fuword(params);
- params += sizeof(quad_t);
+ if (code == SYS_syscall || code == SYS___syscall) {
+ code = frame.tf_rdi;
+ syscallflag++;
}
}
@@ -719,26 +706,45 @@
/*
* copyin and the ktrsyscall()/ktrsysret() code is MP-aware
*/
- if (params != NULL && narg != 0) {
- error = 0;
- /* XXX reorder trapframe so we can just copy the first 6 args */
- if (narg > 0)
- args[0] = frame.tf_rdi;
- if (narg > 1)
- args[1] = frame.tf_rsi;
- if (narg > 2)
- args[2] = frame.tf_rdx;
- if (narg > 3)
- args[3] = frame.tf_rcx;
- if (narg > 4)
- args[4] = frame.tf_r8;
- if (narg > 5)
- args[5] = frame.tf_r9;
- if (narg > 6)
- error = copyin(params, (caddr_t)&args[6],
- (u_int)((narg - 6) * sizeof(register_t)));
- } else
- error = 0;
+ error = 0;
+ if (!syscallflag) {
+ if (narg != 0) {
+ /* XXX reorder trapframe so we can just copy the first 6 args */
+ if (narg > 0)
+ args[0] = frame.tf_rdi;
+ if (narg > 1)
+ args[1] = frame.tf_rsi;
+ if (narg > 2)
+ args[2] = frame.tf_rdx;
+ if (narg > 3)
+ args[3] = frame.tf_rcx;
+ if (narg > 4)
+ args[4] = frame.tf_r8;
+ if (narg > 5)
+ args[5] = frame.tf_r9;
+ if (params != 0 && narg > 6)
+ error = copyin(params, (caddr_t)&args[6],
+ (u_int)((narg - 6) * sizeof(register_t)));
+ }
+ } else {
+ /* compensate for loss of 1 regparm */
+ if (narg != 0) {
+ /* XXX reorder trapframe so we can just copy the first 6 args */
+ if (narg > 0)
+ args[0] = frame.tf_rsi;
+ if (narg > 1)
+ args[1] = frame.tf_rdx;
+ if (narg > 2)
+ args[2] = frame.tf_rcx;
+ if (narg > 3)
+ args[3] = frame.tf_r8;
+ if (narg > 4)
+ args[4] = frame.tf_r9;
+ if (params != 0 && narg > 5)
+ error = copyin(params, (caddr_t)&args[5],
+ (u_int)((narg - 5) * sizeof(register_t)));
+ }
+ }
#ifdef KTRACE
if (KTRPOINT(td, KTR_SYSCALL))
More information about the p4-projects
mailing list