mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-12 09:58:36 +00:00
Sync with sys/i386/i386/machdep.c revision 1.296.
This commit is contained in:
parent
dcf2c48fc9
commit
fa7cfb3b65
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=36187
@ -35,7 +35,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||||
* $Id: machdep.c,v 1.81 1998/03/24 08:27:19 kato Exp $
|
* $Id: machdep.c,v 1.82 1998/04/07 09:07:53 kato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "apm.h"
|
#include "apm.h"
|
||||||
@ -44,6 +44,7 @@
|
|||||||
#include "opt_cpu.h"
|
#include "opt_cpu.h"
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
#include "opt_maxmem.h"
|
#include "opt_maxmem.h"
|
||||||
|
#include "opt_msgbuf.h"
|
||||||
#include "opt_perfmon.h"
|
#include "opt_perfmon.h"
|
||||||
#include "opt_smp.h"
|
#include "opt_smp.h"
|
||||||
#include "opt_sysvipc.h"
|
#include "opt_sysvipc.h"
|
||||||
@ -126,11 +127,9 @@
|
|||||||
#include <i386/isa/rtc.h>
|
#include <i386/isa/rtc.h>
|
||||||
#endif
|
#endif
|
||||||
#include <machine/random.h>
|
#include <machine/random.h>
|
||||||
|
#include <sys/ptrace.h>
|
||||||
|
|
||||||
extern void init386 __P((int first));
|
extern void init386 __P((int first));
|
||||||
extern int ptrace_set_pc __P((struct proc *p, unsigned int addr));
|
|
||||||
extern int ptrace_single_step __P((struct proc *p));
|
|
||||||
extern int ptrace_write_u __P((struct proc *p, vm_offset_t off, int data));
|
|
||||||
extern void dblfault_handler __P((void));
|
extern void dblfault_handler __P((void));
|
||||||
|
|
||||||
extern void printcpuinfo(void); /* XXX header file */
|
extern void printcpuinfo(void); /* XXX header file */
|
||||||
@ -158,7 +157,7 @@ int bouncepages = 0;
|
|||||||
#endif /* BOUNCE_BUFFERS */
|
#endif /* BOUNCE_BUFFERS */
|
||||||
|
|
||||||
int msgbufmapped = 0; /* set when safe to use msgbuf */
|
int msgbufmapped = 0; /* set when safe to use msgbuf */
|
||||||
int _udatasel, _ucodesel;
|
int _udatasel, _ucodesel;
|
||||||
u_int atdevbase;
|
u_int atdevbase;
|
||||||
|
|
||||||
#if defined(SWTCH_OPTIM_STATS)
|
#if defined(SWTCH_OPTIM_STATS)
|
||||||
@ -1105,6 +1104,7 @@ init386(first)
|
|||||||
unsigned biosbasemem, biosextmem;
|
unsigned biosbasemem, biosextmem;
|
||||||
struct gate_descriptor *gdp;
|
struct gate_descriptor *gdp;
|
||||||
int gsel_tss;
|
int gsel_tss;
|
||||||
|
char *cp;
|
||||||
|
|
||||||
struct isa_device *idp;
|
struct isa_device *idp;
|
||||||
#ifndef SMP
|
#ifndef SMP
|
||||||
@ -1563,7 +1563,7 @@ init386(first)
|
|||||||
* calculation, etc.).
|
* calculation, etc.).
|
||||||
*/
|
*/
|
||||||
while (phys_avail[pa_indx - 1] + PAGE_SIZE +
|
while (phys_avail[pa_indx - 1] + PAGE_SIZE +
|
||||||
round_page(sizeof(struct msgbuf)) >= phys_avail[pa_indx]) {
|
round_page(MSGBUF_SIZE) >= phys_avail[pa_indx]) {
|
||||||
physmem -= atop(phys_avail[pa_indx] - phys_avail[pa_indx - 1]);
|
physmem -= atop(phys_avail[pa_indx] - phys_avail[pa_indx - 1]);
|
||||||
phys_avail[pa_indx--] = 0;
|
phys_avail[pa_indx--] = 0;
|
||||||
phys_avail[pa_indx--] = 0;
|
phys_avail[pa_indx--] = 0;
|
||||||
@ -1572,16 +1572,25 @@ init386(first)
|
|||||||
Maxmem = atop(phys_avail[pa_indx]);
|
Maxmem = atop(phys_avail[pa_indx]);
|
||||||
|
|
||||||
/* Trim off space for the message buffer. */
|
/* Trim off space for the message buffer. */
|
||||||
phys_avail[pa_indx] -= round_page(sizeof(struct msgbuf));
|
phys_avail[pa_indx] -= round_page(MSGBUF_SIZE);
|
||||||
|
|
||||||
avail_end = phys_avail[pa_indx];
|
avail_end = phys_avail[pa_indx];
|
||||||
|
|
||||||
/* now running on new page tables, configured,and u/iom is accessible */
|
/* now running on new page tables, configured,and u/iom is accessible */
|
||||||
|
|
||||||
/* Map the message buffer. */
|
/* Map the message buffer. */
|
||||||
for (off = 0; off < round_page(sizeof(struct msgbuf)); off += PAGE_SIZE)
|
for (off = 0; off < round_page(MSGBUF_SIZE); off += PAGE_SIZE)
|
||||||
pmap_enter(kernel_pmap, (vm_offset_t)msgbufp + off,
|
pmap_enter(kernel_pmap, (vm_offset_t)msgbufp + off,
|
||||||
avail_end + off, VM_PROT_ALL, TRUE);
|
avail_end + off, VM_PROT_ALL, TRUE);
|
||||||
|
|
||||||
|
cp = (char *)msgbufp;
|
||||||
|
msgbufp = (struct msgbuf *) (cp + MSGBUF_SIZE - sizeof(*msgbufp));
|
||||||
|
if (msgbufp->msg_magic != MSG_MAGIC || msgbufp->msg_ptr != cp) {
|
||||||
|
bzero(cp, MSGBUF_SIZE);
|
||||||
|
msgbufp->msg_magic = MSG_MAGIC;
|
||||||
|
msgbufp->msg_size = (char *)msgbufp - cp;
|
||||||
|
msgbufp->msg_ptr = cp;
|
||||||
|
}
|
||||||
msgbufmapped = 1;
|
msgbufmapped = 1;
|
||||||
|
|
||||||
/* make a call gate to reenter kernel with */
|
/* make a call gate to reenter kernel with */
|
||||||
@ -1625,7 +1634,6 @@ f00f_hack(void *unused) {
|
|||||||
struct region_descriptor r_idt;
|
struct region_descriptor r_idt;
|
||||||
#endif
|
#endif
|
||||||
vm_offset_t tmp;
|
vm_offset_t tmp;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!has_f00f_bug)
|
if (!has_f00f_bug)
|
||||||
return;
|
return;
|
||||||
@ -1668,6 +1676,28 @@ ptrace_single_step(p)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ptrace_read_u_check(p, addr, len)
|
||||||
|
struct proc *p;
|
||||||
|
vm_offset_t addr;
|
||||||
|
size_t len;
|
||||||
|
{
|
||||||
|
vm_offset_t gap;
|
||||||
|
|
||||||
|
if ((vm_offset_t) (addr + len) < addr)
|
||||||
|
return EPERM;
|
||||||
|
if ((vm_offset_t) (addr + len) <= sizeof(struct user))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
gap = (char *) p->p_md.md_regs - (char *) p->p_addr;
|
||||||
|
|
||||||
|
if ((vm_offset_t) addr < gap)
|
||||||
|
return EPERM;
|
||||||
|
if ((vm_offset_t) (addr + len) <=
|
||||||
|
(vm_offset_t) (gap + sizeof(struct trapframe)))
|
||||||
|
return 0;
|
||||||
|
return EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
int ptrace_write_u(p, off, data)
|
int ptrace_write_u(p, off, data)
|
||||||
struct proc *p;
|
struct proc *p;
|
||||||
vm_offset_t off;
|
vm_offset_t off;
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||||
* $Id: machdep.c,v 1.81 1998/03/24 08:27:19 kato Exp $
|
* $Id: machdep.c,v 1.82 1998/04/07 09:07:53 kato Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "apm.h"
|
#include "apm.h"
|
||||||
@ -44,6 +44,7 @@
|
|||||||
#include "opt_cpu.h"
|
#include "opt_cpu.h"
|
||||||
#include "opt_ddb.h"
|
#include "opt_ddb.h"
|
||||||
#include "opt_maxmem.h"
|
#include "opt_maxmem.h"
|
||||||
|
#include "opt_msgbuf.h"
|
||||||
#include "opt_perfmon.h"
|
#include "opt_perfmon.h"
|
||||||
#include "opt_smp.h"
|
#include "opt_smp.h"
|
||||||
#include "opt_sysvipc.h"
|
#include "opt_sysvipc.h"
|
||||||
@ -126,11 +127,9 @@
|
|||||||
#include <i386/isa/rtc.h>
|
#include <i386/isa/rtc.h>
|
||||||
#endif
|
#endif
|
||||||
#include <machine/random.h>
|
#include <machine/random.h>
|
||||||
|
#include <sys/ptrace.h>
|
||||||
|
|
||||||
extern void init386 __P((int first));
|
extern void init386 __P((int first));
|
||||||
extern int ptrace_set_pc __P((struct proc *p, unsigned int addr));
|
|
||||||
extern int ptrace_single_step __P((struct proc *p));
|
|
||||||
extern int ptrace_write_u __P((struct proc *p, vm_offset_t off, int data));
|
|
||||||
extern void dblfault_handler __P((void));
|
extern void dblfault_handler __P((void));
|
||||||
|
|
||||||
extern void printcpuinfo(void); /* XXX header file */
|
extern void printcpuinfo(void); /* XXX header file */
|
||||||
@ -158,7 +157,7 @@ int bouncepages = 0;
|
|||||||
#endif /* BOUNCE_BUFFERS */
|
#endif /* BOUNCE_BUFFERS */
|
||||||
|
|
||||||
int msgbufmapped = 0; /* set when safe to use msgbuf */
|
int msgbufmapped = 0; /* set when safe to use msgbuf */
|
||||||
int _udatasel, _ucodesel;
|
int _udatasel, _ucodesel;
|
||||||
u_int atdevbase;
|
u_int atdevbase;
|
||||||
|
|
||||||
#if defined(SWTCH_OPTIM_STATS)
|
#if defined(SWTCH_OPTIM_STATS)
|
||||||
@ -1105,6 +1104,7 @@ init386(first)
|
|||||||
unsigned biosbasemem, biosextmem;
|
unsigned biosbasemem, biosextmem;
|
||||||
struct gate_descriptor *gdp;
|
struct gate_descriptor *gdp;
|
||||||
int gsel_tss;
|
int gsel_tss;
|
||||||
|
char *cp;
|
||||||
|
|
||||||
struct isa_device *idp;
|
struct isa_device *idp;
|
||||||
#ifndef SMP
|
#ifndef SMP
|
||||||
@ -1563,7 +1563,7 @@ init386(first)
|
|||||||
* calculation, etc.).
|
* calculation, etc.).
|
||||||
*/
|
*/
|
||||||
while (phys_avail[pa_indx - 1] + PAGE_SIZE +
|
while (phys_avail[pa_indx - 1] + PAGE_SIZE +
|
||||||
round_page(sizeof(struct msgbuf)) >= phys_avail[pa_indx]) {
|
round_page(MSGBUF_SIZE) >= phys_avail[pa_indx]) {
|
||||||
physmem -= atop(phys_avail[pa_indx] - phys_avail[pa_indx - 1]);
|
physmem -= atop(phys_avail[pa_indx] - phys_avail[pa_indx - 1]);
|
||||||
phys_avail[pa_indx--] = 0;
|
phys_avail[pa_indx--] = 0;
|
||||||
phys_avail[pa_indx--] = 0;
|
phys_avail[pa_indx--] = 0;
|
||||||
@ -1572,16 +1572,25 @@ init386(first)
|
|||||||
Maxmem = atop(phys_avail[pa_indx]);
|
Maxmem = atop(phys_avail[pa_indx]);
|
||||||
|
|
||||||
/* Trim off space for the message buffer. */
|
/* Trim off space for the message buffer. */
|
||||||
phys_avail[pa_indx] -= round_page(sizeof(struct msgbuf));
|
phys_avail[pa_indx] -= round_page(MSGBUF_SIZE);
|
||||||
|
|
||||||
avail_end = phys_avail[pa_indx];
|
avail_end = phys_avail[pa_indx];
|
||||||
|
|
||||||
/* now running on new page tables, configured,and u/iom is accessible */
|
/* now running on new page tables, configured,and u/iom is accessible */
|
||||||
|
|
||||||
/* Map the message buffer. */
|
/* Map the message buffer. */
|
||||||
for (off = 0; off < round_page(sizeof(struct msgbuf)); off += PAGE_SIZE)
|
for (off = 0; off < round_page(MSGBUF_SIZE); off += PAGE_SIZE)
|
||||||
pmap_enter(kernel_pmap, (vm_offset_t)msgbufp + off,
|
pmap_enter(kernel_pmap, (vm_offset_t)msgbufp + off,
|
||||||
avail_end + off, VM_PROT_ALL, TRUE);
|
avail_end + off, VM_PROT_ALL, TRUE);
|
||||||
|
|
||||||
|
cp = (char *)msgbufp;
|
||||||
|
msgbufp = (struct msgbuf *) (cp + MSGBUF_SIZE - sizeof(*msgbufp));
|
||||||
|
if (msgbufp->msg_magic != MSG_MAGIC || msgbufp->msg_ptr != cp) {
|
||||||
|
bzero(cp, MSGBUF_SIZE);
|
||||||
|
msgbufp->msg_magic = MSG_MAGIC;
|
||||||
|
msgbufp->msg_size = (char *)msgbufp - cp;
|
||||||
|
msgbufp->msg_ptr = cp;
|
||||||
|
}
|
||||||
msgbufmapped = 1;
|
msgbufmapped = 1;
|
||||||
|
|
||||||
/* make a call gate to reenter kernel with */
|
/* make a call gate to reenter kernel with */
|
||||||
@ -1625,7 +1634,6 @@ f00f_hack(void *unused) {
|
|||||||
struct region_descriptor r_idt;
|
struct region_descriptor r_idt;
|
||||||
#endif
|
#endif
|
||||||
vm_offset_t tmp;
|
vm_offset_t tmp;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!has_f00f_bug)
|
if (!has_f00f_bug)
|
||||||
return;
|
return;
|
||||||
@ -1668,6 +1676,28 @@ ptrace_single_step(p)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ptrace_read_u_check(p, addr, len)
|
||||||
|
struct proc *p;
|
||||||
|
vm_offset_t addr;
|
||||||
|
size_t len;
|
||||||
|
{
|
||||||
|
vm_offset_t gap;
|
||||||
|
|
||||||
|
if ((vm_offset_t) (addr + len) < addr)
|
||||||
|
return EPERM;
|
||||||
|
if ((vm_offset_t) (addr + len) <= sizeof(struct user))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
gap = (char *) p->p_md.md_regs - (char *) p->p_addr;
|
||||||
|
|
||||||
|
if ((vm_offset_t) addr < gap)
|
||||||
|
return EPERM;
|
||||||
|
if ((vm_offset_t) (addr + len) <=
|
||||||
|
(vm_offset_t) (gap + sizeof(struct trapframe)))
|
||||||
|
return 0;
|
||||||
|
return EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
int ptrace_write_u(p, off, data)
|
int ptrace_write_u(p, off, data)
|
||||||
struct proc *p;
|
struct proc *p;
|
||||||
vm_offset_t off;
|
vm_offset_t off;
|
||||||
|
Loading…
Reference in New Issue
Block a user