"I am a person who works hard and plays hard."

Yuan Wei
Second Year Graduate Student Department of Computer Science
University of Virginia Charlottesville, VA 22903
Email: yw3f@cs.virginia.edu


Source Code Analysis

Main Page   Compound List   File List   Compound Members   File Members  

eio.h File Reference

#include <stdio.h>

Include dependency graph for eio.h:

Include dependency graph

This graph shows which files directly or indirectly include this file:

Included by dependency graph

Go to the source code of this file.

Defines

Functions


Define Documentation

#define EIO_ALPHA_FORMAT   2
 

Definition at line 73 of file eio.h.

#define EIO_FILE_VERSION   3
 

Definition at line 76 of file eio.h.

Referenced by eio_create(), and eio_open().

#define EIO_PISA_FORMAT   1
 

Definition at line 72 of file eio.h.


Function Documentation

void eio_close FILE *    fd
 

Definition at line 226 of file eio.c.

References gzclose().

Referenced by sim_main(), and sim_uninit().

00227 {
00228   gzclose(fd);
00229 }

FILE* eio_create char *    fname
 

Definition at line 122 of file eio.c.

References ec_integer, ec_list, EIO_FILE_HEADER, EIO_FILE_VERSION, endian_big, endian_host_byte_order(), exo_delete(), exo_new(), exo_print(), fatal(), and gzopen().

Referenced by sim_load_prog(), and sim_main().

00123 {
00124   FILE *fd;
00125   struct exo_term_t *exo;
00126   int target_big_endian;
00127 
00128   target_big_endian = (endian_host_byte_order() == endian_big);
00129 
00130   fd = gzopen(fname, "w");
00131   if (!fd)
00132     fatal("unable to create EIO file `%s'", fname);
00133 
00134   /* emit EIO file header */
00135   fprintf(fd, "%s\n", EIO_FILE_HEADER);
00136   fprintf(fd, "/* file_format: %d, file_version: %d, big_endian: %d */\n", 
00137           MD_EIO_FILE_FORMAT, EIO_FILE_VERSION, ld_target_big_endian);
00138   exo = exo_new(ec_list,
00139                 exo_new(ec_integer, (exo_integer_t)MD_EIO_FILE_FORMAT),
00140                 exo_new(ec_integer, (exo_integer_t)EIO_FILE_VERSION),
00141                 exo_new(ec_integer, (exo_integer_t)target_big_endian),
00142                 NULL);
00143   exo_print(exo, fd);
00144   exo_delete(exo);
00145   fprintf(fd, "\n\n");
00146 
00147   return fd;
00148 }

void eio_fast_forward FILE *    eio_fd,
counter_t    icnt
 

Definition at line 840 of file eio.c.

References exo_term_t::as_integer, exo_term_t::as_list, counter_t, exo_term_t::ec, ec_integer, ec_list, eio_trans_icnt, exo_read(), and fatal().

Referenced by ld_load_prog().

00841 {
00842   struct exo_term_t *exo, *exo_icnt;
00843 
00844   do
00845     {
00846       /* read the next external I/O (EIO) transaction */
00847       exo = exo_read(eio_fd);
00848 
00849       if (!exo)
00850         fatal("could not fast forward to EIO checkpoint");
00851 
00852       /* one more transaction processed */
00853       eio_trans_icnt = icnt;
00854 
00855       /* pull apart the EIO transaction (EXO format) */
00856       if (!exo
00857           || exo->ec != ec_list
00858           || !(exo_icnt = exo->as_list.head)
00859           || exo_icnt->ec != ec_integer)
00860         fatal("cannot read EIO transaction (during fast forward)");
00861     }
00862   while ((counter_t)exo_icnt->as_integer.val != icnt);
00863 
00864   /* found it! */
00865 }

FILE* eio_open char *    fname
 

Definition at line 151 of file eio.c.

References exo_term_t::as_list, exo_term_t::ec, ec_integer, ec_list, EIO_FILE_VERSION, endian_big, endian_host_byte_order(), exo_delete(), exo_read(), fatal(), gzopen(), and warn().

Referenced by ld_load_prog().

