This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Falk Hueffner <falk.hueffner@student.uni-tuebingen.de> writes: > Hi, > > this add support for Alpha hwcaps. Since the scheme of orthogonal > hwcap bits simply doesn't fit with Alpha, which has plain linear > feature inclusion, I had to replace the whole _dl_important_hwcaps. > Obviously, as I've done it is not the best solution, how can I achieve > this in a nicer way? > > --- sysdeps/generic/dl-sysdep.c.orig 2004-02-29 02:52:07.000000000 +0100 > +++ sysdeps/generic/dl-sysdep.c 2004-02-29 03:25:43.000000000 +0100 You never add architecture support to a file in sysdeps/generic. Instead create you own file in sysdeps/alpha/ Andreas > @@ -336,6 +336,71 @@ > _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, > size_t *max_capstrlen) > { > +#ifdef __alpha__ > + enum { > + ARCH_EV7, > + ARCH_EV68, > + ARCH_EV67, > + ARCH_EV6, > + ARCH_PCA56, > + ARCH_EV56, > + ARCH_EV5, > + ARCH_EV4, > + ARCH_END = ARCH_EV4 > + }; > +#define STRLENPAIR(S) { S, sizeof S - 1 } > + static const struct r_strlenpair archs[] = { > + STRLENPAIR("ev7/"), > + STRLENPAIR("ev68/"), > + STRLENPAIR("ev67/"), > + STRLENPAIR("ev6/"), > + STRLENPAIR("pca56/"), > + STRLENPAIR("ev56/"), > + STRLENPAIR("ev5/"), > + }; > + enum { > + AMASK_BWX = 1 << 0, > + AMASK_FIX = 1 << 1, > + AMASK_CIX = 1 << 2, > + AMASK_MVI = 1 << 8, > + AMASK_PREC_TRAPS = 1 << 9, > + AMASK_PREFETCH_WH = 1 << 12, > + }; > + enum { IMPLVER_EV4, IMPLVER_EV5, IMPLVER_EV6, IMPLVER_EV7 }; > + unsigned long implver, amask; > + int arch; > + > + asm ("implver %0" : "=r" (implver)); > + asm ("amask %1,%0" : "=r" (amask) : "r" (-1)); > + amask = ~amask; > + > + if (implver == IMPLVER_EV4) > + arch = ARCH_EV4; > + else if (implver == IMPLVER_EV5) > + { > + if (amask & AMASK_MVI) > + arch = ARCH_PCA56; > + else if (amask & AMASK_BWX) > + arch = ARCH_EV56; > + else > + arch = ARCH_EV5; > + } > + else if (implver == IMPLVER_EV6) > + { > + if (amask & AMASK_PREFETCH_WH) > + arch = ARCH_EV68; > + else if (amask & AMASK_CIX) > + arch = ARCH_EV67; > + else > + arch = ARCH_EV6; > + } > + else > + arch = ARCH_EV7; > + > + *sz = ARCH_END - arch; > + *max_capstrlen = strlen("pca56/"); > + return archs + arch; > +#else > /* Determine how many important bits are set. */ > unsigned long int masked = GL(dl_hwcap) & GL(dl_hwcap_mask); > size_t cnt = platform != NULL; > @@ -511,4 +576,5 @@ > *max_capstrlen = result[0].len; > > return result; > +#endif > } Andreas -- Andreas Jaeger, aj@suse.de, http://www.suse.de/~aj SuSE Linux AG, Maxfeldstr. 5, 90409 Nürnberg, Germany GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126
Attachment:
pgp00000.pgp
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |