k%Writing SDA Extensions.

Writing SDA Extensions


9Previous6 | Contents


?If you require other FAO directives, you must invoke them from ,user-written formatting routines. See below.

GIf you add 0x80 (decimal 128) to the above values, the approbiate line Eentry in the column is displayed only if the value obtained from the Gdata structure is non-zero; otherwise, the line is omitted - resulting %in possibly different column lengths.

EThis does, however, not apply to the last two values which provide a =way to format queue headers. They require you to specify the Hdatsva argument and use this argument to determine whether the Hqueue whose header is assumed to be at the specified offset in the data Gstructure is empty. This is done by comparing the queue header forward Blink with the value passed in datsva; if they match, the Gforward link points to itself and the string <empty> is 4displayed instead of the hexadecimal header address.

1User-written formatting routines

HBy specifying the address of a routine in a line entry's 'value' field, Hthe callback invokes this routine when the value must be formatted. The Eroutine is invoked as subroutine with the following processor registers:



FThe routine must ensure that the returned string contains exactly the Gnumber of characters which is passed in R5. Unused character positions Dmust be filled with blanks; the string must be right-justified. The Droutine is responsible for formatting only, printing is done by the callback.

FRegisters R1-R5 may be used as scratch registers, all other registers G(except R0) must be preserved. R0 is used to indicate whether the line Eentry should be displayed (1) or not (0). If you return 0 in R0, the Gentire line entry is skipped. You can use this to suppress the display 5of line entries with no interesting values (e.g., 0).





Note

HWhen displaying multiple columns on a single screen, this may result in Fdifferent column lengths. In addition, all columns must have the same Ewidth in this case, since line entries may be displayed in different Fcolumns. For example, if you have 2 columns and the line entry of the Hcolumn 1 is skipped by the formatting routine, the line entry of column 62 is displayed in column 1.



ŠYou may use SDA$EXTEND_PRINT_COLUMN_VALUE to perform formatting with the FAO directives ‚provided by this callback. See the description of SDA$EXTEND_PRINT_COLUMN_VALUE.

>Examples of user-written formatting routines are given in the Examples section. 


/

Condition values returned

2



Example


