| 
									
										
										
										
											2012-04-17 02:02:27 +00:00
										 |  |  | /* Get frequency of the system processor.  IA-64/Linux version.
 | 
					
						
							| 
									
										
										
										
											2017-01-01 00:14:16 +00:00
										 |  |  |    Copyright (C) 2001-2017 Free Software Foundation, Inc. | 
					
						
							| 
									
										
										
										
											2012-04-17 02:02:27 +00:00
										 |  |  |    This file is part of the GNU C Library. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The GNU C Library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |    modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |    License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |    version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The GNU C Library 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 | 
					
						
							|  |  |  |    Lesser General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2012-04-17 02:10:24 +00:00
										 |  |  |    License along with the GNU C Library; if not, see | 
					
						
							|  |  |  |    <http://www.gnu.org/licenses/>.  */
 | 
					
						
							| 
									
										
										
										
											2012-04-17 02:02:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <ctype.h>
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | hp_timing_t | 
					
						
							|  |  |  | __get_clockfreq (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* We read the information from the /proc filesystem.  It contains at
 | 
					
						
							|  |  |  |      least one line like | 
					
						
							|  |  |  | 	itc MHz    : 733.390988 | 
					
						
							|  |  |  |      We search for this line and convert the number in an integer.  */ | 
					
						
							|  |  |  |   static hp_timing_t result; | 
					
						
							|  |  |  |   int fd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* If this function was called before, we know the result.  */ | 
					
						
							|  |  |  |   if (result != 0) | 
					
						
							|  |  |  |     return result; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 21:50:46 +00:00
										 |  |  |   fd = __open ("/proc/cpuinfo", O_RDONLY); | 
					
						
							| 
									
										
										
										
											2012-04-17 02:02:27 +00:00
										 |  |  |   if (__builtin_expect (fd != -1, 1)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       /* XXX AFAIK the /proc filesystem can generate "files" only up
 | 
					
						
							|  |  |  |          to a size of 4096 bytes.  */ | 
					
						
							|  |  |  |       char buf[4096]; | 
					
						
							|  |  |  |       ssize_t n; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 21:50:46 +00:00
										 |  |  |       n = __read (fd, buf, sizeof buf); | 
					
						
							| 
									
										
										
										
											2012-04-17 02:02:27 +00:00
										 |  |  |       if (__builtin_expect (n, 1) > 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  char *mhz = memmem (buf, n, "itc MHz", 7); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  if (__builtin_expect (mhz != NULL, 1)) | 
					
						
							|  |  |  | 	    { | 
					
						
							|  |  |  | 	      char *endp = buf + n; | 
					
						
							|  |  |  | 	      int seen_decpoint = 0; | 
					
						
							|  |  |  | 	      int ndigits = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	      /* Search for the beginning of the string.  */ | 
					
						
							|  |  |  | 	      while (mhz < endp && (*mhz < '0' || *mhz > '9') && *mhz != '\n') | 
					
						
							|  |  |  | 		++mhz; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	      while (mhz < endp && *mhz != '\n') | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		  if (*mhz >= '0' && *mhz <= '9') | 
					
						
							|  |  |  | 		    { | 
					
						
							|  |  |  | 		      result *= 10; | 
					
						
							|  |  |  | 		      result += *mhz - '0'; | 
					
						
							|  |  |  | 		      if (seen_decpoint) | 
					
						
							|  |  |  | 			++ndigits; | 
					
						
							|  |  |  | 		    } | 
					
						
							|  |  |  | 		  else if (*mhz == '.') | 
					
						
							|  |  |  | 		    seen_decpoint = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		  ++mhz; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	      /* Compensate for missing digits at the end.  */ | 
					
						
							|  |  |  | 	      while (ndigits++ < 6) | 
					
						
							|  |  |  | 		result *= 10; | 
					
						
							|  |  |  | 	    } | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-24 21:50:46 +00:00
										 |  |  |       __close (fd); | 
					
						
							| 
									
										
										
										
											2012-04-17 02:02:27 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return result; | 
					
						
							|  |  |  | } |