00152 {
00153   FILE *fd;
00154   struct exo_term_t *exo;
00155   int file_format, file_version, big_endian, target_big_endian;
00156 
00157   target_big_endian = (endian_host_byte_order() == endian_big);
00158 
00159   fd = gzopen(fname, "r");
00160   if (!fd)
00161     fatal("unable to open EIO file `%s'", fname);
00162 
00163   /* read and check EIO file header */
00164   exo = exo_read(fd);
00165   if (!exo
00166       || exo->ec != ec_list
00167       || !exo->as_list.head
00168       || exo->as_list.head->ec != ec_integer
00169       || !exo->as_list.head->next
00170       || exo->as_list.head->next->ec != ec_integer
00171       || !exo->as_list.head->next->next
00172       || exo->as_list.head->next->next->ec != ec_integer
00173       || exo->as_list.head->next->next->next != NULL)
00174     fatal("could not read EIO file header");
00175 
00176   file_format = exo->as_list.head->as_integer.val;
00177   file_version = exo->as_list.head->next->as_integer.val;
00178   big_endian = exo->as_list.head->next->next->as_integer.val;
00179   exo_delete(exo);
00180 
00181   if (file_format != MD_EIO_FILE_FORMAT)
00182     fatal("EIO file `%s' has incompatible format", fname);
00183 
00184   if (file_version != EIO_FILE_VERSION)
00185     fatal("EIO file `%s' has incompatible version", fname);
00186 
00187   if (!!big_endian != !!target_big_endian)
00188     {
00189       warn("endian of `%s' does not match host", fname);
00190       warn("running with experimental cross-endian execution support");
00191       warn("****************************************");
00192       warn("**>> please check results carefully <<**");
00193       warn("****************************************");
00194     }
00195 
00196   return fd;
00197 }

counter_t eio_read_chkpt struct regs_t   regs,
struct mem_t   mem,
FILE *    fd
 

Definition at line 333 of file eio.c.

References exo_term_t::as_blob, exo_term_t::as_integer, exo_term_t::as_list, byte_t, counter_t, exo_term_t::ec, ec_address, ec_blob, ec_integer, ec_list, exo_delete(), exo_read(), fatal(), MD_EXO_TO_FREG, MD_EXO_TO_IREG, MD_EXO_TO_MISC_REGS, MEM_WRITE_BYTE, and exo_term_t::next.

Referenced by ld_load_prog().