:/* This code shows the usage of SDA$EXTEND_PRINT_COLUMNS. DIn this example, we obtain all PCB addresses from the SCH$GL_PCBVEC <vector array, and display some information (a subset of the ?information displayed by SDA's SHOW PROCESS commands. For some ?items, we use special formatting routines. Since this routines ?are called as subroutines, we build MACRO-32 jackets to invoke  the corresponding C routine. */  #include <pcbdef.h> #include <starlet.h> #include <statedef.h> #include <stdlib.h> #include <string.h>   /* FAO code constants. */  #define FAO_AC 0 #define FAO_AS 1 #define FAO_OB 2 #define FAO_XB 3 #define FAO_ZB 4 #define FAO_UB 5 #define FAO_SB 6 #define FAO_OW 7 #define FAO_XW 8 #define FAO_ZW 9 #define FAO_UW 10 #define FAO_SW 11 #define FAO_OL 12 #define FAO_XL 13 #define FAO_ZL 14 #define FAO_UL 15 #define FAO_SL 16 #define FAO_Q2 17 #define FAO_Q2S 18  %typedef struct dsc$descriptor_s dsc;  Aint  SDA_EXTEND_SYMBOL_VALUE(); /* Jacket to get a symbol value, t                                   see SDA$EXTEND_SYMBOL_VALUE */ int  SDA$EXTEND_REQMEM(),  !void SDA$EXTEND_PRINT_COLUMNS(),      SDA$EXTEND_SKIP_LINES();  =int m_stat_rtn(),       /* Jacket to format process state */ 3    m_uic_rtn(),        /* Jacket to format UIC */ =    m_ast_rtn();        /* Jacket to format AST's enabled */  5dsc* desc();            /* Convert ASCIZ to ASCID */  /* Line entry structure. */  struct line_entry { B char *str_ptr;         /* Pointer to ASCIC description string */  variant_union  { 1  int offset;           /* Negative offset or */ .  int (*rtn_adr)();     /* routine address */  } x;  variant_union  { *  int fao_cod;          /* FAO code or */ 4  int value;            /* value to be formatted */  } y; 7 char des_wid;          /* Description string width */ 4 char val_wid;          /* Value string width */    < char sep_wid;          /* Column separator string width */ : char unused;           /* Spare byte for lw alignment */ };  /**** MAIN routine. ****/  ;/* This routine traverses the PCB vector array and invokes :   SDA$EXTEND_PRINT_COLUMNS to print information from all 
   PCB's.  ;   We display data in 2 colums. Define now the description ;   strings. Remember, they are formatted as ASCIC (counted    ASCII)! */  int main() { * char c_col1[8][20] = {"\013PCB address", *                       "\013PHD address", +                       "\014Internal PID", +                       "\014External PID", $                       "\005State", /                       "\020Current priority", ,                       "\015Base priority", #                       "\003UIC"};  * char c_col2[8][24] = {"\013JIB address", 4                       "\025Swapfile disk address", /                       "\020Subprocess count", *                       "\013Creator PID", 2                       "\023Termination mailbox", +                       "\014ASTs enabled", *                       "\013ASTs active", .                       "\016ASTs remaining"};  9 /* Define both column entries. Each entry consists of 8 <    line entries and is terminated with a longword of 0. */   struct lin_entry col1[9] =  { *  c_col1[0],-PCB$L_SQBL,FAO_XL,16,14,8,0, *  c_col1[1],-PCB$L_PHD, FAO_XL,16,14,8,0, *  c_col1[2],-PCB$L_PID, FAO_XL,16,14,8,0, *  c_col1[3],-PCB$L_EPID,FAO_XL,16,14,8,0, *  c_col1[4],m_stat_rtn, 0,     16,14,8,0, *  c_col1[5],-PCB$B_PRI, FAO_UB,16,14,8,0, *  c_col1[6],-PCB$B_PRIB,FAO_UB,16,14,8,0, *  c_col1[7],m_uic_rtn,  0,     16,14,8,0,   0  };   struct lin_entry col2[9] =  { +  c_col2[0],-PCB$L_JIB,   FAO_XL,26,8,0,0, +  c_col2[1],-PCB$L_WSSWP, FAO_XL,26,8,0,0, +  c_col2[2],-PCB$W_PRCCNT,FAO_UW,26,8,0,0, +  c_col2[3],-PCB$L_OWNER, FAO_XL,26,8,0,0, +  c_col2[4],-PCB$W_TMBU,  FAO_XW,26,8,0,0, +  c_col2[5],m_ast_rtn,    0,     26,8,0,0, +  c_col2[6],m_ast_rtn     0,     26,8,0,0, +  c_col2[7],-PCB$W_ASTCNT,FAO_UW,26,8,0,0,   0  };  2 int *curpcb,          /* Address of curr. PCB */ 3     *pcbvec,          /* Address of PCB vector */ 1      *nullpcb,        /* Address of NULL PCB */ 0      maxproc,         /* Max # of processes */ )      tmp,             /* Aux storage */ -      cnt = 1;         /* Process counter */  / struct __PCB pcb;     /* Local copy of PCB */  3 /* Well, let's start... first obtain the value of "    all relevant system cells. */  ; SDA_EXTEND_SYMBOL_VALUE(desc("SCH$GL_NULLPCB"),&tmp); & SDA$EXTEND_REQMEM(tmp,&nullpcb);  : SDA_EXTEND_SYMBOL_VALUE(desc("SCH$GL_PCBVEC"),&tmp); % SDA$EXTEND_REQMEM(tmp,&pcbvec);  : SDA_EXTEND_SYMBOL_VALUE(desc("SCH$GL_MAXPIX"),&tmp); & SDA$EXTEND_REQMEM(tmp,&maxproc);  + /* Now, loop through PCB vector array. */   while (cnt != maxproc)  { .  /* Get next PCB address from PCB vector. */  5  SDA$EXTEND_REQMEM(&pcbvec[cnt],&curpcb,4);  =  /* If it's the address of the NULL PCB, this array element      is unsed. Try next. */  ,  if (curpcb == nullpcb) {cnt++; continue;}  ;  /* Well, the PCB is use. Copy it to our local buffer. */  3  SDA$EXTEND_REQMEM(curpcb,&pcb,PCB$K_LENGTH);  8  /* In our copy, overwrite the PCB$L_SQBL (state queue 8     backward link) longword with the S0 address of the 8     PCB. We do not display the contents of PCB$L_SQBL, -     but want to display the PCB address. */    pcb.PCB$L_SQBL = curpcb;  9  /* Process priorities are stored internally in reverse 9     order (highest priority = 0). Translate them to the 9     well-known external order (highest priority = 31 on      VAX or 63 on Alpha). */  4  pcb.PCB$B_PRI  = abs(pcb.PCB$B_PRI-31); /* VAX */ :  pcb.PCB$B_PRIB = abs(pcb.PCB$B_PRIB-31);      /* VAX */ 6  pcb.PCB$L_PRI  = abs(pcb.PCB$L_PRI-63); /* Alpha */ <  pcb.PCB$L_PRIB = abs(pcb.PCB$L_PRIB-63);      /* Alpha */  <  /* Update the line entries values with special formatting      from the PCB. */  #  col1[4].value = pcb.PCB$W_STATE; !  col1[7].value = pcb.PCB$L_UIC; $  col2[5].value = pcb.PCB$B_ASTEN;; $  col2[6].value = pcb.PCB$B_ASTACT;  A  /* Well, that's all here. The rest is done by the callback. */  2  SDA$EXTEND_PRINT_COLUMNS(&pcb,0,col1,col2);  >  SDA$EXTEND_SKIP_LINES(1);        /* Insert empty line and*/  @  cnt++;                           /* switch to next process */  } }  /********/  dsc *desc(char *str) { D /* Given a null-terminated (ASCIZ) string, this function returns a @    fixed-length descriptor pointing to this string (ASCID). */   static $DESCRIPTOR (x,"");   x.dsc$w_length = strlen(str);  x.dsc$a_pointer= str;   return &x; }  /********/  >/* Formatting routines. These routine are invoked by MACRO-32 <   jackets (see below). The routines and their jackets have >   similar names except the jacket names start wih "m_" where +   the C routine names start with "c_". */  2int c_stat_rtn(int value,int val_wid,dsc *retbuf) { < /* This routine is invoked to translate the binary process :    state (from PCB$W_STATE) into a corresponding string. 4    Process states are defined in module $STATEDEF.  ,    value:    value passed from PCB$W_STATE $    val_wid:  width of value string A    retbuf:   address of descriptor pointing to return buffer */  - char locstat[6];     /* Temporary buffer */   switch(value)  { 5  case SCH$C_COLPG: {strcpy(locstat,"COLPG");break;} 5  case SCH$C_MWAIT: {strcpy(locstat,"MWAIT");break;} 5  case SCH$C_CEF:   {strcpy(locstat,"CEF");  break;} 5  case SCH$C_PFW:   {strcpy(locstat,"PFW");  break;} 5  case SCH$C_LEF:   {strcpy(locstat,"LEF");  break;} 5  case SCH$C_LEFO:  {strcpy(locstat,"LEFO"); break;} 5  case SCH$C_HIB:   {strcpy(locstat,"HIB");  break;} 5  case SCH$C_HIBO:  {strcpy(locstat,"HIBO"); break;} 5  case SCH$C_SUSP:  {strcpy(locstat,"SUSP"); break;} 5  case SCH$C_SUSPO: {strcpy(locstat,"SUSPO");break;} 5  case SCH$C_FPG:   {strcpy(locstat,"FPG");  break;} 5  case SCH$C_COM:   {strcpy(locstat,"COM");  break;} 5  case SCH$C_COMO:  {strcpy(locstat,"COMO"); break;} 5  case SCH$C_CUR:   {strcpy(locstat,"CUR");  break;}  } 6 /* Right-adjust the string to fill the outbuf buffer +    with the required number of blanks. */  : sprintf(retbuf->dsc$a_pointer,"%*s",val_wid,locstat);  : return 1;      /* Yes, we want to display our result! */ }  
