Make context_i386.c work on 5.x as well as 4.x by using the DBREG_DRX

macro to access the fields of 'struct dbreg' instead of accessing
them directly.

Because the macro is buggy on older versions of FreeBSD as it lacks
proper macro argument parens, use an extra pointer as a workaround
so that we'll work on pre-patched versions of FreeBSD.

Reviewed by: gerald (maintainer)
This commit is contained in:
Alfred Perlstein 2002-11-08 08:08:04 +00:00
parent ff2a2f614d
commit 5c09ab656d
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=69719
2 changed files with 102 additions and 0 deletions

View File

@ -0,0 +1,51 @@
--- server/context_i386.c.orig Wed Aug 14 13:59:03 2002
+++ server/context_i386.c Thu Nov 7 14:54:01 2002
@@ -371,14 +371,15 @@
{
#ifdef PTRACE_GETDBREGS
struct dbreg dbregs;
- if (ptrace( PTRACE_GETDBREGS, pid, (caddr_t) &dbregs, 0 ) == -1)
+ struct dbreg *dbregs_ptr = &dbregs; /* ptr to workaround buggy macro */
+ if (ptrace( PTRACE_GETDBREGS, pid, (caddr_t) dbregs_ptr, 0 ) == -1)
goto error;
- context->Dr0 = dbregs.dr0;
- context->Dr1 = dbregs.dr1;
- context->Dr2 = dbregs.dr2;
- context->Dr3 = dbregs.dr3;
- context->Dr6 = dbregs.dr6;
- context->Dr7 = dbregs.dr7;
+ context->Dr0 = DBREG_DRX(dbregs_ptr, 0);
+ context->Dr1 = DBREG_DRX(dbregs_ptr, 1);
+ context->Dr2 = DBREG_DRX(dbregs_ptr, 2);
+ context->Dr3 = DBREG_DRX(dbregs_ptr, 3);
+ context->Dr6 = DBREG_DRX(dbregs_ptr, 6);
+ context->Dr7 = DBREG_DRX(dbregs_ptr, 7);
#endif
}
if (flags & CONTEXT_FLOATING_POINT)
@@ -437,15 +438,16 @@
{
#ifdef PTRACE_SETDBREGS
struct dbreg dbregs;
- dbregs.dr0 = context->Dr0;
- dbregs.dr1 = context->Dr1;
- dbregs.dr2 = context->Dr2;
- dbregs.dr3 = context->Dr3;
- dbregs.dr4 = 0;
- dbregs.dr5 = 0;
- dbregs.dr6 = context->Dr6;
- dbregs.dr7 = context->Dr7;
- if (ptrace( PTRACE_SETDBREGS, pid, (caddr_t) &dbregs, 0 ) == -1)
+ struct dbreg *dbregs_ptr = &dbregs; /* ptr to workaround buggy macro */
+ DBREG_DRX(dbregs_ptr, 0) = context->Dr0;
+ DBREG_DRX(dbregs_ptr, 1) = context->Dr1;
+ DBREG_DRX(dbregs_ptr, 2) = context->Dr2;
+ DBREG_DRX(dbregs_ptr, 3) = context->Dr3;
+ DBREG_DRX(dbregs_ptr, 4) = 0;
+ DBREG_DRX(dbregs_ptr, 5) = 0;
+ DBREG_DRX(dbregs_ptr, 6) = context->Dr6;
+ DBREG_DRX(dbregs_ptr, 7) = context->Dr7;
+ if (ptrace( PTRACE_SETDBREGS, pid, (caddr_t) dbregs_ptr, 0 ) == -1)
goto error;
#endif
}

View File

@ -0,0 +1,51 @@
--- server/context_i386.c.orig Wed Aug 14 13:59:03 2002
+++ server/context_i386.c Thu Nov 7 14:54:01 2002
@@ -371,14 +371,15 @@
{
#ifdef PTRACE_GETDBREGS
struct dbreg dbregs;
- if (ptrace( PTRACE_GETDBREGS, pid, (caddr_t) &dbregs, 0 ) == -1)
+ struct dbreg *dbregs_ptr = &dbregs; /* ptr to workaround buggy macro */
+ if (ptrace( PTRACE_GETDBREGS, pid, (caddr_t) dbregs_ptr, 0 ) == -1)
goto error;
- context->Dr0 = dbregs.dr0;
- context->Dr1 = dbregs.dr1;
- context->Dr2 = dbregs.dr2;
- context->Dr3 = dbregs.dr3;
- context->Dr6 = dbregs.dr6;
- context->Dr7 = dbregs.dr7;
+ context->Dr0 = DBREG_DRX(dbregs_ptr, 0);
+ context->Dr1 = DBREG_DRX(dbregs_ptr, 1);
+ context->Dr2 = DBREG_DRX(dbregs_ptr, 2);
+ context->Dr3 = DBREG_DRX(dbregs_ptr, 3);
+ context->Dr6 = DBREG_DRX(dbregs_ptr, 6);
+ context->Dr7 = DBREG_DRX(dbregs_ptr, 7);
#endif
}
if (flags & CONTEXT_FLOATING_POINT)
@@ -437,15 +438,16 @@
{
#ifdef PTRACE_SETDBREGS
struct dbreg dbregs;
- dbregs.dr0 = context->Dr0;
- dbregs.dr1 = context->Dr1;
- dbregs.dr2 = context->Dr2;
- dbregs.dr3 = context->Dr3;
- dbregs.dr4 = 0;
- dbregs.dr5 = 0;
- dbregs.dr6 = context->Dr6;
- dbregs.dr7 = context->Dr7;
- if (ptrace( PTRACE_SETDBREGS, pid, (caddr_t) &dbregs, 0 ) == -1)
+ struct dbreg *dbregs_ptr = &dbregs; /* ptr to workaround buggy macro */
+ DBREG_DRX(dbregs_ptr, 0) = context->Dr0;
+ DBREG_DRX(dbregs_ptr, 1) = context->Dr1;
+ DBREG_DRX(dbregs_ptr, 2) = context->Dr2;
+ DBREG_DRX(dbregs_ptr, 3) = context->Dr3;
+ DBREG_DRX(dbregs_ptr, 4) = 0;
+ DBREG_DRX(dbregs_ptr, 5) = 0;
+ DBREG_DRX(dbregs_ptr, 6) = context->Dr6;
+ DBREG_DRX(dbregs_ptr, 7) = context->Dr7;
+ if (ptrace( PTRACE_SETDBREGS, pid, (caddr_t) dbregs_ptr, 0 ) == -1)
goto error;
#endif
}