00336 {
00337   int i, page_count;
00338   counter_t trans_icnt;
00339   struct exo_term_t *exo, *elt;
00340 
00341   /* read the EIO file pointer */
00342   exo = exo_read(fd);
00343   if (!exo
00344       || exo->ec != ec_integer)
00345     fatal("could not read EIO file pointer");
00346   trans_icnt = exo->as_integer.val;
00347   exo_delete(exo);
00348 
00349   /* read misc regs: icnt, PC, NPC, HI, LO, FCC */
00350   exo = exo_read(fd);
00351   MD_EXO_TO_MISC_REGS(exo, sim_num_insn, regs);
00352   exo_delete(exo);
00353 
00354   /* read integer registers */
00355   exo = exo_read(fd);
00356   if (!exo
00357       || exo->ec != ec_list)
00358     fatal("could not read EIO integer regs");
00359   elt = exo->as_list.head;
00360   for (i=0; i < MD_NUM_IREGS; i++)
00361     {
00362       if (!elt)
00363         fatal("could not read EIO integer regs (too few)");
00364 
00365       if (elt->ec != ec_address)
00366         fatal("could not read EIO integer regs (bad value)");
00367 
00368       MD_EXO_TO_IREG(elt, regs, i);
00369       elt = elt->next;
00370     }
00371   if (elt != NULL)
00372     fatal("could not read EIO integer regs (too many)");
00373   exo_delete(exo);
00374 
00375   /* read FP registers */
00376   exo = exo_read(fd);
00377   if (!exo
00378       || exo->ec != ec_list)
00379     fatal("could not read EIO FP regs");
00380   elt = exo->as_list.head;
00381   for (i=0; i < MD_NUM_FREGS; i++)
00382     {
00383       if (!elt)
00384         fatal("could not read EIO FP regs (too few)");
00385 
00386       if (elt->ec != ec_address)
00387         fatal("could not read EIO FP regs (bad value)");
00388 
00389       MD_EXO_TO_FREG(elt, regs, i);
00390       elt = elt->next;
00391     }
00392   if (elt != NULL)
00393     fatal("could not read EIO FP regs (too many)");
00394   exo_delete(exo);
00395 
00396   /* read the number of page defs, and memory config */
00397   exo = exo_read(fd);
00398   if (!exo
00399       || exo->ec != ec_list
00400       || !exo->as_list.head
00401       || exo->as_list.head->ec != ec_integer
00402       || !exo->as_list.head->next
00403       || exo->as_list.head->next->ec != ec_address
00404       || !exo->as_list.head->next->next
00405       || exo->as_list.head->next->next->ec != ec_address
00406       || exo->as_list.head->next->next->next != NULL)
00407     fatal("could not read EIO memory page count");
00408   page_count = exo->as_list.head->as_integer.val;
00409   ld_brk_point = (md_addr_t)exo->as_list.head->next->as_address.val;
00410   ld_stack_min = (md_addr_t)exo->as_list.head->next->next->as_address.val;
00411   exo_delete(exo);
00412 
00413   /* read text segment specifiers */
00414   exo = exo_read(fd);
00415   if (!exo
00416       || exo->ec != ec_list
00417       || !exo->as_list.head
00418       || exo->as_list.head->ec != ec_address
00419       || !exo->as_list.head->next
00420       || exo->as_list.head->next->ec != ec_integer
00421       || exo->as_list.head->next->next != NULL)
00422     fatal("count not read EIO text segment specifiers");
00423   ld_text_base = (md_addr_t)exo->as_list.head->as_address.val;
00424   ld_text_size = (unsigned int)exo->as_list.head->next->as_integer.val;
00425   exo_delete(exo);
00426 
00427   /* read data segment specifiers */
00428   exo = exo_read(fd);
00429   if (!exo
00430       || exo->ec != ec_list
00431       || !exo->as_list.head
00432       || exo->as_list.head->ec != ec_address
00433       || !exo->as_list.head->next
00434       || exo->as_list.head->next->ec != ec_integer
00435       || exo->as_list.head->next->next != NULL)
00436     fatal("count not read EIO data segment specifiers");
00437   ld_data_base = (md_addr_t)exo->as_list.head->as_address.val;
00438   ld_data_size = (unsigned int)exo->as_list.head->next->as_integer.val;
00439   exo_delete(exo);
00440 
00441   /* read stack segment specifiers */
00442   exo = exo_read(fd);
00443   if (!exo
00444       || exo->ec != ec_list
00445       || !exo->as_list.head
00446       || exo->as_list.head->ec != ec_address
00447       || !exo->as_list.head->next
00448       || exo->as_list.head->next->ec != ec_integer
00449       || exo->as_list.head->next->next != NULL)
00450     fatal("count not read EIO stack segment specifiers");
00451   ld_stack_base = (md_addr_t)exo->as_list.head->as_address.val;
00452   ld_stack_size = (unsigned int)exo->as_list.head->next->as_integer.val;
00453   exo_delete(exo);
00454 
00455   for (i=0; i < page_count; i++)
00456     {
00457       int j;
00458       md_addr_t page_addr;
00459       struct exo_term_t *blob;
00460 
00461       /* read the page */
00462       exo = exo_read(fd);
00463       if (!exo
00464           || exo->ec != ec_list
00465           || !exo->as_list.head
00466           || exo->as_list.head->ec != ec_address
00467           || !exo->as_list.head->next
00468           || exo->as_list.head->next->ec != ec_blob
00469           || exo->as_list.head->next->next != NULL)
00470         fatal("could not read EIO memory page");
00471       page_addr = (md_addr_t)exo->as_list.head->as_address.val;
00472       blob = exo->as_list.head->next;
00473 
00474       /* write data to simulator memory */
00475       for (j=0; j < blob->as_blob.size; j++)
00476         {
00477           byte_t val;
00478 
00479           val = blob->as_blob.data[j];
00480           /* unchecked access... */
00481           MEM_WRITE_BYTE(mem, page_addr, val);
00482           page_addr++;
00483         }
00484       exo_delete(exo);
00485     }
00486 
00487   return trans_icnt;
00488 }

