URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [tags/] [nog_patch_59/] [or1ksim/] [support/] [simprintf.c] - Rev 75
Go to most recent revision | Compare with Previous | Blame | View Log
/* libc.c -- dummy C library simulation Copyright (C) 1999 Damjan Lampret, lampret@opencores.org This file is part of OpenRISC 1000 Architectural Simulator. 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; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Debugger LIBC functions. Working, but VERY, VERY ugly written. I wrote following code when basic simulator started to work and I was desperate to use some printfs in my debugged code. And it was also used to get some output from Dhrystone MIPS benchmark. */ #include <stdio.h> #include <string.h> #include <errno.h> #include <stdarg.h> #include <abstract.h> #include <arch.h> /* Length of printf format string */ #define FMTLEN 2000 char fmtstr[FMTLEN]; char *simgetstr(unsigned long stackaddr, unsigned long regparam) { unsigned long fmtaddr; FILE *f; int i; #if STACK_ARGS fmtaddr = eval_mem32(stackaddr); #else fmtaddr = regparam; #endif i = 0; while (eval_mem8(fmtaddr) != '\0') { fmtstr[i++] = eval_mem8(fmtaddr); fmtaddr++; if (i == FMTLEN - 1) break; } fmtstr[i] = '\0'; return fmtstr; } void simprintf(unsigned long stackaddr, unsigned long regparam) { unsigned long fmtaddr; FILE *f; int i = 0; simgetstr(stackaddr, regparam); debug("simprintf: stackaddr: 0x%.8lx", stackaddr); if ((f = fopen("stdout.txt", "a+"))) { unsigned long arg; unsigned long argaddr; unsigned char regstr[5]; char *fmtstrend; char *fmtstrpart = fmtstr; #if STACK_ARGS argaddr = stackaddr; #else argaddr = 3; #endif debug("simprintf: %s", fmtstrpart); while(strlen(fmtstrpart)) { debug("simprintf(): 1"); if ((fmtstrend = strstr(fmtstrpart + 1, "%"))) *fmtstrend = '\0'; debug(" 2"); if (strstr(fmtstrpart, "%")) { debug(" 3"); #if STACK_ARGS argaddr += 4; arg = eval_mem32(argaddr); #else sprintf(regstr, "r%u", ++argaddr); arg = eval_reg(regstr); #endif debug(" 4: fmtstrpart=%p fmtstrpart=%s arg=%p", fmtstrpart, fmtstrpart, arg); if (strncmp(fmtstrpart, "%s", 2) == 0) { int len = 0; char *str; for(; eval_mem8(arg++); len++); len++; /* for null char */ arg -= len; str = (char *)malloc(len); len = 0; for(; eval_mem8(arg); len++) *(str+len) = eval_mem8(arg++); *(str+len) = eval_mem8(arg); /* null ch */ /* debug("4a: len=%d str=%s\n", len, str); debug("4b:"); */ fprintf(f, fmtstrpart, str); free(str); } else fprintf(f, fmtstrpart, arg); } else { debug(" 5"); fprintf(f, fmtstrpart); debug(fmtstrpart); } if (!fmtstrend) break; debug(" 6"); fmtstrpart = fmtstrend; *fmtstrpart = '%'; debug(" 7"); } debug(" 8"); if (fclose(f)) perror(strerror(errno)); } else perror(strerror(errno)); }
Go to most recent revision | Compare with Previous | Blame | View Log