|
HP OpenVMS systems documentation |
Previous | Contents | Index |
If your code calls either of the following routines, you must modify your code on I64:
Alpha Routine | New Alpha and I64 Routine |
---|---|
status =
mmg$alloc_sva_map (
proto_pte, page_count, refcnt, &ret_svapte, &ret_sva, &ret_pfn); |
status =
mmg$allocate_sva_and_pfns (
page_count, 0, // flags MMG$K_NO_RAD, 0, // system_region proto_pte, refcnt, &ret_sva); ret_svapte = va_pte_to_svapte (pte_va (ret_sva)); |
status =
mmg_std$alloc_system_va_map (
proto_pte, page_count, refcnt, system_region, &ret_sva, &ret_pfn, rad, rad_flags); |
status =
mmg$allocate_sva_and_pfns (
page_count, rad_flags, rad, system_region, proto_pte, refcnt, &ret_sva); |
Prototype
int mmg$allocate_sva_and_pfns ( unsigned __int64 page_count, unsigned int flags, int color, int system_region, int proto_pte, int refcnt, VOID_PPQ ret_sva); |
Page_count: Number of pages to allocate
The following table lists the MMG flags:
MMG Flag | Meaning |
---|---|
MMG$M_COLOR_MUST | Return PFN must be of color (RAD) specified |
MMG$M_COLOR_RANDOM | Return PFN should be a random color (RAD) |
Color: RAD on systems with NUMA support enabled
System_region: 0 or 1 = 32-bit S0S1address space, 2 = 64-bit S2 address space
Proto_pte: prototype PTE with low PTE bits, such as page protection, set for mapping
Refcnt: Reference count for PFNs allocated
Ret_sva: System virtual address of memory mapped
If your code calls any of the following routines, you must modify your code to call the new routine.
Alpha Routine | New Alpha and I64 Routine |
---|---|
status =
mmg$alloc_pfn_map_sva (
proto_pte, page_count, refcnt, svapte, &ret_sva, &ret_pfn); |
sva = va_pte_to_va (svapte_to_va_pte (svapte));
status = mmg$allocate_pfn_map ( page_count, 0, // flags MMG$K_NO_RAD, // color 0, // low_pfn 0, // high_pfn sva, proto_pte, refcnt); ret_pfn = svapte->pte$v_pfn; |
status =
mmg$alloc_pfn_map_system_va (
proto_pte, page_count, refcnt, sva, &ret_pfn, color, flags); |
status =
mmg$allocate_pfn_map (
page_count, flags, color, 0, // low_pfn 0, // high_pfn sva, proto_pte, refcnt); ret_pfn = pte_va (sva)->svapte>pte$v_pfn; |
status =
mmg$alloc_ctg_pfn_map_sva (
proto_pte, page_count, refcnt, sva, high_pfn, &ret_pfn): |
status =
mmg$allocate_pfn_map (
page_count, MMG$M_CONTIG, MMG$K_NO_RAD, //color, 0, // low_pfn high_pfn, sva, proto_pte, refcnt); ret_pfn = pte_va (sva)->svapte>pte$v_pfn; |
Prototype
int mmg$allocate_pfn_map ( unsigned __int64 page_count, unsigned int flags, int color, PFN_T low_pfn, PFN_T high_pfn, VOID_PQ sva, int proto_pte, int refcnt); |
Page_count: Number of pages to allocate
The following table lists the MMG flags.
MMG Flag | Meaning |
---|---|
MMG$M_COLOR_MUST | Return PFN must be of color (RAD) specified |
MMG$M_COLOR_RANDOM | Return PFN should be a random color (RAD) |
MMG$M_CONTIG | Allocate contiguous pages |
Color: RAD on systems with NUMA support enabled
Low_pfn: lowest PFN to allocate
High_pfn: highest PFN to allocate (0, if no range)
Sva: System virtual address to map pages (sva was already allocated by the caller)
Proto_pte: prototype PTE with low PTE bits, such as page protection, set for mapping
Refcnt: Reference count for PFNs allocated
7.8 PTE Format Changes
The PFN field in the PTE is 32-bits wide on Alpha and 40-bits wide on I64. The PFN field happens to exactly overlay other fields in the PTE such as GPTX, BAKX and the combination of PGFLPAG and PGFLX.
The following table shows the field definitions for the upper PTE fields:
Field Name | Alpha Bit Position | Alpha Field Length | I64 Bit Position |
---|---|---|---|
PFN 32 | 32 | 24 1 | 40 1 |
BAKX 32 | 32 | 24 1 | 40 1 |
GPTX 32 | 32 | 32 | 32 |
PGFLPAG 32 | 24 | 32 | 24 |
PGFLX 56 | 8 | 56 | 8 |
Good Example
EVAX_LDQ R0,(R3) ; Read the PTE EVAX_BIC R0,#PTE$M_BAKX,R1 ; Isolate the lower PTE bits |
Sometimes existing code uses the PFN field from the PTE when it should use the GPTX field. This code needs to be changed.
Existing Code
pfn = pte_contents.pte$v_pfn; if (pte_contents.pte$v_typ0 && !pte_contents.pte$v_typ1) { pte_contents = mmg$gq_gpt_base[pfn]; // Read global PTE if (pte_contents.pte$v_valid) pfn = pte_contents.pte$v_pfn; // Read pfn from valid GPTE . . . } |
New Code
pfn = pte_contents.pte$v_pfn; if (pte_contents.pte$v_typ0 && !pte_contents.pte$v_typ1) { gptx = pte_contents.pte$v_gptx; pte_contents = mmg$gq_gpt_base[gptx]; // Read global PTE if (pte_contents.pte$v_valid) pfn = pte_contents.pte$v_pfn; // Read pfn from global PTE . . . } |
Previous | Next | Contents | Index |