/* i386 specific core note handling.
   Copyright (C) 2007, 2008 Red Hat, Inc.
   This file is part of Red Hat elfutils.

   Red Hat elfutils 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; version 2 of the License.

   Red Hat elfutils 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 Red Hat elfutils; if not, write to the Free Software Foundation,
   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.

   Red Hat elfutils is an included package of the Open Invention Network.
   An included package of the Open Invention Network is a package for which
   Open Invention Network licensees cross-license their patents.  No patent
   license is granted, either expressly or impliedly, by designation as an
   included package.  Should you wish to participate in the Open Invention
   Network licensing program, please visit www.openinventionnetwork.com
   <http://www.openinventionnetwork.com>.  */

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <elf.h>
#include <inttypes.h>
#include <stddef.h>
#include <stdio.h>
#include <sys/time.h>

#define BACKEND i386_
#include "libebl_CPU.h"


static const Ebl_Register_Location prstatus_regs[] =
  {
#define GR(at, n, dwreg)						\
    { .offset = at * 4, .regno = dwreg, .count = n, .bits = 32 }
#define SR(at, n, dwreg)						\
    { .offset = at * 4, .regno = dwreg, .count = n, .bits = 16, .pad = 2 }

    GR (0, 1, 3),		/* %ebx */
    GR (1, 2, 1),		/* %ecx-%edx */
    GR (3, 2, 6),		/* %esi-%edi */
    GR (5, 1, 5),		/* %ebp */
    GR (6, 1, 0),		/* %eax */
    SR (7, 1, 43),		/* %ds */
    SR (8, 1, 40),		/* %es */
    SR (9, 1, 44),		/* %fs */
    SR (10, 1, 45),		/* %gs */
    /*  11, 1,			   orig_eax */
    GR (12, 1, 8),		/* %eip */
    SR (13, 1, 41),		/* %cs */
    GR (14, 1, 9),		/* eflags */
    GR (15, 1, 4),		/* %esp */
    SR (16, 1, 42),		/* %ss */

#undef	GR
#undef	SR
  };
#define PRSTATUS_REGS_SIZE	(17 * 4)

#define	ULONG			uint32_t
#define PID_T			int32_t
#define	UID_T			uint16_t
#define	GID_T			uint16_t
#define ALIGN_ULONG		4
#define ALIGN_PID_T		4
#define ALIGN_UID_T		2
#define ALIGN_GID_T		2
#define TYPE_ULONG		ELF_T_WORD
#define TYPE_PID_T		ELF_T_SWORD
#define TYPE_UID_T		ELF_T_HALF
#define TYPE_GID_T		ELF_T_HALF

#define PRSTATUS_REGSET_ITEMS						      \
  {									      \
    .name = "orig_eax", .type = ELF_T_SWORD, .format = 'd',		      \
    .offset = offsetof (struct EBLHOOK(prstatus), pr_reg) + (4 * 11),	      \
    .group = "register"	       			  	       	 	      \
  }

static const Ebl_Register_Location fpregset_regs[] =
  {
    { .offset = 0, .regno = 37, .count = 2, .bits = 32 }, /* fctrl-fstat */
    { .offset = 7 * 4, .regno = 11, .count = 8, .bits = 80 }, /* stN */
  };
#define FPREGSET_SIZE	108

static const Ebl_Register_Location prxfpreg_regs[] =
  {
    { .offset = 0, .regno = 37, .count = 2, .bits = 16 }, /* fctrl-fstat */
    { .offset = 24, .regno = 39, .count = 1, .bits = 32 }, /* mxcsr */
    { .offset = 32, .regno = 11, .count = 8, .bits = 80, .pad = 6 }, /* stN */
    { .offset = 32 + 128, .regno = 21, .count = 8, .bits = 128 }, /* xmm */
  };

#define	EXTRA_NOTES \
  EXTRA_REGSET (NT_PRFPXREG, 512, prxfpreg_regs) \
  case NT_386_TLS: \
    return tls_info (descsz, regs_offset, nregloc, reglocs, nitems, items); \
  EXTRA_NOTES_IOPERM

static const Ebl_Core_Item tls_items[] =
  {
    { .type = ELF_T_WORD, .offset = 0x0, .format = 'd', .name = "index" },
    { .type = ELF_T_WORD, .offset = 0x4, .format = 'x', .name = "base" },
    { .type = ELF_T_WORD, .offset = 0x8, .format = 'x', .name = "limit" },
    { .type = ELF_T_WORD, .offset = 0xc, .format = 'x', .name = "flags" },
  };

static int
tls_info (GElf_Word descsz, GElf_Word *regs_offset,
	  size_t *nregloc, const Ebl_Register_Location **reglocs,
	  size_t *nitems, const Ebl_Core_Item **items)
{
  if (descsz % 16 != 0)
    return 0;

  *regs_offset = 0;
  *nregloc = 0;
  *reglocs = NULL;
  *nitems = sizeof tls_items / sizeof tls_items[0];
  *items = tls_items;
  return 1;
}

#include "x86_corenote.c"
#include "linux-core-note.c"