void eio_read_trace FILE *    eio_fd,
counter_t    icnt,
struct regs_t   regs,
mem_access_fn    mem_fn,
struct mem_t   mem,
md_inst_t    inst
 

Definition at line 661 of file eio.c.

References exo_term_t::as_blob, exo_term_t::as_integer, exo_term_t::as_list, counter_t, exo_term_t::ec, ec_address, ec_blob, ec_integer, ec_list, eio_trans_icnt, exo_delete(), exo_read(), FALSE, fatal(), MD_EXIT_SYSCALL, MD_EXO_CMP_IREG, MD_EXO_TO_IREG, MD_OUTPUT_SYSCALL, MD_STREAM_FILENO, mem_access_fn, myfprintf(), exo_term_t::next, panic(), Read, regs_t::regs_PC, sys_syscall(), and Write.

Referenced by eio_write_trace(), and sys_syscall().

00667 {
00668   int i;
00669   struct exo_term_t *exo, *exo_icnt, *exo_pc;
00670   struct exo_term_t *exo_inregs, *exo_inmem, *exo_outregs, *exo_outmem;
00671   struct exo_term_t *brkrec, *regrec, *memrec;
00672 
00673   /* exit() system calls get executed for real... */
00674   if (MD_EXIT_SYSCALL(regs))
00675     {
00676       sys_syscall(regs, mem_fn, mem, inst, FALSE);
00677       panic("returned from exit() system call");
00678     }
00679 
00680   /* else, read the external I/O (EIO) transaction */
00681   exo = exo_read(eio_fd);
00682 
00683   /* one more transaction processed */
00684   eio_trans_icnt = icnt;
00685 
00686   /* pull apart the EIO transaction (EXO format) */
00687   if (!exo
00688       || exo->ec != ec_list
00689       || !(exo_icnt = exo->as_list.head)
00690       || exo_icnt->ec != ec_integer
00691       || !(exo_pc = exo_icnt->next)
00692       || exo_pc->ec != ec_address
00693       || !(exo_inregs = exo_pc->next)
00694       || exo_inregs->ec != ec_list
00695       || !(exo_inmem = exo_inregs->next)
00696       || exo_inmem->ec != ec_list
00697       || !(exo_outregs = exo_inmem->next)
00698       || exo_outregs->ec != ec_list
00699       || !(exo_outmem = exo_outregs->next)
00700       || exo_outmem->ec != ec_list
00701       || exo_outmem->next != NULL)
00702     fatal("cannot read EIO transaction");
00703 
00704   /*
00705    * check the system call inputs
00706    */
00707 
00708   /* check ICNT input */
00709   if (icnt != (counter_t)exo_icnt->as_integer.val)
00710     fatal("EIO trace inconsistency: ICNT mismatch");
00711 
00712   /* check PC input */
00713   if (regs->regs_PC != (md_addr_t)exo_pc->as_integer.val)
00714     fatal("EIO trace inconsistency: PC mismatch");
00715 
00716   /* check integer register inputs */
00717   for (i=MD_FIRST_IN_REG, regrec=exo_inregs->as_list.head;
00718        i <= MD_LAST_IN_REG; i++, regrec=regrec->next)
00719     {
00720       if (!regrec || regrec->ec != ec_address)
00721         fatal("EIO trace inconsistency: missing input reg");
00722 
00723       if (MD_EXO_CMP_IREG(regrec, regs, i))
00724         fatal("EIO trace inconsistency: R[%d] input mismatch", i);
00725 #ifdef VERBOSE
00726       fprintf(stderr, "** R[%d] checks out...\n", i);
00727 #endif /* VERBOSE */
00728     }
00729   if (regrec != NULL)
00730     fatal("EIO trace inconsistency: too many input regs");
00731 
00732   /* check memory inputs */
00733   for (memrec=exo_inmem->as_list.head; memrec != NULL; memrec=memrec->next)
00734     {
00735       md_addr_t loc;
00736       struct exo_term_t *addr, *blob;
00737 
00738       /* check the mem transaction format */
00739       if (!memrec
00740           || memrec->ec != ec_list
00741           || !(addr = memrec->as_list.head)
00742           || addr->ec != ec_address
00743           || !(blob = addr->next)
00744           || blob->ec != ec_blob
00745           || blob->next != NULL)
00746         fatal("EIO trace inconsistency: bad memory transaction");
00747 
00748       for (loc=addr->as_integer.val, i=0; i < blob->as_blob.size; loc++,i++)
00749         {
00750           unsigned char val;
00751 
00752           /* was: val = MEM_READ_BYTE(loc); */
00753           (*mem_fn)(mem, Read, loc, &val, sizeof(unsigned char));
00754 
00755           if (val != blob->as_blob.data[i])
00756             fatal("EIO trace inconsistency: addr 0x%08p input mismatch", loc);
00757 
00758 #ifdef VERBOSE
00759           myfprintf(stderr, "** 0x%08p checks out...\n", loc);
00760 #endif /* VERBOSE */
00761         }
00762 
00763       /* simulate view'able I/O */
00764       if (MD_OUTPUT_SYSCALL(regs))
00765         {
00766           if (sim_progfd)
00767             {
00768               /* redirect program output to file */
00769               fwrite(blob->as_blob.data, 1, blob->as_blob.size, sim_progfd);
00770             }
00771           else
00772             {
00773               /* write the output to stdout/stderr */
00774               write(MD_STREAM_FILENO(regs),
00775                     blob->as_blob.data, blob->as_blob.size);
00776             }
00777         }
00778     }
00779 
00780   /*
00781    * write system call outputs
00782    */
00783 
00784   /* adjust breakpoint */
00785   brkrec = exo_outregs->as_list.head;
00786   if (!brkrec || brkrec->ec != ec_address)
00787     fatal("EIO trace inconsistency: missing memory breakpoint");
00788   ld_brk_point = (md_addr_t)brkrec->as_integer.val;
00789 
00790   /* write integer register outputs */
00791   for (i=MD_FIRST_OUT_REG, regrec=exo_outregs->as_list.head->next;
00792        i <= MD_LAST_OUT_REG; i++, regrec=regrec->next)
00793     {
00794       if (!regrec || regrec->ec != ec_address)
00795         fatal("EIO trace inconsistency: missing output reg");
00796 
00797       MD_EXO_TO_IREG(regrec, regs, i);
00798 
00799 #ifdef VERBOSE
00800       fprintf(stderr, "** R[%d] written...\n", i);
00801 #endif /* VERBOSE */
00802     }
00803   if (regrec != NULL)
00804     fatal("EIO trace inconsistency: too many output regs");
00805 
00806   /* write memory outputs */
00807   for (memrec=exo_outmem->as_list.head; memrec != NULL; memrec=memrec->next)
00808     {
00809       md_addr_t loc;
00810       struct exo_term_t *addr, *blob;
00811 
00812       /* check the mem transaction format */
00813       if (!memrec
00814           || memrec->ec != ec_list
00815           || !(addr = memrec->as_list.head)
00816           || addr->ec != ec_address
00817           || !(blob = addr->next)
00818           || blob->ec != ec_blob
00819           || blob->next != NULL)
00820         fatal("EIO trace icnonsistency: bad memory transaction");
00821 
00822       for (loc=addr->as_integer.val, i=0; i < blob->as_blob.size; loc++,i++)
00823         {
00824           /* was: MEM_WRITE_BYTE(loc, blob->as_blob.data[i]); */
00825           (*mem_fn)(mem, Write,
00826                     loc, &blob->as_blob.data[i], sizeof(unsigned char));
00827 
00828 #ifdef VERBOSE
00829           fprintf(stderr, "** 0x%08p written...\n", loc);
00830 #endif /* VERBOSE */
00831         }
00832     }
00833 
00834   /* release the EIO EXO node */
00835   exo_delete(exo);
00836 }