/*******/  1int c_uic_rtn(int value,int val_wid,dsc *retbuf) { 6 /* This routine is invoked to translate a binary UIC 8    (from PCB$L_UIC) into a corresponding identifier or 5    UIC string. This must be done external since the 8    available directives in the callback do not provide ,    the !%I directive which we use here. */  *    value:    value passed from PCB$L_UIC $    val_wid:  width of value string A    retbuf:   address of descriptor pointing to return buffer */  , char locbuf[6];     /* Temporary buffer */   short retlen;   $DESCRIPTOR(loc,locbuf);  $DESCRIPTOR(ctrl_str,"!%I");  H sys$fao(&ctrl_str,&retlen,&loc,value);  /* Format value */  : locbuf[retlen] = 0;                     /* Make ASCIZ */  6 /* Right-adjust the string to fill the outbuf buffer +    with the required number of blanks. */  : sprintf(retbuf->dsc$a_pointer,"%*s",val_wid,locstat);  : return 1;      /* Yes, we want to display our result! */ }  
/*******/  1int c_uic_rtn(int value,int val_wid,dsc *retbuf) { 8 /* This routine is invoked to translate the AST active >    and AST enabled access mode bit mask into a corresponding 5    string. If no bits are set, the string "NONE" is 9    returned; otherwise, the letters K,E,S,U for all bit %    set in the mask are returned. */   char locbuf[6];  9 if (!value) strcpy(locbuf,"NONE");     /* No bit set */   else  {   locbuf[0] = 0;  9  if (value & 1) strcat(locbuf,"K");    /* Kernel */ <  if (value & 2) strcat(locbuf,"E");    /* Executive */ =  if (value & 4) strcat(locbuf,"S");    /* Supervisor */ 7  if (value & 8) strcat(locbuf,"U");    /* User */  } 6 /* Right-adjust the string to fill the outbuf buffer +    with the required number of blanks. */  : sprintf(retbuf->dsc$a_pointer,"%*s",val_wid,locstat);  : return 1;      /* Yes, we want to display our result! */ }  <===========================================================  ; MACRO-32 jackets ; ---------------- ; 7; These jackets are invoked as user-written formatting 9; routines. We just push the required arguments on stack 9; and invoke the corresponding C routines as procedures. ; ; R2:  value to be formatted ; R5:  value string width 7; R7:  address of descriptor pointing to output string >; R11: base address of structure (callback 'datbas' argument) ; =; Note: we do not need the contents of R11 here; R2 contains 9;       the value we want to format. There is no need to );       pass R11 to our C procedures. */ ; ; AM_STAT_RTN:: pushl  r7               ; 3. arg: output descriptor A             pushl  r5               ; 2. arg: value string size 5             pushl  r2               ; 1. arg: value >             calls  #3,g^C_STAT_RTN  ; Invoke C state routine <             rsb                     ; Return as subroutine  AM_UIC_RTN::  pushl  r7               ; 3. arg: output descriptor A             pushl  r5               ; 2. arg: value string size 5             pushl  r2               ; 1. arg: value @             calls  #3,g^C_UIC_RTN   ; Invoke C UIC format rtn. <             rsb                     ; Return as subroutine  AM_AST_RTN::  pushl  r7               ; 3. arg: output descriptor A             pushl  r5               ; 2. arg: value string size 5             pushl  r2               ; 1. arg: value D             calls  #3,g^C_AST_RTN   ; Invoke C AST bit format rtn. <             rsb                     ; Return as subroutine 


