[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commits] r3273 - in /fsf/trunk/libc: ./ debug/ iconvdata/ locale/programs/ nis/ posix/ stdio-common/ sunrpc/ sysdeps/x86_64/



Author: eglibc
Date: Sun Aug 26 00:03:31 2007
New Revision: 3273

Log:
Import glibc-mainline for 2007-08-26

Modified:
    fsf/trunk/libc/ChangeLog
    fsf/trunk/libc/Makerules
    fsf/trunk/libc/config.make.in
    fsf/trunk/libc/debug/Makefile
    fsf/trunk/libc/iconvdata/iso-2022-cn.c
    fsf/trunk/libc/iconvdata/iso-2022-kr.c
    fsf/trunk/libc/locale/programs/ld-collate.c
    fsf/trunk/libc/nis/nis_xdr.c
    fsf/trunk/libc/nis/yp_xdr.c
    fsf/trunk/libc/posix/regex_internal.h
    fsf/trunk/libc/posix/tst-rfc3484-2.c
    fsf/trunk/libc/posix/tst-rfc3484.c
    fsf/trunk/libc/stdio-common/Makefile
    fsf/trunk/libc/sunrpc/key_prot.c
    fsf/trunk/libc/sysdeps/x86_64/cacheinfo.c

Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Sun Aug 26 00:03:31 2007
@@ -1,3 +1,48 @@
+2007-08-25  Ulrich Drepper  <drepper@xxxxxxxxxx>
+
+	* iconvdata/iso-2022-kr.c (BODY): Fake initialization of array buf
+	to keep gcc quiet.
+	* iconvdata/iso-2022-cn.c (BODY): Likewise.
+
+	* locale/programs/ld-collate.c (collate_output): Avoid warning if
+	NDEBUG is defined.
+
+	* Makerules: Use -p option with mkdir.
+
+	* sunrpc/key_prot.c (xdr_unixcred): Work around gcc alias warning.
+	* nis/nis_xdr.c (_xdr_nis_server): Likewise.
+	(_xdr_directory_obj): Likewise.
+	(xdr_entry_obj): Likewise.
+	(xdr_group_obj): Likewise.
+	(xdr_link_obj): Likewise.
+	(xdr_table_obj): Likewise.
+	(_xdr_nis_result): Likewise.
+	(_xdr_ns_request): Likewise.
+	(_xdr_ib_request): Likewise.
+	(_xdr_nis_taglist): Likewise.
+	(xdr_cback_data): Likewise.
+	* nis/yp_xdr.c (xdr_ypmaplist): Likewise.
+	(xdr_ypresp_maplist): Likewise.
+
+	* stdio-common/Makefile: Avoid format string warning for tst-sprint.
+
+	* posix/regex_internal.h: Prevent some declarations and definitions
+	to be seen when used in tests.
+
+	* posix/tst-rfc3484.c (__idna_to_unicode_lzlz): Initialize *OUTPUT.
+	* posix/tst-rfc3484-2.c (__idna_to_unicode_lzlz): Likewise.
+
+	* debug/Makefile: Disable format checking when compiling tst-chk?.c.
+
+	* config.make.in (datarootdir): Add to shut up configure.
+
+	* sysdeps/x86_64/cacheinfo.c (handle_amd): Fix computation of
+	associativity for fully-associative caches.
+
+	* sysdeps/x86_64/cacheinfo.c (handle_amd): Handle L3 cache
+	requests.  Fill on more associativity values for L2.
+	Patch mostly by Evandro Menezes.
+
 2007-08-24  Ulrich Drepper  <drepper@xxxxxxxxxx>
 
 	* sysdeps/unix/sysv/linux/x86_64/init-first.c
@@ -7,7 +52,7 @@
 	* resolv/arpa/nameser.h (NS_OPT_DNSSEC_OK): Define.
 
 	* sysdeps/unix/sysv/linux/i386/syscalls.list: No reason to mark
-	fallocate64 as EXTRA< it is not referenced if the symbol isn't
+	fallocate64 as EXTRA.  It is not referenced if the symbol isn't
 	defined.
 
 2007-08-23  Ulrich Drepper  <drepper@xxxxxxxxxx>

Modified: fsf/trunk/libc/Makerules
==============================================================================
--- fsf/trunk/libc/Makerules (original)
+++ fsf/trunk/libc/Makerules Sun Aug 26 00:03:31 2007
@@ -732,7 +732,9 @@
 # Generic rule for making directories.
 %/:
 # mkdir isn't smart enough to strip a trailing /.
