示例#1
0
文件: mem.c 项目: axelmuhr/Helios-NG
PUBLIC void initmem()
{
   (void)VMInit(NULL,(int)vmpagesize,1000);
   
   codeseg = VMPage();
   vmheap = VMPage();
   codesize = 0;
}
示例#2
0
/////////////////////////////////////////////////////////////////////
// IDolphinSmalltalk
STDMETHODIMP CDolphinSmalltalk::Initialise(HINSTANCE hInstance, 
									  LPCSTR fileName, LPVOID imageData, UINT imageSize,
									DWORD dwFlags)
{
	HRESULT APIENTRY VMInit(LPCSTR szImageName, LPVOID, UINT, DWORD);

	if (hInstance == NULL || imageData == NULL || imageSize == 0)
		return E_INVALIDARG;

	piVM = this;
	
	Lock();

	hApplicationInstance = hInstance;
	HRESULT hr = VMInit(fileName, imageData, imageSize, dwFlags);

	Unlock();

	return hr;
}
示例#3
0
dip_status DIPIMPENTRY( LoadInfo )( dig_fhandle fid, imp_image_handle *ii )
{
    dip_status                  ds;
    unsigned long               off;
    unsigned long               size;
    cv_directory_entry          *cde;
    cv_sst_global_types_header  *hdr;

    memset( ii, 0, sizeof( *ii ) );
    ds = FindCV( fid, &off, &size );
    if( ds != DS_OK )
        return( ds );
    ii->sym_fid = fid;
    ii->bias = off;
    ds = VMInit( ii, size );
    if( ds != DS_OK )
        return( ds );
    ii->next_image = ImageList;
    ImageList = ii;
    ds = LoadDirectory( ii, off + CV_SIG_SIZE );
    if( ds != DS_OK ) {
        DCStatus( ds );
        Cleanup( ii );
        return( ds );
    }
    ds = LoadMapping( ii );
    if( ds != DS_OK ) {
        DCStatus( ds );
        Cleanup( ii );
        return( ds );
    }
    cde = FindDirEntry( ii, IMH_GBL, sstGlobalTypes );
    if( cde != NULL ) {
        hdr = VMBlock( ii, cde->lfo, sizeof( *hdr ) );
        if( hdr == NULL ) {
            Cleanup( ii );
            return( DS_ERR|DS_FAIL );
        }
        ii->types_base = cde->lfo
                         + offsetof(cv_sst_global_types_header, offType )
                         + hdr->cType * sizeof( hdr->offType[0] );
    }
    ds = SetMADType( ii );
    if( ds != DS_OK ) {
        DCStatus( ds );
        Cleanup( ii );
        return( ds );
    }
    return( DS_OK );
}
示例#4
0
/*
 * Load debug info if it's in the HLL/CV format.
 */
dip_status DIGENTRY DIPImpLoadInfo( dig_fhandle h, imp_image_handle *ii )

{
    dip_status      rc;

    /* Init the module handle. */
    memset( ii, 0, sizeof( *ii ) );
    ii->mad = MAD_X86;                  /* No known non-x86 support */
    ii->sym_file = h;
    ii->is_32bit = 1;
    ii->format_lvl = HLL_LVL_NB04;
    ii->next_image = ImageList;
    ImageList = ii;

    /* Read basic HLL and executable image bits. */
    rc = FindHLL( ii );
    if( rc == DS_OK ) {
        rc = VMInit( ii, ii->size );
    }

    /* Make sure we've got segment mappings. (FIXME: scan module headers) */
    if( rc == DS_OK && !ii->segments ) {
        ii->seg_count = 2;
        ii->segments = DCAlloc( sizeof( hllinfo_seg ) * ii->seg_count );
        if( ii->segments != NULL ) {
            memset( ii->segments, 0, sizeof( hllinfo_seg ) * ii->seg_count );
            ii->segments[0].is_executable = 1;
            ii->segments[0].map.segment = 1;
            ii->segments[1].map.segment = 2;
            ii->segments[0].size = ii->segments[1].size = 0x00400000; /* 4MB */
            ii->segments[0].address = ii->segments[1].address = 0;
        } else{
            rc = DS_ERR | DS_NO_MEM;
        }
    }

    /* Locate global types. If none, we've types per module. */
    if( rc == DS_OK ) {
        /* FIXME
        hll_debug_dir *cde;
        cde = FindDirEntry( ii, IMH_GBL, sstGlobalTypes );
        if( cde != NULL ) {
            hdr = VMBlock( ii, cde->lfo, sizeof( *hdr ) );
            if( hdr == NULL ) {
                Cleanup( ii );
                return( DS_ERR | DS_FAIL );
            }
            ii->types_base = cde->lfo
                + offsetof( cv_sst_global_types_header, offType )
                + hdr->cType * sizeof( hdr->offType[0] );
        }
        */
    }

    /* We're done - clean up on failure. */
    if( rc != DS_OK ) {
        DCStatus( rc );
        Cleanup( ii );
    }
    return( rc );
}
示例#5
0
/* VMChunkCreate -- create a chunk
 *
 * chunkReturn, return parameter for the created chunk.
 * vmArena, the parent VMArena.
 * size, approximate amount of virtual address that the chunk should reserve.
 */
static Res VMChunkCreate(Chunk *chunkReturn, VMArena vmArena, Size size)
{
  Arena arena;
  Res res;
  Addr base, limit, chunkStructLimit;
  VMStruct vmStruct;
  VM vm = &vmStruct;
  BootBlockStruct bootStruct;
  BootBlock boot = &bootStruct;
  VMChunk vmChunk;
  void *p;

  AVER(chunkReturn != NULL);
  AVERT(VMArena, vmArena);
  arena = VMArena2Arena(vmArena);
  AVER(size > 0);

  res = VMInit(vm, size, ArenaGrainSize(arena), vmArena->vmParams);
  if (res != ResOK)
    goto failVMInit;

  base = VMBase(vm);
  limit = VMLimit(vm);

  res = BootBlockInit(boot, (void *)base, (void *)limit);
  if (res != ResOK)
    goto failBootInit;

  /* Allocate and map the descriptor. */
  /* See <design/arena/>.@@@@ */
  res = BootAlloc(&p, boot, sizeof(VMChunkStruct), MPS_PF_ALIGN);
  if (res != ResOK)
    goto failChunkAlloc;
  vmChunk = p;
  /* Calculate the limit of the grain where the chunkStruct resides. */
  chunkStructLimit = AddrAlignUp((Addr)(vmChunk + 1), ArenaGrainSize(arena));
  res = vmArenaMap(vmArena, vm, base, chunkStructLimit);
  if (res != ResOK)
    goto failChunkMap;
  vmChunk->overheadMappedLimit = chunkStructLimit;

  /* Copy VM descriptor into its place in the chunk. */
  VMCopy(VMChunkVM(vmChunk), vm);
  res = ChunkInit(VMChunk2Chunk(vmChunk), arena, base, limit,
                  VMReserved(VMChunkVM(vmChunk)), boot);
  if (res != ResOK)
    goto failChunkInit;

  BootBlockFinish(boot);

  vmChunk->sig = VMChunkSig;
  AVERT(VMChunk, vmChunk);

  *chunkReturn = VMChunk2Chunk(vmChunk);
  return ResOK;

failChunkInit:
  VMUnmap(vm, VMBase(vm), chunkStructLimit);
failChunkMap:
failChunkAlloc:
failBootInit:
  VMFinish(vm);
failVMInit:
  return res;
}