Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Cleanup ARM ioperm implementation (step 2)
Since GLIBC requires a minimum 2.6.32 kernel, the sysctl (CTL_BUS,
CTL_BUS_ISA, ISA_*) is always available.  We can therefore remove the
fallback code reading /etc/arm_systype or parsing /proc/cpuinfo.

Remove fscanf from localplt.data as it is no longer called from within
GLIBC.

	* sysdeps/unix/sysv/linux/arm/ioperm.c: Do not include <string.h>.
	(PATH_ARM_SYSTYPE): Remove.
	(PATH_CPUINFO): Likewise.
	(IO_BASE_FOOTBRIDGE): Likewise.
	(IO_SHIFT_FOOTBRIDGE): Likewise.
	(struct platform): Likewise.
	(init_iosys): Remove compatibility code for 2.4 kernels.
	* sysdeps/unix/sysv/linux/arm/localplt.data: Remove fscanf.
  • Loading branch information
Aurelien Jarno committed Dec 30, 2015
1 parent a82cd94 commit cc42170
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 93 deletions.
11 changes: 11 additions & 0 deletions ChangeLog
@@ -1,3 +1,14 @@
2015-12-30 Aurelien Jarno <aurelien@aurel32.net>

* sysdeps/unix/sysv/linux/arm/ioperm.c: Do not include <string.h>.
(PATH_ARM_SYSTYPE): Remove.
(PATH_CPUINFO): Likewise.
(IO_BASE_FOOTBRIDGE): Likewise.
(IO_SHIFT_FOOTBRIDGE): Likewise.
(struct platform): Likewise.
(init_iosys): Remove compatibility code for 2.4 kernels.
* sysdeps/unix/sysv/linux/arm/localplt.data: Remove fscanf.

2015-12-29 Florian Weimer <fweimer@redhat.com>

* malloc/tst-malloc-thread-fail.c: New file.
Expand Down
95 changes: 3 additions & 92 deletions sysdeps/unix/sysv/linux/arm/ioperm.c
Expand Up @@ -37,17 +37,13 @@
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <sys/types.h>
#include <sys/mman.h>

#include <sys/sysctl.h>

#define PATH_ARM_SYSTYPE "/etc/arm_systype"
#define PATH_CPUINFO "/proc/cpuinfo"

#define MAX_PORT 0x10000

static struct {
Expand All @@ -57,47 +53,16 @@ static struct {
unsigned int initdone; /* since all the above could be 0 */
} io;

#define IO_BASE_FOOTBRIDGE 0x7c000000
#define IO_SHIFT_FOOTBRIDGE 0

static struct platform {
const char *name;
unsigned long int io_base;
unsigned int shift;
} platform[] = {
/* All currently supported platforms are in fact the same. :-) */
{"Chalice-CATS", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
{"DEC-EBSA285", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
{"Corel-NetWinder", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
{"Rebel-NetWinder", IO_BASE_FOOTBRIDGE, IO_SHIFT_FOOTBRIDGE},
};

#define IO_ADDR(port) (io.base + ((port) << io.shift))

/*
* Initialize I/O system. There are several ways to get the information
* we need. Each is tried in turn until one succeeds.
*
* 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method
* but not all kernels support it.
*
* 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE.
* - If it matches one of the entries in the table above, use the
* corresponding values.
* - If it begins with a number, assume this is a previously
* unsupported system and the values encode, in order,
* "<io_base>,<port_shift>".
*
* 3. Lookup the "system type" field in /proc/cpuinfo. Again, if it
* matches an entry in the platform[] table, use the corresponding
* values.
* Initialize I/O system. The io_bae and port_shift values are fetched
* using sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*).
*/

static int
init_iosys (void)
{
char systype[256];
int i, n;
static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE };
static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT };
size_t len = sizeof(io.base);
Expand All @@ -109,61 +74,7 @@ init_iosys (void)
return 0;
}

n = __readlink (PATH_ARM_SYSTYPE, systype, sizeof (systype) - 1);
if (n > 0)
{
systype[n] = '\0';
if (isdigit (systype[0]))
{
if (sscanf (systype, "%li,%i", &io.io_base, &io.shift) == 2)
{
io.initdone = 1;
return 0;
}
/* else we're likely going to fail with the system match below */
}
}
else
{
FILE * fp;

fp = fopen (PATH_CPUINFO, "rce");
if (! fp)
return -1;
while ((n = fscanf (fp, "Hardware\t: %256[^\n]\n", systype))
!= EOF)
{
if (n == 1)
break;
else
fgets_unlocked (systype, 256, fp);
}
fclose (fp);

if (n == EOF)
{
/* this can happen if the format of /proc/cpuinfo changes... */
fprintf (stderr,
"ioperm: Unable to determine system type.\n"
"\t(May need " PATH_ARM_SYSTYPE " symlink?)\n");
__set_errno (ENODEV);
return -1;
}
}

/* translate systype name into i/o system: */
for (i = 0; i < sizeof (platform) / sizeof (platform[0]); ++i)
{
if (strcmp (platform[i].name, systype) == 0)
{
io.shift = platform[i].shift;
io.io_base = platform[i].io_base;
io.initdone = 1;
return 0;
}
}

/* systype is not a known platform name... */
/* sysctl has failed... */
__set_errno (ENODEV);
return -1;
}
Expand Down
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/arm/localplt.data
@@ -1,6 +1,5 @@
libc.so: calloc
libc.so: free
libc.so: fscanf
libc.so: malloc
libc.so: memalign
libc.so: raise
Expand Down

0 comments on commit cc42170

Please sign in to comment.