-	mkdir $(@:%/=%)
+# We always require a mkdir which supports the -p option to avoid error
+# messages in case of races.
+	mkdir -p $(@:%/=%)
 
 # Make sure that object files are not removed
 # when they are intermediates between sources and library members.

Modified: fsf/trunk/libc/config.make.in
==============================================================================
--- fsf/trunk/libc/config.make.in (original)
+++ fsf/trunk/libc/config.make.in Sun Aug 26 00:03:31 2007
@@ -17,6 +17,7 @@
 rootsbindir = @libc_cv_rootsbindir@
 infodir = @infodir@
 includedir = @includedir@
+datarootdir = @datarootdir@
 
 # Should we use and build ldconfig?
 use-ldconfig = @use_ldconfig@

Modified: fsf/trunk/libc/debug/Makefile
==============================================================================
--- fsf/trunk/libc/debug/Makefile (original)
+++ fsf/trunk/libc/debug/Makefile Sun Aug 26 00:03:31 2007
@@ -72,6 +72,11 @@
 CFLAGS-recv_chk.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-recvfrom_chk.c = -fexceptions -fasynchronous-unwind-tables
 
+# We know these tests have problems with format strings, this is what
+# we are testing.  Disable that warning.
+CFLAGS-tst-chk1.c = -Wno-format
+CFLAGS-tst-chk2.c = -Wno-format
+CFLAGS-tst-chk3.c = -Wno-format
 tst-chk1-ENV = LOCPATH=$(common-objpfx)localedata
 tst-chk2-ENV = LOCPATH=$(common-objpfx)localedata
 tst-chk3-ENV = LOCPATH=$(common-objpfx)localedata

