"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  

memory.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include "host.h"
#include "misc.h"
#include "machine.h"
#include "options.h"
#include "stats.h"
#include "memory.h"

Include dependency graph for memory.c:

Include dependency graph

Go to the source code of this file.

Functions


Function Documentation

enum md_fault_type mem_access struct mem_t   mem,
enum mem_cmd    cmd,
md_addr_t    addr,
void *    vp,
int    nbytes
 

Definition at line 182 of file memory.c.

References byte_t, half_t, mem_cmd, MEM_READ_BYTE, MEM_READ_HALF, MEM_READ_WORD, MEM_WRITE_BYTE, MEM_WRITE_HALF, MEM_WRITE_WORD, Read, and word_t.

Referenced by cheetah_access_fn(), dcache_access_fn(), dlite_mem_obj(), ld_load_prog(), mem_dump(), and simoo_mem_obj().

00187 {
00188   byte_t *p = vp;
00189 
00190   /* check alignments */
00191   if (/* check size */(nbytes & (nbytes-1)) != 0
00192       || /* check max size */nbytes > MD_PAGE_SIZE)
00193     return md_fault_access;
00194 
00195   if (/* check natural alignment */(addr & (nbytes-1)) != 0)
00196     return md_fault_alignment;
00197 
00198   /* perform the copy */
00199   {
00200     if (cmd == Read)
00201       {
00202         while (nbytes-- > 0)
00203           {
00204             *((byte_t *)p) = MEM_READ_BYTE(mem, addr);
00205             p += sizeof(byte_t);
00206             addr += sizeof(byte_t);
00207           }
00208       }
00209     else
00210       {
00211         while (nbytes-- > 0)
00212           {
00213             MEM_WRITE_BYTE(mem, addr, *((byte_t *)p));
00214             p += sizeof(byte_t);
00215             addr += sizeof(byte_t);
00216           }
00217       }
00218   }
00219 
00220 #if 0
00221   switch (nbytes)
00222     {
00223     case 1:
00224       if (cmd == Read)
00225         *((byte_t *)p) = MEM_READ_BYTE(mem, addr);
00226       else
00227         MEM_WRITE_BYTE(mem, addr, *((byte_t *)p));
00228       break;
00229 
00230     case 2:
00231       if (cmd == Read)
00232         *((half_t *)p) = MEM_READ_HALF(mem, addr);
00233       else
00234         MEM_WRITE_HALF(mem, addr, *((half_t *)p));
00235       break;
00236 
00237     case 4:
00238       if (cmd == Read)
00239         *((word_t *)p) = MEM_READ_WORD(mem, addr);
00240       else
00241         MEM_WRITE_WORD(mem, addr, *((word_t *)p));
00242       break;
00243 
00244 #ifdef HOST_HAS_QWORD
00245     case 8:
00246       if (cmd == Read)
00247         *((qword_t *)p) = MEM_READ_QWORD(mem, addr);
00248       else
00249         MEM_WRITE_QWORD(mem, addr, *((qword_t *)p));
00250       break;
00251 #endif /* HOST_HAS_QWORD */
00252 
00253     default:
00254       break;
00255     }
00256 #endif
00257 
00258   /* no fault... */
00259   return md_fault_none;
00260 }

enum md_fault_type mem_bcopy mem_access_fn    mem_fn,
struct mem_t   mem,
enum mem_cmd    cmd,
md_addr_t    addr,
void *    vp,
int    nbytes
 

Definition at line 382 of file memory.c.

References byte_t, mem_access_fn, and mem_cmd.

Referenced by ld_load_prog(), and sys_syscall().

00388 {
00389   byte_t *p = vp;
00390   enum md_fault_type fault;
00391 
00392   /* copy NBYTES bytes to/from simulator memory */
00393   while (nbytes-- > 0)
00394     {
00395       fault = mem_fn(mem, cmd, addr++, p++, 1);
00396       if (fault != md_fault_none)
00397         return fault;
00398     }
00399 
00400   /* no faults... */
00401   return md_fault_none;
00402 }

enum md_fault_type mem_bcopy4 mem_access_fn    mem_fn,
struct mem_t   mem,
enum mem_cmd    cmd,
md_addr_t    addr,
void *    vp,
int    nbytes
 

Definition at line 408 of file memory.c.

References byte_t, mem_access_fn, mem_cmd, and word_t.