int eio_valid char *    fname
 

Definition at line 201 of file eio.c.

References EIO_FILE_HEADER, FALSE, gzclose(), gzopen(), and TRUE.

Referenced by ld_load_prog().

00202 {
00203   FILE *fd;
00204   char buf[512];
00205 
00206   /* open possible EIO file */
00207   fd = gzopen(fname, "r");
00208   if (!fd)
00209     return FALSE;
00210 
00211   /* read and check EIO file header */
00212   fgets(buf, 512, fd);
00213 
00214   /* check the header */
00215   if (strcmp(buf, EIO_FILE_HEADER))
00216     return FALSE;
00217 
00218   /* all done, close up file */
00219   gzclose(fd);
00220 
00221   /* else, has a valid header, go with it... */
00222   return TRUE;
00223 }

counter_t eio_write_chkpt struct regs_t   regs,
struct mem_t   mem,
FILE *    fd
 

Definition at line 234 of file eio.c.

References exo_term_t::as_list, ec_address, ec_blob, ec_integer, ec_list, eio_trans_icnt, exo_chain(), exo_delete(), exo_new(), exo_print(), MD_MISC_REGS_TO_EXO, MEM_FORALL, MEM_PTE_ADDR, myfprintf(), mem_pte_t::page, and mem_t::page_count.