Modified: fsf/trunk/libc/iconvdata/iso-2022-cn.c
==============================================================================
--- fsf/trunk/libc/iconvdata/iso-2022-cn.c (original)
+++ fsf/trunk/libc/iconvdata/iso-2022-cn.c Sun Aug 26 00:03:31 2007
@@ -264,6 +264,9 @@
     else								      \
       {									      \
 	unsigned char buf[2];						      \
+	/* Fake initialization to keep gcc quiet.  */			      \
+	asm ("" : "=m" (buf));						      \
+									      \
 	int used;							      \
 	size_t written = 0;						      \
 									      \

Modified: fsf/trunk/libc/iconvdata/iso-2022-kr.c
==============================================================================
--- fsf/trunk/libc/iconvdata/iso-2022-kr.c (original)
+++ fsf/trunk/libc/iconvdata/iso-2022-kr.c Sun Aug 26 00:03:31 2007
@@ -200,9 +200,7 @@
 #define LOOPFCT			TO_LOOP
 #define BODY \
   {									      \
-    uint32_t ch;							      \
-									      \
-    ch = get32 (inptr);							      \
+    uint32_t ch = get32 (inptr);					      \
 									      \
     /* First see whether we can write the character using the currently	      \
        selected character set.  */					      \
@@ -224,10 +222,10 @@
     else								      \
       {									      \
 	unsigned char buf[2];						      \
-	size_t written;							      \
-									      \
-	written = ucs4_to_ksc5601 (ch, buf, 2);				      \
-									      \
+	/* Fake initialization to keep gcc quiet.  */			      \
+	asm ("" : "=m" (buf));						      \
+									      \
+	size_t written = ucs4_to_ksc5601 (ch, buf, 2);			      \
 	if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR)	      \
 	  {								      \
 	    UNICODE_TAG_HANDLER (ch, 4);				      \

Modified: fsf/trunk/libc/locale/programs/ld-collate.c
==============================================================================
--- fsf/trunk/libc/locale/programs/ld-collate.c (original)
+++ fsf/trunk/libc/locale/programs/ld-collate.c Sun Aug 26 00:03:31 2007
@@ -2518,7 +2518,9 @@
 	  uint32_t namelen = strlen (runp->name);
 	  uint32_t hash = elem_hash (runp->name, namelen);
 	  size_t idx = hash % elem_size;
+#ifndef NDEBUG
 	  size_t start_idx = idx;
+#endif
 
 	  if (elem_table[idx * 2] != 0)
 	    {

Modified: fsf/trunk/libc/nis/nis_xdr.c
==============================================================================
--- fsf/trunk/libc/nis/nis_xdr.c (original)
+++ fsf/trunk/libc/nis/nis_xdr.c Sun Aug 26 00:03:31 2007
@@ -1,4 +1,4 @@
-/* Copyright (c) 1997, 1998, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (c) 1997, 1998, 2005, 2006, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@xxxxxxxxxxxxxxxxxxx>, 1997.
 
@@ -87,7 +87,7 @@
   bool_t res = xdr_nis_name (xdrs, &objp->name);
   if (__builtin_expect (res, TRUE))
     {
-      res = xdr_array (xdrs, (char **) &objp->ep.ep_val, &objp->ep.ep_len,
+      res = xdr_array (xdrs, (void *) &objp->ep.ep_val, &objp->ep.ep_len,
 		       ~0, sizeof (endpoint), (xdrproc_t) xdr_endpoint);
       if (__builtin_expect (res, TRUE))
 	{
@@ -108,7 +108,7 @@
       res = xdr_nstype (xdrs, &objp->do_type);
       if (__builtin_expect (res, TRUE))
 	{
-	  res = xdr_array (xdrs, (char **) &objp->do_servers.do_servers_val,
+	  res = xdr_array (xdrs, (void *) &objp->do_servers.do_servers_val,
 			   &objp->do_servers.do_servers_len, ~0,
 			   sizeof (nis_server), (xdrproc_t) _xdr_nis_server);
 	  if (__builtin_expect (res, TRUE))
@@ -116,7 +116,7 @@
 	      res = xdr_uint32_t (xdrs, &objp->do_ttl);
 	      if (__builtin_expect (res, TRUE))
 		res = xdr_array (xdrs,
-				 (char **) &objp->do_armask.do_armask_val,
+				 (void *) &objp->do_armask.do_armask_val,
 				 &objp->do_armask.do_armask_len, ~0,
 				 sizeof (oar_mask), (xdrproc_t) xdr_oar_mask);
 	    }
@@ -140,7 +140,7 @@
 {
   bool_t res = xdr_string (xdrs, &objp->en_type, ~0);
   if (__builtin_expect (res, TRUE))
-    res = xdr_array (xdrs, (char **) &objp->en_cols.en_cols_val,
+    res = xdr_array (xdrs, (void *) &objp->en_cols.en_cols_val,
 		     &objp->en_cols.en_cols_len, ~0,
 		     sizeof (entry_col), (xdrproc_t) xdr_entry_col);
   return res;
@@ -151,7 +151,7 @@
 {
   bool_t res = xdr_u_int (xdrs, &objp->gr_flags);
   if (__builtin_expect (res, TRUE))
-    res = xdr_array (xdrs, (char **) &objp->gr_members.gr_members_val,
+    res = xdr_array (xdrs, (void *) &objp->gr_members.gr_members_val,
 		     &objp->gr_members.gr_members_len, ~0,
 		     sizeof (nis_name), (xdrproc_t) _xdr_nis_name);
   return res;
@@ -163,7 +163,7 @@
   bool_t res = xdr_zotypes (xdrs, &objp->li_rtype);
   if (__builtin_expect (res, TRUE))
     {
-      res = xdr_array (xdrs, (char **) &objp->li_attrs.li_attrs_val,
+      res = xdr_array (xdrs, (void *) &objp->li_attrs.li_attrs_val,
 		       &objp->li_attrs.li_attrs_len, ~0,
 		       sizeof (nis_attr), (xdrproc_t) xdr_nis_attr);
       if (__builtin_expect (res, TRUE))
@@ -197,7 +197,7 @@
 	  res = xdr_u_char (xdrs, &objp->ta_sep);
 	  if (__builtin_expect (res, TRUE))
 	    {
-	      res = xdr_array (xdrs, (char **) &objp->ta_cols.ta_cols_val,
+	      res = xdr_array (xdrs, (void *) &objp->ta_cols.ta_cols_val,
 			       &objp->ta_cols.ta_cols_len, ~0,
 			       sizeof (table_col), (xdrproc_t) xdr_table_col);
 	      if (__builtin_expect (res, TRUE))
@@ -296,7 +296,7 @@
   bool_t res = xdr_nis_error (xdrs, &objp->status);
   if (__builtin_expect (res, TRUE))
     {
-      res = xdr_array (xdrs, (char **) &objp->objects.objects_val,
+      res = xdr_array (xdrs, (void *) &objp->objects.objects_val,
 		       &objp->objects.objects_len, ~0,
 		       sizeof (nis_object), (xdrproc_t) _xdr_nis_object);
       if (__builtin_expect (res, TRUE))
@@ -327,7 +327,7 @@
 {
   bool_t res = xdr_nis_name (xdrs, &objp->ns_name);
   if (__builtin_expect (res, TRUE))
-    res = xdr_array (xdrs, (char **) &objp->ns_object.ns_object_val,
+    res = xdr_array (xdrs, (void *) &objp->ns_object.ns_object_val,
 		     &objp->ns_object.ns_object_len, 1,
 		     sizeof (nis_object), (xdrproc_t) _xdr_nis_object);
   return res;
@@ -339,7 +339,7 @@
   bool_t res = xdr_nis_name (xdrs, &objp->ibr_name);
   if (__builtin_expect (res, TRUE))
     {
-      res = xdr_array (xdrs, (char **) &objp->ibr_srch.ibr_srch_val,
+      res = xdr_array (xdrs, (void *) &objp->ibr_srch.ibr_srch_val,
 		       &objp->ibr_srch.ibr_srch_len, ~0,
 		       sizeof (nis_attr), (xdrproc_t) xdr_nis_attr);
       if (__builtin_expect (res, TRUE))
@@ -347,14 +347,14 @@
 	  res = xdr_u_int (xdrs, &objp->ibr_flags);
 	  if (__builtin_expect (res, TRUE))
 	    {
-	      res = xdr_array (xdrs, (char **) &objp->ibr_obj.ibr_obj_val,
+	      res = xdr_array (xdrs, (void *) &objp->ibr_obj.ibr_obj_val,
 			       &objp->ibr_obj.ibr_obj_len, 1,
 			       sizeof (nis_object),
 			       (xdrproc_t) _xdr_nis_object);
 	      if (__builtin_expect (res, TRUE))
 		{
 		  res = xdr_array (xdrs,
-				   (char **) &objp->ibr_cbhost.ibr_cbhost_val,
+				   (void *) &objp->ibr_cbhost.ibr_cbhost_val,
 				   &objp->ibr_cbhost.ibr_cbhost_len, 1,
 				   sizeof (nis_server),
 				   (xdrproc_t) _xdr_nis_server);
@@ -406,7 +406,7 @@
 bool_t
 _xdr_nis_taglist (XDR *xdrs, nis_taglist *objp)
 {
-  return xdr_array (xdrs, (char **) &objp->tags.tags_val,
+  return xdr_array (xdrs, (void *) &objp->tags.tags_val,
 		    &objp->tags.tags_len, ~0, sizeof (nis_tag),
 		    (xdrproc_t) _xdr_nis_tag);
 }
@@ -452,7 +452,7 @@
 bool_t
 xdr_cback_data (XDR *xdrs, cback_data *objp)
 {
-  return xdr_array (xdrs, (char **)&objp->entries.entries_val,
+  return xdr_array (xdrs, (void *) &objp->entries.entries_val,
 		    &objp->entries.entries_len, ~0,
 		    sizeof (obj_p), (xdrproc_t) xdr_obj_p);
 }

Modified: fsf/trunk/libc/nis/yp_xdr.c
==============================================================================
--- fsf/trunk/libc/nis/yp_xdr.c (original)
+++ fsf/trunk/libc/nis/yp_xdr.c Sun Aug 26 00:03:31 2007
@@ -195,8 +195,9 @@
 {
   if (!xdr_mapname (xdrs, &objp->map))
     return FALSE;
-  return xdr_pointer (xdrs, (char **) &objp->next, sizeof (ypmaplist),
-		      (xdrproc_t) xdr_ypmaplist);
+  /* Prevent gcc warning about alias violation.  */
+  char **tp = (void *) &objp->next;
+  return xdr_pointer (xdrs, tp, sizeof (ypmaplist), (xdrproc_t) xdr_ypmaplist);
 }
 libnsl_hidden_def (xdr_ypmaplist)
 
@@ -205,8 +206,9 @@
 {
   if (!xdr_ypstat (xdrs, &objp->stat))
     return FALSE;
-  return xdr_pointer (xdrs, (char **) &objp->maps, sizeof (ypmaplist),
-		      (xdrproc_t) xdr_ypmaplist);
+  /* Prevent gcc warning about alias violation.  */
+  char **tp = (void *) &objp->maps;
+  return xdr_pointer (xdrs, tp, sizeof (ypmaplist), (xdrproc_t) xdr_ypmaplist);
 }
 libnsl_hidden_def (xdr_ypresp_maplist)
 

Modified: fsf/trunk/libc/posix/regex_internal.h
==============================================================================
--- fsf/trunk/libc/posix/regex_internal.h (original)
+++ fsf/trunk/libc/posix/regex_internal.h Sun Aug 26 00:03:31 2007
@@ -1,5 +1,5 @@
 /* Extended regular expression matching and search library.
-   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Isamu Hasegawa <isamu@xxxxxxxxxxxxxx>.
 
@@ -385,18 +385,20 @@
 # endif
 #endif
 
+#ifndef NOT_IN_libc
 static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
 						int new_buf_len)
      internal_function;
-#ifdef RE_ENABLE_I18N
+# ifdef RE_ENABLE_I18N
 static void build_wcs_buffer (re_string_t *pstr) internal_function;
 static int build_wcs_upper_buffer (re_string_t *pstr) internal_function;
-#endif /* RE_ENABLE_I18N */
+# endif /* RE_ENABLE_I18N */
 static void build_upper_buffer (re_string_t *pstr) internal_function;
 static void re_string_translate_buffer (re_string_t *pstr) internal_function;
 static unsigned int re_string_context_at (const re_string_t *input, int idx,
 					  int eflags)
      internal_function __attribute ((pure));
+#endif
 #define re_string_peek_byte(pstr, offset) \
   ((pstr)->mbs[(pstr)->cur_idx + offset])
 #define re_string_fetch_byte(pstr) \
@@ -732,15 +734,16 @@
   return (wint_t) pstr->wcs[idx];
 }
 
+# ifndef NOT_IN_libc
 static int
 internal_function __attribute ((pure))
 re_string_elem_size_at (const re_string_t *pstr, int idx)
 {
-# ifdef _LIBC
+#  ifdef _LIBC
   const unsigned char *p, *extra;
   const int32_t *table, *indirect;
   int32_t tmp;
-#  include <locale/weight.h>
+#   include <locale/weight.h>
   uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
 
   if (nrules != 0)
@@ -755,9 +758,10 @@
       return p - pstr->mbs - idx;
     }
   else
-# endif /* _LIBC */
+#  endif /* _LIBC */
     return 1;
 }
+# endif
 #endif /* RE_ENABLE_I18N */
 
 #endif /*  _REGEX_INTERNAL_H */

Modified: fsf/trunk/libc/posix/tst-rfc3484-2.c
==============================================================================
--- fsf/trunk/libc/posix/tst-rfc3484-2.c (original)
+++ fsf/trunk/libc/posix/tst-rfc3484-2.c Sun Aug 26 00:03:31 2007
@@ -26,6 +26,7 @@
 int
 __idna_to_unicode_lzlz (const char *input, char **output, int flags)
 {
+  *output = NULL;
   return 0;
 }
 

Modified: fsf/trunk/libc/posix/tst-rfc3484.c
==============================================================================
--- fsf/trunk/libc/posix/tst-rfc3484.c (original)
+++ fsf/trunk/libc/posix/tst-rfc3484.c Sun Aug 26 00:03:31 2007
@@ -26,6 +26,7 @@
 int
 __idna_to_unicode_lzlz (const char *input, char **output, int flags)
 {
+  *output = NULL;
   return 0;
 }
 

Modified: fsf/trunk/libc/stdio-common/Makefile
==============================================================================
--- fsf/trunk/libc/stdio-common/Makefile (original)
+++ fsf/trunk/libc/stdio-common/Makefile Sun Aug 26 00:03:31 2007
@@ -94,6 +94,8 @@
 CFLAGS-errlist.c = $(fno-unit-at-a-time)
 CFLAGS-siglist.c = $(fno-unit-at-a-time)
 
+# We know the test has a format string problem.
+CFLAGS-tst-sprintf.c = -Wno-format
 tst-sscanf-ENV = LOCPATH=$(common-objpfx)localedata
 tst-swprintf-ENV = LOCPATH=$(common-objpfx)localedata
 test-vfprintf-ENV = LOCPATH=$(common-objpfx)localedata

Modified: fsf/trunk/libc/sunrpc/key_prot.c
==============================================================================
--- fsf/trunk/libc/sunrpc/key_prot.c (original)
+++ fsf/trunk/libc/sunrpc/key_prot.c Sun Aug 26 00:03:31 2007
@@ -115,7 +115,7 @@
     return FALSE;
   if (!INTUSE(xdr_u_int) (xdrs, &objp->gid))
     return FALSE;
-  if (!INTUSE(xdr_array) (xdrs, (char **) &objp->gids.gids_val,
+  if (!INTUSE(xdr_array) (xdrs, (void *) &objp->gids.gids_val,
 			  (u_int *) & objp->gids.gids_len, MAXGIDS,
 			  sizeof (u_int), (xdrproc_t) INTUSE(xdr_u_int)))
     return FALSE;

Modified: fsf/trunk/libc/sysdeps/x86_64/cacheinfo.c
==============================================================================
--- fsf/trunk/libc/sysdeps/x86_64/cacheinfo.c (original)
+++ fsf/trunk/libc/sysdeps/x86_64/cacheinfo.c Sun Aug 26 00:03:31 2007
@@ -259,7 +259,8 @@
 		: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
 		: "0" (0x80000000));
 
-  if (name >= _SC_LEVEL3_CACHE_SIZE)
+  /* No level 4 cache (yet).  */
+  if (name > _SC_LEVEL3_CACHE_LINESIZE)
     return 0;
 
   unsigned int fn = 0x80000005 + (name >= _SC_LEVEL2_CACHE_SIZE);
@@ -280,36 +281,87 @@
     {
     case _SC_LEVEL1_DCACHE_SIZE:
       return (ecx >> 14) & 0x3fc00;
+
     case _SC_LEVEL1_DCACHE_ASSOC:
       ecx >>= 16;
       if ((ecx & 0xff) == 0xff)
 	/* Fully associative.  */
 	return (ecx << 2) & 0x3fc00;
       return ecx & 0xff;
+
     case _SC_LEVEL1_DCACHE_LINESIZE:
       return ecx & 0xff;
+
     case _SC_LEVEL2_CACHE_SIZE:
       return (ecx & 0xf000) == 0 ? 0 : (ecx >> 6) & 0x3fffc00;
+
     case _SC_LEVEL2_CACHE_ASSOC:
-      ecx >>= 12;
-      switch (ecx & 0xf)
+      switch ((ecx >> 12) & 0xf)
         {
         case 0:
         case 1:
         case 2:
         case 4:
-	  return ecx & 0xf;
+	  return (ecx >> 12) & 0xf;
 	case 6:
 	  return 8;
 	case 8:
 	  return 16;
-	case 0xf:
-	  return (ecx << 6) & 0x3fffc00;
+	case 10:
+	  return 32;
+	case 11:
+	  return 48;
+	case 12:
+	  return 64;
+	case 13:
+	  return 96;
+	case 14:
+	  return 128;
+	case 15:
+	  return ((ecx >> 6) & 0x3fffc00) / (ecx & 0xff);
 	default:
 	  return 0;
         }
+      /* NOTREACHED */
+
     case _SC_LEVEL2_CACHE_LINESIZE:
       return (ecx & 0xf000) == 0 ? 0 : ecx & 0xff;
+
+    case _SC_LEVEL3_CACHE_SIZE:
+      return (edx & 0xf000) == 0 ? 0 : (edx & 0x3ffc0000) << 1;
+
+    case _SC_LEVEL3_CACHE_ASSOC:
+      switch ((edx >> 12) & 0xf)
+	{
+	case 0:
+	case 1:
+	case 2:
+	case 4:
+	  return (edx >> 12) & 0xf;
+	case 6:
+	  return 8;
+	case 8:
+	  return 16;
+	case 10:
+	  return 32;
+	case 11:
+	  return 48;
+	case 12:
+	  return 64;
+	case 13:
+	  return 96;
+	case 14:
+	  return 128;
+	case 15:
+	  return ((edx & 0x3ffc0000) << 1) / (edx & 0xff);
+	default:
+	  return 0;
+	}
+      /* NOTREACHED */
+
+    case _SC_LEVEL3_CACHE_LINESIZE:
+      return (edx & 0xf000) == 0 ? 0 : edx & 0xff;
+
     default:
       assert (! "cannot happen");
     }