00414 {
00415   byte_t *p = vp;
00416   int words = nbytes >> 2;              /* note: nbytes % 2 == 0 is assumed */
00417   enum md_fault_type fault;
00418 
00419   while (words-- > 0)
00420     {
00421       fault = mem_fn(mem, cmd, addr, p, sizeof(word_t));
00422       if (fault != md_fault_none)
00423         return fault;
00424 
00425       addr += sizeof(word_t);
00426       p += sizeof(word_t);
00427     }
00428 
00429   /* no faults... */
00430   return md_fault_none;
00431 }

enum md_fault_type mem_bzero mem_access_fn    mem_fn,
struct mem_t   mem,
md_addr_t    addr,
int    nbytes
 

Definition at line 435 of file memory.c.

References byte_t, mem_access_fn, and Write.

Referenced by ld_load_prog().

00439 {
00440   byte_t c = 0;
00441   enum md_fault_type fault;
00442 
00443   /* zero out NBYTES of simulator memory */
00444   while (nbytes-- > 0)
00445     {
00446       fault = mem_fn(mem, Write, addr++, &c, 1);
00447       if (fault != md_fault_none)
00448         return fault;
00449     }
00450 
00451   /* no faults... */
00452   return md_fault_none;
00453 }

struct mem_t* mem_create char *    name
 

Definition at line 106 of file memory.c.

References fatal(), mystrdup(), and mem_t::name.

Referenced by sim_init(), and sim_load_prog().

00107 {
00108   struct mem_t *mem;
00109 
00110   mem = calloc(1, sizeof(struct mem_t));
00111   if (!mem)
00112     fatal("out of virtual memory");
00113 
00114   mem->name = mystrdup(name);
00115   return mem;
00116 }

enum md_fault_type mem_dump struct mem_t   mem,
md_addr_t    addr,
int    len,
FILE *    stream
 

Definition at line 308 of file memory.c.

References len, mem_access(), myfprintf(), Read, and word_t.

00312 {
00313   int data;
00314   enum md_fault_type fault;
00315 
00316   if (!stream)
00317     stream = stderr;
00318 
00319   addr &= ~sizeof(word_t);
00320   len = (len + (sizeof(word_t) - 1)) & ~sizeof(word_t);
00321   while (len-- > 0)
00322     {
00323       fault = mem_access(mem, Read, addr, &data, sizeof(word_t));
00324       if (fault != md_fault_none)
00325         return fault;
00326 
00327       myfprintf(stream, "0x%08p: %08x\n", addr, data);
00328       addr += sizeof(word_t);
00329     }
00330 
00331   /* no faults... */
00332   return md_fault_none;
00333 }

void mem_init struct mem_t   mem
 

Definition at line 293 of file memory.c.

References MEM_PTAB_SIZE, mem_t::page_count, mem_t::ptab, mem_t::ptab_accesses, and mem_t::ptab_misses.

Referenced by sim_init().

00294 {
00295   int i;
00296 
00297   /* initialize the first level page table to all empty */
00298   for (i=0; i < MEM_PTAB_SIZE; i++)
00299     mem->ptab[i] = NULL;
00300 
00301   mem->page_count = 0;
00302   mem->ptab_misses = 0;
00303   mem->ptab_accesses = 0;
00304 }

void mem_newpage struct mem_t   mem,
md_addr_t    addr
 

Definition at line 152 of file memory.c.

References byte_t, fatal(), getcore(), MEM_PTAB_SET, MEM_PTAB_TAG, mem_pte_t::next, mem_pte_t::page, mem_t::page_count, mem_t::ptab, and mem_pte_t::tag.

00154 {
00155   byte_t *page;
00156   struct mem_pte_t *pte;
00157 
00158   /* see misc.c for details on the getcore() function */
00159   page = getcore(MD_PAGE_SIZE);
00160   if (!page)
00161     fatal("out of virtual memory");
00162 
00163   /* generate a new PTE */
00164   pte = calloc(1, sizeof(struct mem_pte_t));
00165   if (!pte)
00166     fatal("out of virtual memory");
00167   pte->tag = MEM_PTAB_TAG(addr);
00168   pte->page = page;
00169 
00170   /* insert PTE into inverted hash table */
00171   pte->next = mem->ptab[MEM_PTAB_SET(addr)];
00172   mem->ptab[MEM_PTAB_SET(addr)] = pte;
00173 
00174   /* one more page allocated */
00175   mem->page_count++;
00176 }

