summaryrefslogtreecommitdiffstats
path: root/qemu/roms/openbios/libc/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/openbios/libc/misc.c')
-rw-r--r--qemu/roms/openbios/libc/misc.c144
1 files changed, 144 insertions, 0 deletions
diff --git a/qemu/roms/openbios/libc/misc.c b/qemu/roms/openbios/libc/misc.c
new file mode 100644
index 000000000..e7cf4f408
--- /dev/null
+++ b/qemu/roms/openbios/libc/misc.c
@@ -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();
+}