2928 info->size = outdata[1];
2929 }
2930 return true;
2931 }
2932 return false;
2933 }
2934
2935 // Scan the pages from start to end until a page different than
2936 // the one described in the info parameter is encountered.
2937 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2938 const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2939 const size_t types = sizeof(info_types) / sizeof(info_types[0]);
2940 uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT];
2941 uint_t validity[MAX_MEMINFO_CNT];
2942
2943 size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size);
2944 uint64_t p = (uint64_t)start;
2945 while (p < (uint64_t)end) {
2946 addrs[0] = p;
2947 size_t addrs_count = 1;
2948 while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] < (uint64_t)end) {
2949 addrs[addrs_count] = addrs[addrs_count - 1] + page_size;
2950 addrs_count++;
2951 }
2952
2953 if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
2954 return NULL;
2955 }
2956
2957 size_t i = 0;
2958 for (; i < addrs_count; i++) {
2959 if ((validity[i] & 1) != 0) {
2960 if ((validity[i] & 4) != 0) {
2961 if (outdata[types * i + 1] != page_expected->size) {
2962 break;
2963 }
2964 } else
2965 if (page_expected->size != 0) {
2966 break;
2967 }
2968
|
2928 info->size = outdata[1];
2929 }
2930 return true;
2931 }
2932 return false;
2933 }
2934
2935 // Scan the pages from start to end until a page different than
2936 // the one described in the info parameter is encountered.
2937 char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info* page_found) {
2938 const uint_t info_types[] = { MEMINFO_VLGRP, MEMINFO_VPAGESIZE };
2939 const size_t types = sizeof(info_types) / sizeof(info_types[0]);
2940 uint64_t addrs[MAX_MEMINFO_CNT], outdata[types * MAX_MEMINFO_CNT];
2941 uint_t validity[MAX_MEMINFO_CNT];
2942
2943 size_t page_size = MAX2((size_t)os::vm_page_size(), page_expected->size);
2944 uint64_t p = (uint64_t)start;
2945 while (p < (uint64_t)end) {
2946 addrs[0] = p;
2947 size_t addrs_count = 1;
2948 while (addrs_count < MAX_MEMINFO_CNT && addrs[addrs_count - 1] + page_size < (uint64_t)end) {
2949 addrs[addrs_count] = addrs[addrs_count - 1] + page_size;
2950 addrs_count++;
2951 }
2952
2953 if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
2954 return NULL;
2955 }
2956
2957 size_t i = 0;
2958 for (; i < addrs_count; i++) {
2959 if ((validity[i] & 1) != 0) {
2960 if ((validity[i] & 4) != 0) {
2961 if (outdata[types * i + 1] != page_expected->size) {
2962 break;
2963 }
2964 } else
2965 if (page_expected->size != 0) {
2966 break;
2967 }
2968
|