Referenced by sim_main().

00237 {
00238   int i;
00239   struct exo_term_t *exo;
00240   struct mem_pte_t *pte;
00241 
00242   myfprintf(fd, "/* ** start checkpoint @ %n... */\n\n", eio_trans_icnt);
00243 
00244   myfprintf(fd, "/* EIO file pointer: %n... */\n", eio_trans_icnt);
00245   exo = exo_new(ec_integer, (exo_integer_t)eio_trans_icnt);
00246   exo_print(exo, fd);
00247   fprintf(fd, "\n\n");
00248   exo_delete(exo);
00249 
00250   /* dump misc regs: icnt, PC, NPC, etc... */
00251   fprintf(fd, "/* misc regs icnt, PC, NPC, etc... */\n");
00252   exo = MD_MISC_REGS_TO_EXO(regs);
00253   exo_print(exo, fd);
00254   fprintf(fd, "\n\n");
00255   exo_delete(exo);
00256 
00257   /* dump integer registers */
00258   fprintf(fd, "/* integer regs */\n");
00259   exo = exo_new(ec_list, NULL);
00260   for (i=0; i < MD_NUM_IREGS; i++)
00261     exo->as_list.head = exo_chain(exo->as_list.head, MD_IREG_TO_EXO(regs, i));
00262   exo_print(exo, fd);
00263   fprintf(fd, "\n\n");
00264   exo_delete(exo);
00265 
00266   /* dump FP registers */
00267   fprintf(fd, "/* FP regs (integer format) */\n");
00268   exo = exo_new(ec_list, NULL);
00269   for (i=0; i < MD_NUM_FREGS; i++)
00270     exo->as_list.head = exo_chain(exo->as_list.head, MD_FREG_TO_EXO(regs, i));
00271   exo_print(exo, fd);
00272   fprintf(fd, "\n\n");
00273   exo_delete(exo);
00274 
00275   fprintf(fd, "/* writing `%d' memory pages... */\n", (int)mem->page_count);
00276   exo = exo_new(ec_list,
00277                 exo_new(ec_integer, (exo_integer_t)mem->page_count),
00278                 exo_new(ec_address, (exo_integer_t)ld_brk_point),
00279                 exo_new(ec_address, (exo_integer_t)ld_stack_min),
00280                 NULL);
00281   exo_print(exo, fd);
00282   fprintf(fd, "\n\n");
00283   exo_delete(exo);
00284 
00285   fprintf(fd, "/* text segment specifiers (base & size) */\n");
00286   exo = exo_new(ec_list,
00287                 exo_new(ec_address, (exo_integer_t)ld_text_base),
00288                 exo_new(ec_integer, (exo_integer_t)ld_text_size),
00289                 NULL);
00290   exo_print(exo, fd);
00291   fprintf(fd, "\n\n");
00292   exo_delete(exo);
00293 
00294   fprintf(fd, "/* data segment specifiers (base & size) */\n");
00295   exo = exo_new(ec_list,
00296                 exo_new(ec_address, (exo_integer_t)ld_data_base),
00297                 exo_new(ec_integer, (exo_integer_t)ld_data_size),
00298                 NULL);
00299   exo_print(exo, fd);
00300   fprintf(fd, "\n\n");
00301   exo_delete(exo);
00302 
00303   fprintf(fd, "/* stack segment specifiers (base & size) */\n");
00304   exo = exo_new(ec_list,
00305                 exo_new(ec_address, (exo_integer_t)ld_stack_base),
00306                 exo_new(ec_integer, (exo_integer_t)ld_stack_size),
00307                 NULL);
00308   exo_print(exo, fd);
00309   fprintf(fd, "\n\n");
00310   exo_delete(exo);
00311 
00312   /* visit all active memory pages, and dump them to the checkpoint file */
00313   MEM_FORALL(mem, i, pte)
00314     {
00315       /* dump this page... */
00316       exo = exo_new(ec_list,
00317                     exo_new(ec_address, (exo_integer_t)MEM_PTE_ADDR(pte, i)),
00318                     exo_new(ec_blob, MD_PAGE_SIZE, pte->page),
00319                     NULL);
00320       exo_print(exo, fd);
00321       fprintf(fd, "\n\n");
00322       exo_delete(exo);
00323     }
00324 
00325   myfprintf(fd, "/* ** end checkpoint @ %n... */\n\n", eio_trans_icnt);
00326 
00327   return eio_trans_icnt;
00328 }

