Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / openbios / libc / misc.c
diff --git a/qemu/roms/openbios/libc/misc.c b/qemu/roms/openbios/libc/misc.c
new file mode 100644 (file)
index 0000000..e7cf4f4
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ *   Creation Date: <2002/10/19 21:05:07 samuel>
+ *   Time-stamp: <2002/10/22 22:29:18 samuel>
+ *
+ *     <misc.c>
+ *
+ *     Miscellaneous
+ *
+ *   Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se)
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation
+ *
+ */
+
+#include "config.h"
+#include "libc/string.h"
+
+int errno_int;
+
+void
+qsort( void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void*) )
+{
+       unsigned int worked, i, j;
+
+       /* even more inefficient than the glibc variant :-) */
+       do {
+               char *p = base;
+               worked = 0;
+               for( i=0; i<nmemb-1; i++, p+= size ) {
+                       if( compar( p, p + size ) > 0 ) {
+                               worked = 1;
+                               for( j=0; j<size; j++ ) {
+                                       char ch = p[j];
+                                       p[j] = p[j+size];
+                                       p[j+size] = ch;
+                               }
+                       }
+               }
+       } while( worked );
+}
+
+
+long int
+strtol( const char *nptr, char **endptr, int base )
+{
+       int sum, n, sign=1;
+       while( isspace(*nptr) )
+               nptr++;
+
+       if( *nptr == '-' || *nptr == '+' )
+               sign = (*nptr++ == '-') ? -1 : 1;
+
+       if( base == 16 || base == 0) {
+               if( !base )
+                       base = (nptr[0] == '0')? 8 : 10;
+               if( nptr[0] == '0' && nptr[1] == 'x' ) {
+                       nptr += 2;
+                       base = 16;
+               }
+       }
+       for( sum=0 ;; nptr++ ) {
+               char ch = *nptr;
+               if( !isalnum(ch) )
+                       break;
+               n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
+               if( n >= base || n < 0 )
+                       break;
+               sum *= base;
+               sum += n;
+       }
+       if( endptr )
+               *endptr = (char*)nptr;
+
+       return sum * sign;
+}
+
+long long int
+strtoll( const char *nptr, char **endptr, int base )
+{
+       long long int sum;
+       int n, sign=1;
+       while( isspace(*nptr) )
+               nptr++;
+
+       if( *nptr == '-' || *nptr == '+' )
+               sign = (*nptr++ == '-') ? -1 : 1;
+
+       if( base == 16 || base == 0) {
+               if( !base )
+                       base = (nptr[0] == '0')? 8 : 10;
+               if( nptr[0] == '0' && nptr[1] == 'x' ) {
+                       nptr += 2;
+                       base = 16;
+               }
+       }
+       for( sum=0 ;; nptr++ ) {
+               char ch = *nptr;
+               if( !isalnum(ch) )
+                       break;
+               n = isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10;
+               if( n >= base || n < 0 )
+                       break;
+               sum *= base;
+               sum += n;
+       }
+       if( endptr )
+               *endptr = (char*)nptr;
+
+       return sum * sign;
+}
+
+// Propolice support
+long __guard[8] = {
+#ifdef CONFIG_BIG_ENDIAN
+    (0 << 24) | (0 << 16) | ('\n' << 8) | 255,
+#else
+    (255 << 24) | ('\n' << 16) | (0 << 8) | 0,
+#endif
+    0, 0, 0, 0, 0, 0, 0
+};
+
+static void freeze(void)
+{
+    // Freeze
+    // XXX: Disable interrupts?
+    for(;;)
+        ;
+}
+
+void __stack_smash_handler(const char *func, int damaged)
+{
+    printk("Propolice detected a stack smashing attack %x at function %s,"
+           " freezing\n", damaged, func);
+    freeze();
+}
+
+void __stack_chk_fail(void)
+{
+    printk("Propolice detected a stack smashing attack, freezing\n");
+
+    freeze();
+}