2This example shows in full detail how you can use HSDA$EXTEND_PRINT_COLUMNS for automatic column processing. The most work Ehere is the definition of the line and column entries. Once they are =defined, you can easily create nice column-oriented displays.


?

SDA$EXTEND_PRINT_COLUMN_VALUE



Formats a single line entry.



Format

'

SDA$EXTEND_PRINT_COLUMN_VALUE




RETURNS



0This callback does not return a condition value.




ARGUMENTS

R2


                
 VMS usage: address
type:  longword (unsigned)
access:  read only
 mechanism:  by reference

HWhen invoking this callback, the processor register R2 must contain the 2address of the data item to be formatted.

R4


                
 VMS usage:  longword_unsigned
type:  longword (unsigned)
access:  read only
 mechanism:  by value

HWhen invoking this callback, the processor register R4 must contain the =code of the FAO directive to be used for formatting. See the „description of SDA$EXTEND_PRINT_COLUMNS, section FAO directive codes for /a list and description of available directives.

R5


                
 VMS usage:  longword_unsigned
type:  longword (unsigned)
access:  read only
 mechanism:  by value

HWhen invoking this callback, the processor register R5 must contain the Fpredefined width of the value string. The callback uses this argument Hto select a "!#xx" from its table (according the value given in R4) and Dpass this argument as width parameter to the SYS$FAO system service.

