2006-07-14 00:50:51 +00:00
|
|
|
/*-
|
2017-11-27 15:04:10 +00:00
|
|
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
|
|
*
|
2006-07-14 00:50:51 +00:00
|
|
|
* Copyright (c) 2006 Olivier Houchard
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _MACHINE_GDB_MACHDEP_H_
|
|
|
|
#define _MACHINE_GDB_MACHDEP_H_
|
|
|
|
|
|
|
|
#define GDB_BUFSZ 400
|
|
|
|
#define GDB_NREGS 26
|
2020-12-07 15:09:28 +00:00
|
|
|
#define GDB_REG_SP 13
|
|
|
|
#define GDB_REG_LR 14
|
2006-07-14 00:50:51 +00:00
|
|
|
#define GDB_REG_PC 15
|
|
|
|
|
|
|
|
static __inline size_t
|
2020-11-27 16:35:43 +00:00
|
|
|
gdb_cpu_regsz(int regnum)
|
2006-07-14 00:50:51 +00:00
|
|
|
{
|
2020-11-27 16:35:43 +00:00
|
|
|
/*
|
|
|
|
* GDB expects the FPA registers f0-f7, each 96 bits wide, to be placed
|
|
|
|
* in between the PC and CSPR in response to a "g" packet.
|
|
|
|
*/
|
|
|
|
return (regnum >= 16 && regnum <= 23 ? 12 : sizeof(int));
|
2006-07-14 00:50:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static __inline int
|
|
|
|
gdb_cpu_query(void)
|
|
|
|
{
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
amd64: Protect the kernel text, data, and BSS by setting the RW/NX bits
correctly for the data contained on each memory page.
There are several components to this change:
* Add a variable to indicate the start of the R/W portion of the
initial memory.
* Stop detecting NX bit support for each AP. Instead, use the value
from the BSP and, if supported, activate the feature on the other
APs just before loading the correct page table. (Functionally, we
already assume that the BSP and all APs had the same support or
lack of support for the NX bit.)
* Set the RW and NX bits correctly for the kernel text, data, and
BSS (subject to some caveats below).
* Ensure DDB can write to memory when necessary (such as to set a
breakpoint).
* Ensure GDB can write to memory when necessary (such as to set a
breakpoint). For this purpose, add new MD functions gdb_begin_write()
and gdb_end_write() which the GDB support code can call before and
after writing to memory.
This change is not comprehensive:
* It doesn't do anything to protect modules.
* It doesn't do anything for kernel memory allocated after the kernel
starts running.
* In order to avoid excessive memory inefficiency, it may let multiple
types of data share a 2M page, and assigns the most permissions
needed for data on that page.
Reviewed by: jhb, kib
Discussed with: emaste
MFC after: 2 weeks
Sponsored by: Netflix
Differential Revision: https://reviews.freebsd.org/D14282
2018-03-06 14:28:37 +00:00
|
|
|
static __inline void *
|
|
|
|
gdb_begin_write(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
return (NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
static __inline void
|
|
|
|
gdb_end_write(void *arg __unused)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-03-08 19:04:51 +00:00
|
|
|
static __inline void
|
|
|
|
gdb_cpu_stop_reason(int type __unused, int code __unused)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2006-07-14 00:50:51 +00:00
|
|
|
void *gdb_cpu_getreg(int, size_t *);
|
|
|
|
void gdb_cpu_setreg(int, void *);
|
|
|
|
int gdb_cpu_signal(int, int);
|
|
|
|
|
|
|
|
#endif /* !_MACHINE_GDB_MACHDEP_H_ */
|