void mem_reg_stats struct mem_t   mem,
struct stat_sdb_t   sdb
 

Definition at line 264 of file memory.c.

References mem_t::name, mem_t::page_count, mem_t::ptab_accesses, mem_t::ptab_misses, stat_reg_counter, and stat_reg_formula().

Referenced by sim_reg_stats().

00266 {
00267   char buf[512], buf1[512];
00268 
00269   sprintf(buf, "%s.page_count", mem->name);
00270   stat_reg_counter(sdb, buf, "total number of pages allocated",
00271                    &mem->page_count, mem->page_count, NULL);
00272 
00273   sprintf(buf, "%s.page_mem", mem->name);
00274   sprintf(buf1, "%s.page_count * %d / 1024", mem->name, MD_PAGE_SIZE);
00275   stat_reg_formula(sdb, buf, "total size of memory pages allocated",
00276                    buf1, "%11.0fk");
00277 
00278   sprintf(buf, "%s.ptab_misses", mem->name);
00279   stat_reg_counter(sdb, buf, "total first level page table misses",
00280                    &mem->ptab_misses, mem->ptab_misses, NULL);
00281 
00282   sprintf(buf, "%s.ptab_accesses", mem->name);
00283   stat_reg_counter(sdb, buf, "total page table accesses",
00284                    &mem->ptab_accesses, mem->ptab_accesses, NULL);
00285 
00286   sprintf(buf, "%s.ptab_miss_rate", mem->name);
00287   sprintf(buf1, "%s.ptab_misses / %s.ptab_accesses", mem->name, mem->name);
00288   stat_reg_formula(sdb, buf, "first level page table miss rate", buf1, NULL);
00289 }

enum md_fault_type mem_strcpy mem_access_fn    mem_fn,
struct mem_t   mem,
enum mem_cmd    cmd,
md_addr_t    addr,
char *    s
 

Definition at line 338 of file memory.c.

References mem_access_fn, mem_cmd, Read, s, and Write.

Referenced by ld_load_prog(), and sys_syscall().

00343 {
00344   int n = 0;
00345   char c;
00346   enum md_fault_type fault;
00347 
00348   switch (cmd)
00349     {
00350     case Read:
00351       /* copy until string terminator ('\0') is encountered */
00352       do {
00353         fault = mem_fn(mem, Read, addr++, &c, 1);
00354         if (fault != md_fault_none)
00355           return fault;
00356         *s++ = c;
00357         n++;
00358       } while (c);
00359       break;
00360 
00361     case Write:
00362       /* copy until string terminator ('\0') is encountered */
00363       do {
00364         c = *s++;
00365         fault = mem_fn(mem, Write, addr++, &c, 1);
00366         if (fault != md_fault_none)
00367           return fault;
00368         n++;
00369       } while (c);
00370       break;
00371 
00372     default:
00373       return md_fault_internal;
00374   }
00375 
00376   /* no faults... */
00377   return md_fault_none;
00378 }

byte_t* mem_translate struct mem_t   mem,
md_addr_t    addr
 

Definition at line 120 of file memory.c.

References MEM_PTAB_SET, MEM_PTAB_TAG, mem_pte_t::next, mem_pte_t::page, mem_t::ptab, mem_t::ptab_accesses, mem_t::ptab_misses, and mem_pte_t::tag.

00122 {
00123   struct mem_pte_t *pte, *prev;
00124 
00125   /* got here via a first level miss in the page tables */
00126   mem->ptab_misses++; mem->ptab_accesses++;
00127 
00128   /* locate accessed PTE */
00129   for (prev=NULL, pte=mem->ptab[MEM_PTAB_SET(addr)];
00130        pte != NULL;
00131        prev=pte, pte=pte->next)
00132     {
00133       if (pte->tag == MEM_PTAB_TAG(addr))
00134         {
00135           /* move this PTE to head of the bucket list */
00136           if (prev)
00137             {
00138               prev->next = pte->next;
00139               pte->next = mem->ptab[MEM_PTAB_SET(addr)];
00140               mem->ptab[MEM_PTAB_SET(addr)] = pte;
00141             }
00142           return pte->page;
00143         }
00144     }
00145 
00146   /* no translation found, return NULL */
00147   return NULL;
00148 }



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