R7


                
 VMS usage:  char_string
type:  character string
access:  write only
 mechanism: 4 by descriptor - fixed-length string descriptor

HWhen invoking this callback, the processor register R7 must contain the Caddress of a descriptor pointing to a buffer wherein the formatted Cstring can be written. The buffer must be large enough to hold the Cstring with the maximum of possible characters inserted by the FAO Hdirective (for example, with UL (unsigned longword), you should provide at least a 10-byte buffer).

FSee the System Service Reference manual for a description of Gall available FAO directives and the required maximum output space for each directive.




DESCRIPTION

?This routine is the single column entry action routine used by „SDA$EXTEND_PRINT_COLUMNS when a data structure offset is specified in place of an Haction routine. It locates the specified data, converts it to ASCII and $stores it in the buffer given in R7.

GYou can invoke this callback from your user-written formatting routine Dif the FAO directives provided by the callback suit your needs. The rcallback accepts all FAO directive codes listed in Table B-2. Using Bthis callback may become necessary when data to be formatted does Gnot come from a data structure or must processed in a special Bway before it can be displayed. In your formatting routine, first Fprepare the data in the required way and then invoke this callback to format it.

DThe callback is invoked as subroutine. When called Dfrom a high level language, a MACRO-32 jacket must be provided. The Fjacket must load the processor registers with the required values and Finvoke the callback with a JSB instruction. See the Examples section how to do this.





Note

@Although the name of the callback starts with PRINT, nothing is Eprinted, the callback just formats data with the FAO directive whose Ecode is passed in R4. In addition, not a column entry, only a single Fline entry is processed. It is assumed that the name of this callback Dwill change to one describing better its purpose in future releases :(e.g. SDA$EXTEND_FORMAT_ENTRY).



EThe callback will destroy registers R0 - R4. All other registers are preserved.


/

Condition values returned

2



Example


