• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Print contents of core note.
2    Copyright (C) 2002, 2004 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@redhat.com>, 2002.
4 
5    This program is Open Source software; you can redistribute it and/or
6    modify it under the terms of the Open Software License version 1.0 as
7    published by the Open Source Initiative.
8 
9    You should have received a copy of the Open Software License along
10    with this program; if not, you may obtain a copy of the Open Software
11    License version 1.0 from http://www.opensource.org/licenses/osl.php or
12    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
13    3001 King Ranch Road, Ukiah, CA 95482.   */
14 
15 #ifdef HAVE_CONFIG_H
16 # include <config.h>
17 #endif
18 
19 #include <inttypes.h>
20 #include <stdio.h>
21 #include <stddef.h>
22 #include <libeblP.h>
23 
24 
25 void
ebl_core_note(ebl,name,type,descsz,desc)26 ebl_core_note (ebl, name, type, descsz, desc)
27      Ebl *ebl;
28      const char *name;
29      uint32_t type;
30      uint32_t descsz;
31      const char *desc;
32 {
33   int class = gelf_getclass (ebl->elf);
34 
35   if (! ebl->core_note (name, type, descsz, desc))
36     /* The machine specific function did not know this type.  */
37     switch (type)
38       {
39       case NT_PLATFORM:
40 	printf (gettext ("    Platform: %.*s\n"), (int) descsz, desc);
41 	break;
42 
43       case NT_AUXV:
44 	;
45 	size_t cnt;
46 	size_t elsize = (class == ELFCLASS32
47 			 ? sizeof (Elf32_auxv_t) : sizeof (Elf64_auxv_t));
48 
49 	for (cnt = 0; (cnt + 1) * elsize <= descsz; ++cnt)
50 	  {
51 	    unsigned long int atype;
52 	    unsigned long int val;
53 
54 	    if (class == ELFCLASS32)
55 	      {
56 		Elf32_auxv_t *auxv = &((Elf32_auxv_t *) desc)[cnt];
57 
58 		atype = auxv->a_type;
59 		val = auxv->a_un.a_val;
60 	      }
61 	    else
62 	      {
63 		Elf64_auxv_t *auxv = &((Elf64_auxv_t *) desc)[cnt];
64 
65 		atype = auxv->a_type;
66 		val = auxv->a_un.a_val;
67 	      }
68 
69 	    /* XXX Do we need the auxiliary vector info anywhere
70 	       else?  If yes, move code into a separate function.  */
71 	    const char *at;
72 
73 	    switch (atype)
74 	      {
75 #define NEW_AT(name) case AT_##name: at = #name; break
76 		NEW_AT (NULL);
77 		NEW_AT (IGNORE);
78 		NEW_AT (EXECFD);
79 		NEW_AT (PHDR);
80 		NEW_AT (PHENT);
81 		NEW_AT (PHNUM);
82 		NEW_AT (PAGESZ);
83 		NEW_AT (BASE);
84 		NEW_AT (FLAGS);
85 		NEW_AT (ENTRY);
86 		NEW_AT (NOTELF);
87 		NEW_AT (UID);
88 		NEW_AT (EUID);
89 		NEW_AT (GID);
90 		NEW_AT (EGID);
91 		NEW_AT (CLKTCK);
92 		NEW_AT (PLATFORM);
93 		NEW_AT (HWCAP);
94 		NEW_AT (FPUCW);
95 		NEW_AT (DCACHEBSIZE);
96 		NEW_AT (ICACHEBSIZE);
97 		NEW_AT (UCACHEBSIZE);
98 		NEW_AT (IGNOREPPC);
99 
100 	      default:
101 		at = "???";
102 		break;
103 	      }
104 
105 	    switch (atype)
106 	      {
107 	      case AT_NULL:
108 	      case AT_IGNORE:
109 	      case AT_IGNOREPPC:
110 	      case AT_NOTELF:
111 	      default:
112 		printf ("    %s\n", at);
113 		break;
114 
115 	      case AT_EXECFD:
116 	      case AT_PHENT:
117 	      case AT_PHNUM:
118 	      case AT_PAGESZ:
119 	      case AT_UID:
120 	      case AT_EUID:
121 	      case AT_GID:
122 	      case AT_EGID:
123 	      case AT_CLKTCK:
124 	      case AT_FPUCW:
125 	      case AT_DCACHEBSIZE:
126 	      case AT_ICACHEBSIZE:
127 	      case AT_UCACHEBSIZE:
128 		printf ("    %s: %" PRId64 "\n", at, (int64_t) val);
129 		break;
130 
131 	      case AT_PHDR:
132 	      case AT_BASE:
133 	      case AT_FLAGS:	/* XXX Print flags?  */
134 	      case AT_ENTRY:
135 	      case AT_PLATFORM:	/* XXX Get string?  */
136 	      case AT_HWCAP:	/* XXX Print flags?  */
137 		printf ("    %s: %" PRIx64 "\n", at, (uint64_t) val);
138 		break;
139 	      }
140 
141 	    if (atype == AT_NULL)
142 	      /* Reached the end.  */
143 	      break;
144 	  }
145 	break;
146 
147       default:
148 	/* Unknown type.  */
149 	break;
150       }
151 }
152