void eio_write_trace FILE *    eio_fd,
counter_t    icnt,
struct regs_t   regs,
mem_access_fn    mem_fn,
struct mem_t   mem,
md_inst_t    inst
 

Definition at line 596 of file eio.c.

References exo_term_t::as_list, counter_t, ec_address, ec_integer, ec_list, eio_read_trace(), eio_trans_icnt, mem_rec_t::exo, exo_chain(), exo_delete(), exo_new(), exo_print(), FALSE, local_mem_fn, mem_access_fn, my_mem_fn(), regs_t::regs_PC, seen_write, and sys_syscall().

00602 {
00603   int i;
00604   struct exo_term_t *exo;
00605 
00606   /* write syscall register inputs ($r2..$r7) */
00607   input_regs = exo_new(ec_list, NULL);
00608   for (i=MD_FIRST_IN_REG; i <= MD_LAST_IN_REG; i++)
00609     {
00610       input_regs->as_list.head =
00611         exo_chain(input_regs->as_list.head, MD_IREG_TO_EXO(regs, i));
00612     }
00613 
00614   /* initialize memory inputs */
00615   input_mem = exo_new(ec_list, NULL); input_mem_rec.exo = NULL;
00616   output_mem = exo_new(ec_list, NULL); output_mem_rec.exo = NULL;
00617 
00618   /* perform the system call, record inputs and outputs */
00619   seen_write = FALSE;
00620   local_mem_fn = mem_fn;
00621 
00622   if (sim_eio_fd != NULL)
00623     eio_read_trace(sim_eio_fd, icnt, regs, my_mem_fn, mem, inst);
00624   else
00625     {
00626       sys_syscall(regs, my_mem_fn, mem, inst, FALSE);
00627     }
00628 
00629   /* write syscall breakpoint and register outputs ($r2..$r7) */
00630   output_regs = exo_new(ec_list, NULL);
00631   output_regs->as_list.head =
00632         exo_chain(output_regs->as_list.head,
00633                   exo_new(ec_address, (exo_integer_t)ld_brk_point));
00634   for (i=MD_FIRST_OUT_REG; i <= MD_LAST_OUT_REG; i++)
00635     {
00636       output_regs->as_list.head =
00637         exo_chain(output_regs->as_list.head, MD_IREG_TO_EXO(regs, i));
00638     }
00639 
00640   /* write the whole enchalada to output stream */
00641   exo = exo_new(ec_list,
00642                 /* icnt */exo_new(ec_integer, (exo_integer_t)icnt),
00643                 /* PC */exo_new(ec_address, (exo_integer_t)regs->regs_PC),
00644                 input_regs, input_mem,
00645                 output_regs, output_mem,
00646                 NULL);
00647   exo_print(exo, eio_fd);
00648   fprintf(eio_fd, "\n\n");
00649 
00650   /* release input storage */
00651   exo_delete(exo);
00652 
00653   /* one more transaction processed */
00654   eio_trans_icnt = icnt;
00655 }



UVa CS Department of Computer Science
School of Engineering, University of Virginia
151 Engineer's Way, P.O. Box 400740
Charlottesville, Virginia 22904-4740

(434) 982-2200  Fax: (434) 982-2214