l/* The example in the description SDA$EXTEND_PRINT_COLUMNS?   converts the internal process priority to an external value C   and modifies the approbiate locations in the PCB data structure r   before SDA$EXTEND_PRINT_COLUMNS is invoked. In this example, <   we will use user-written formatting routines which first A   convert the priority and then invoke SDA$EXTEND_PRINT_COLUMN_    VALUE to format it.  >   This example show only the relevant changes from the above    example. */   /* Changed line entries. */   . . ." c_col1[5],m_pri_rtn,1,16,14,8,0, " c_col1[6],m_pri_rtn,2,16,14,8,0,  . . . B-----------------------------------------------------------------  7 ; This is the MACRO-32 jacket to invoke the c_pri_rtn 8 ; routine. Note that this time, we pass the address of < ; the data structure (in R11) to the C routine as well. */  B M_PRI_RTN:: pushl  r11              ; 4. arg. data struct. addr. A             pushl  r7               ; 3. arg: output descriptor A             pushl  r5               ; 2. arg: value string size 5             pushl  r2               ; 1. arg: value A             calls  #4,g^C_PRI_RTN   ; Invoke C priority routine <             rsb                     ; Return as subroutine  B-----------------------------------------------------------------  # /* This the C_PRI_RTN routine: */  F int c_pri_rtn(int pri_typ,int val_wid,dsc *retbuf,struct __PCB *pcb)  { E  /* This is the routine to convert and format the process priority. 6     The 'pri_typ' determines which priority is used:  -     1 = current priority (offset PCB$B_PRI) /     2 = base priority (offset PCB$B_PRIB). */  .  int priority;                /* Priority */  ;  switch(pri_typ)              /* On Alpha, subtract 63 */   { :   case 1: {priority = abs(pcb->PCB$B_PRI-31); break;} ;   case 2: {priority = abs(pcb->PCB$B_PRIB-31); break;} 5   default: priority = 255;    /* Indicates error */   } 9  /* Now invoke SDA$EXTEND_PRINT_COLUMN ENTRY to format. :     This time, we need a MACRO-32 jacket which to invoke $     the callback as subroutine. */  0  print_column(priority,FAO_UB,val_wid,retbuf);  ;  return 1;      /* Yes, we want to display our result! */  }  B-----------------------------------------------------------------  4 ; This is the print_column jacket. Registers R1-R4 5 ; are destroyed by the callback, R5 and R7 are used 8 ; to pass additional arguments, so all these registers  ; must be saved.  3   .entry PRINT_COLUMN,^m<r1,r2,r3,r4,r5,r7> (   movl   4(ap),r2           ; Priority 2   movl   8(ap),r4           ; FAO directive code /   movl  12(ap),r5           ; Value width     -   movl  16(ap),r7           ; Output buffer *   jsb    g^SDA$EXTEND_PRINT_COLUMN_VALUE 3   ret                       ; Return to C_PRI_RTN  


EThis example shows how to invoke SDA$EXTEND_PRINT_COLUMN_VALUE. This Ccan be done from MACRO-32 or BLISS only since the callback must be invoked as subroutine.

Therefore, our code

¹

=As you can see, several layers are required, but you can use ?SDA$EXTEND_PRINT_COLUMN_VALUE even from C and other high level 4languages, as long as MACRO-32 jackets are provided.








Note

B

¹ You're not confused, aren't you?


9

SDA$EXTEND_READ_SYMFILE



3Reads symbols from a symbol table or from an image.



Format

/

SDA$EXTEND_READ_SYMFILE filnam, reloc

 (VAX V5 and V6):

SDA$EXTEND_READ_SYMFILE filnam, reloc, [options]

(VAX V7)B

SDA$EXTEND_READ_SYMFILE filnam, reloc, symvec_va, symvec_siz, options, suppr

(Alpha V6)B

SDA$EXTEND_READ_SYMFILE filnam, reloc, symvec_va, symvec_siz, options, nullarg, [ldrimg]

(Alpha V7)



RETURNS

                
 VMS usage:  cond_value
type:  longword (unsigned)
access:  write only
 mechanism:  by value


DUnless you set the OPT$M_NOSIGNAL_READ bit in options, all Fconditions are signaled as warnings as well (this bit exists on Alpha HV7 only, so you must declare a condition handler on other VMS versions; Šsee Section 3.5 and SDA$EXTEND_HANDLER).




ARGUMENTS



filnam


                
 VMS usage:  char_string
type:  character string
access:  read only
 mechanism: 4 by descriptor - fixed-length string descriptor

DName of the file containing symbol definitions. The filnam Eargument is the address of a character string descriptor pointing to Hthe filename. The filename must not contain wildcard characters. If you Hdo not supply a file type, SDA first loos for a symbol table (.STB) or, Dif no matching file is found, for a system image or shareable image (.EXE).

