/* Low-level debug register code for GNU/Linux x86 (i386 and x86-64).

   Copyright (C) 1999-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef NAT_X86_LINUX_DREGS_H
#define NAT_X86_LINUX_DREGS_H

/* Return the address stored in the current inferior's debug register
   REGNUM.  */

extern CORE_ADDR x86_linux_dr_get_addr (int regnum);

/* Store ADDR in debug register REGNUM of all LWPs of the current
   inferior.  */

extern void x86_linux_dr_set_addr (int regnum, CORE_ADDR addr);

/* Return the value stored in the current inferior's debug control
   register.  */

extern unsigned long x86_linux_dr_get_control (void);

/* Store CONTROL in the debug control registers of all LWPs of the
   current inferior.  */

extern void x86_linux_dr_set_control (unsigned long control);

/* Return the value stored in the current inferior's debug status
   register.  */

extern unsigned long x86_linux_dr_get_status (void);

/* Update the thread's debug registers if the values in our local
   mirror have been changed.  */

extern void x86_linux_update_debug_registers (struct lwp_info *lwp);

#endif /* NAT_X86_LINUX_DREGS_H */
