Upgrading Privileged-Code Applications on OpenVMS Alpha and
OpenVMS I64 Systems
7.5 OpenVMS Structure Fields
If you code references the PMM structure in the starlet libraries, please
refer to Section 5.3 for a description of the new PMM64 structure available
on Alpha and I64.
If your code references any of the following structure fields from the "lib" libraries,
you must modify your code on I64 to reference the new field names. All new
fields are added to OpenVMS on Alpha and I64 so that common code can be written.
Alpha Field Name (32 Bits) |
Alpha (32 Bits) and I64 (64 Bits) |
gsd$l_basepfn |
gsd$i_basepfn |
gsd$l_pages |
gsd$i_pages |
gsd$l_refcnt |
gsd$i_refcnt |
pmap$l_start_pfn |
pmap$i_start_pfn |
pmap$l_pfn_count |
pmap$i_pfn_count |
pfn$l_flink |
pfn$i_flink |
pfn$l_blink |
pfn$i_blink |
pfn$l_pt_pfn |
pfn$i_pt_pfn |
pfn$l_color_flink |
pfn$i_color_flink |
pfn$l_color_blink |
pfn$i_color_blink |
prvpfn$l_head |
prvpfn$i_head |
prvpfn$l_tail |
prvpfn$i_tail |
rmd$l_first_pfn |
rmd$i_first_pfn |
rmd$l_zero_pfn |
rmd$i_zero_pfn |
prcstr$l_p1pointer_pfn |
prcstr$i_p1pointer_pfn |
prcstr$l_pio_pfn |
prcstr$i_pio_pfn |
mmap$l_first_pfn |
mmap$i_first_pfn |
plnk$l_next_pfn |
plnk$i_next_pfn |
plnk$l_pfn_count |
plnk$i_pfn_count |
shm_cpp$l_min_pfn |
shm_cpp$i_min_pfn |
shm_cpp$l_max_pfn |
shm_cpp$l_max_pfn |
shm_cpp$l_recover_pfn |
shm_cpp$i_recover_pfn |
smci$l_pfn |
smci$i_pfn |
You must also examine all variables and code that reference the PFNs so that
64-bit PFNs are maintained.
Existing Code
unsigned int first_pfn; first_pfn = gsd->gsd$l_basepfn;
|
New Code
#include <lib_types.h> /* Include PFN_T type */ PFN_T first_pfn; /* 32-bits on Alpha, 64-bits on I64 */ first_pfn = gsd->gsd$i_basepfn;
|
7.6 System Data Cells
Some data cells in SYS$BASE_IMAGE.EXE describe PFNs. Data cells that describe
PFNs are removed on I64. New data cells have been added to Alpha and I64. These
data cells fall into a few categories that are described in the following sections.
7.6.1 Minimum and Maximum PFN Data Cells
If your code references any of the data cells in the following table, you
must modify your code on I64 to reference the new cells:
Alpha Cell (32 Bits) |
New Alpha and I64 (64 Bit) Cell |
MMG$GL_MINPFN |
MMG$GQ_MINPFN |
MMG$GL_MAXPFN |
MMG$GQ_MAXPFN |
MMG$GL_MAXMEM |
MMG$GQ_MAXMEM |
MMG$GL_MIN_NODE_PFN |
MMG$GQ_MIN_NODE_PFN |
MMG$GL_MAX_NODE_PFN |
MMG$GQ_MAX_NODE_PFN |
MMG$GL_MIN_SHARED_PFN |
MMG$GQ_MIN_SHARED_PFN |
MMG$GL_MAX_SHARED_PFN |
MMG$GQ_MAX_SHARED_PFN |
You must examine all variables and code that reference the PFNs so that 64-bit
PFNs are maintained.
Example
extern const unsigned int mmg$gl_minpfn; extern const unsigned int mmg$gl_maxpfn; unsigned int test_pfn; if ((mmg$gl_minpfn <= test_pfn) && (test_pfn <= mmg$gl_maxpfn))
|
New code
extern const unsigned __int64 mmg$gq_minpfn; extern const unsigned __int64 mmg$gq_maxpfn; unsigned __int64 test_pfn; if ((mmg$gq_minpfn <= test_pfn) && (test_pfn <= mmg$gq_maxpfn))
|
7.6.2 PFN List Arrays, Counts, and Limits
If your code references any of the data cells in the following tables, you
must modify your I64 code to reference the new cells:
Alpha Cell (32 Bits) |
New Alpha (32 Bits) and I64 (64 Bits) Cell |
PFN$AL_HEAD |
PFN$AI_HEAD |
PFN$AL_TAIL |
PFN$AI_TAIL |
PFN$AL_COLOR_HEAD |
PFN$AI_COLOR_HEAD |
PFN$AL_COLOR_TAIL |
PFN$AI_COLOR_TAIL |
PFN$AL_COUNT |
PFN$AI_COUNT |
PFN$AL_LOLIMIT |
PFN$AI_LOLIMIT |
PFN$AL_HILIMIT |
PFN$AI_HILIMIT |
PFN$GL_MFYLSTHD |
PFN$AI_HEAD[PFN$C_MFYPAGLST] |
SCH$GL_FREECNT |
SCH$GI_FREECNT |
SCH$GL_FREELIM |
SCH$GI_FREELIM |
SCH$GL_FREEREQ |
SCH$GI_FREEREQ |
SCH$GL_MFYCNT |
SCH$GI_MFYCNT |
SCH$GL_MFYLIM |
SCH$GI_MFYLIM |
SCH$GL_MFYLOLIM |
SCH$GI_MFYLOLIM |
SCH$GL_MFYLIMSV |
SCH$GQ_MFYLIMSV |
SCH$GL_MFYLOSV |
SCH$GQ_MFYLOSV |
The new PFN$AI cells are arrays of 32-bit PFNs or page counts on Alpha and
64-bit PFNs or page counts on I64. To reference the new PFN arrays, Hewlett-Packard
recommends programming in C and using the PFN_T typedef.
Existing Code
extern unsigned int pfn$al_head[]; unsigned int free_pfn; free_pfn = pfn$al_head[PFN$C_FREPAGLST]; /* Read first free pfn */
|
New Code
#include <lib_types.h> extern PFN_T pfn$ai_head[]; PFN_T free_pfn; free_pfn = pfn$ai_head[PFN$C_FREPAGLST]; /* Read first free pfn */
|
7.6.3 Physical Memory Page Counts
If your code references any of the data cells in the following table, you
must modify your code on I64 to reference the new cells:
Alpha cell (32 Bits) |
New Alpha and I64 cell (64 Bits) |
PFN$GL_PHYPGCNT |
MMG$GQ_FLUID_PGCNT |
MMG$GL_PHYPGCNT |
MMG$GQ_PHYPGCNT |
MMG$GL_MEMSIZE |
MMG$GQ_MEMSIZE |
Programmers often confuse the functions of these data cells.
The MMG$GQ_FLUID_PGCNT data cell specifies the number of "fluid" pages in
the system. Typically, this data cell is decremented when pages are permanently
allocated for use by the system or drivers.
The MMG$GQ_PHYPGCNT data cell specifies the number of physical pages in the
configuration. This number is derived from the PHYSICAL_MEMORY system parameter
if the parameter is not -1. Typically, this data cell is only read by programs.
The MMG$GQ_MEMSIZE specifies the number of physical pages in the system regardless
of system parameter settings.
|