DAlpha only: if the filename is the same as that of an loaded system Himage or activated shareable image, but the symbols in the file are not =those of the image, you must set the OPT$M_FORCE_READ bit in Goptions and optionally supply additional information with the Ereloc, symvec_va and symvec_siz arguments.

FIf the OPT$M_EXEC_READ flag is set in options, this argument Dis optional and, if specified, is the address of a character string Ddescriptor pointing to the name of the directory wherein all system images reside.

reloc


                
 VMS usage:  longword_unsigned
type:  longword (unsigned)
access:  read only
 mechanism:  by value

HA longword containing the relocation (base) value which is added to all Arelative symbols. If you specify 0, no base value is added. This Fargument is ignored with the OPT$M_IMAGE_READ or OPT$M_EXEC_READ bits >in options; it is also ignored for sliced images. It <corresponds to SDA's READ/RELOCATE command.

symvec_va (Alpha only)


                
 VMS usage: address
type:  longword (unsigned)
access:  read only
 mechanism:  by value

FA longword holding the base virtual address of the symbol vector in a Gshareable image or system image. All universal symbols in these images Hare found by looking it up in the symbol vector (the symbol value is an Boffset into the symbol vector). This argument is ignored with the DOPT$M_IMAGE_READ or OPT$M_EXEC_READ bits in options and is /meaningful for loaded or activated images only.

symvec_siz (Alpha only)


                
 VMS usage:  longword_unsigned
type:  longword (unsigned)
access:  read only
 mechanism:  by value

HA longword holding the size of the symbol vector whose address is given Ain symvec_va. This argument is used in conjunction with Dsymvec_va only; if you supply symvec_va, you must #supply symvec_siz as well.

options


                
 VMS usage:  mask_longword
type:  longword (unsigned)
access:  read only
 mechanism:  by value

EA longword holding a bit mask of read options. The following options are defined:  "                           
Name Value Meaning
 OPT$M_FORCE_READ 0001 0 Read symbols from image file (Alpha only).
 OPT$M_IMAGE_READ 0002 L For loaded or activated images, read symbols and relocation info from  memory (Alpha only).
 OPT$M_EXEC_READ 0010 N Read symbol tables of all loaded system images, either from the default - directory or the directory given in the7 filnam argument (VAX V7 and Alpha only).
 OPT$M_NOLOG_READ 0020 @ Suppress display of SDA's READSYM message (Alpha V7 only).
 OPR$M_NOSIGNAL_READ 0080 > Return condition only, do not signal it (Alpha V7 only).


HNote that the bit names shown in the table are not defined anywhere; if Ayou want to use it in your code, you must define the appropriate literals yourself.

suppr (Alpha V6 only)


                
 VMS usage:  longword_unsigned
type:  longword (unsigned)
access:  read only
 mechanism:  by value

GA longword holding the suppress indicator. If you set this longword to 11, SDA's %SDA-I-READSYM message is not displayed.

HOn Alpha V7, this argument is not used; set the OPT$M_NOLOG_READ bit in options instead.

ldrimg (Alpha V7 only)


                
 VMS usage: address
type:  longword (unsigned)
access:  read only
 mechanism:  by reference

HA longword holding the address of a LDRIMG (loaded system image) block. CThe contents of this block is used to determine the image's symbol Gvector address and size, as well additional relocation information. If Fyou specify this argument, the reloc, symvec_va and Esymvec_siz arguments are meaningless. In addition, you must Bnot set any bits in options, except OPT$M_NOLOG_READ and OPT$M_NOSIGNAL_READ.



DESCRIPTION

FThis callback is an interface to SDA's READ command. GThis command symbolically identifies locations in memory for which the 5default symbol tables (SYS$SYSTEM:SYS.STB on VAX and 2SYS$LOADABLE_IMAGES:SYS$BASE_IMAGE.EXE as well as GSYS$LOADABLE_IMAGES:REQSYSDEF.STB on Alpha) provides no definition. In Fother words, the global symbols are located in modules that have been 2compiled and linked separately from the executive.




9Previous- | Next6 | Contents