changeset 5038:0025a2a965c8 jdk7u60-b02

Merge
author amurillo
date Tue, 17 Dec 2013 10:04:41 -0800
parents 695c4f65f4c0 (current diff) 27db84519a53 (diff)
children b3ece6e60452 cc53706b1b2b
files
diffstat 5 files changed, 37 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Wed Dec 11 11:18:28 2013 -0800
+++ b/.hgtags	Tue Dec 17 10:04:41 2013 -0800
@@ -596,3 +596,4 @@
 b7d44793cd267b22352c688b0185466741bb7a89 hs24.60-b02
 90cfd4ad3c9263886d876792d72cb24ac0e03a85 hs24.60-b03
 8fd0e931efa57d1579fb1bc8a68ba3924244b99e jdk7u60-b01
+99e96aaac8afc14ce6f9f3d92ef7004cf505b35d hs24.60-b04
--- a/agent/src/os/linux/ps_core.c	Wed Dec 11 11:18:28 2013 -0800
+++ b/agent/src/os/linux/ps_core.c	Tue Dec 17 10:04:41 2013 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -704,6 +704,8 @@
    ELF_PHDR* phbuf;
    ELF_PHDR* lib_php = NULL;
 
+   int page_size=sysconf(_SC_PAGE_SIZE);
+
    if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL)
       return false;
 
@@ -712,8 +714,32 @@
    // have been already added from core file segments.
    for (lib_php = phbuf, i = 0; i < lib_ehdr->e_phnum; i++) {
       if ((lib_php->p_type == PT_LOAD) && !(lib_php->p_flags & PF_W) && (lib_php->p_filesz != 0)) {
-         if (add_map_info(ph, lib_fd, lib_php->p_offset, lib_php->p_vaddr + lib_base, lib_php->p_filesz) == NULL)
-            goto err;
+         uintptr_t target_vaddr = lib_php->p_vaddr + lib_base;
+         map_info *existing_map = core_lookup(ph, target_vaddr);
+
+         if (existing_map == NULL) {
+            if (add_map_info(ph, lib_fd, lib_php->p_offset,
+                              target_vaddr, lib_php->p_filesz) == NULL) {
+                goto err;
+            }
+         } else {
+            if ((existing_map->memsz != page_size) &&
+                (existing_map->fd != lib_fd) &&
+                (existing_map->memsz != lib_php->p_filesz)) {
+
+                print_debug("address conflict @ 0x%lx (size = %ld, flags = %d\n)",
+                            target_vaddr, lib_php->p_filesz, lib_php->p_flags);
+                goto err;
+            }
+
+            /* replace PT_LOAD segment with library segment */
+            print_debug("overwrote with new address mapping (memsz %ld -> %ld)\n",
+                            existing_map->memsz, lib_php->p_filesz);
+
+            existing_map->fd = lib_fd;
+            existing_map->offset = lib_php->p_offset;
+            existing_map->memsz = lib_php->p_filesz;
+         }
       }
       lib_php++;
    }
--- a/make/hotspot_version	Wed Dec 11 11:18:28 2013 -0800
+++ b/make/hotspot_version	Tue Dec 17 10:04:41 2013 -0800
@@ -35,7 +35,7 @@
 
 HS_MAJOR_VER=24
 HS_MINOR_VER=60
-HS_BUILD_NUMBER=03
+HS_BUILD_NUMBER=04
 
 JDK_MAJOR_VER=1
 JDK_MINOR_VER=7
--- a/src/cpu/x86/vm/frame_x86.cpp	Wed Dec 11 11:18:28 2013 -0800
+++ b/src/cpu/x86/vm/frame_x86.cpp	Tue Dec 17 10:04:41 2013 -0800
@@ -94,12 +94,6 @@
     // other generic buffer blobs are more problematic so we just assume they are
     // ok. adapter blobs never have a frame complete and are never ok.
 
-    // check for a valid frame_size, otherwise we are unlikely to get a valid sender_pc
-
-    if (!Interpreter::contains(_pc) && _cb->frame_size() <= 0) {
-      return false;
-    }
-
     if (!_cb->is_frame_complete_at(_pc)) {
       if (_cb->is_nmethod() || _cb->is_adapter_blob() || _cb->is_runtime_stub()) {
         return false;
@@ -139,6 +133,11 @@
       // must be some sort of compiled/runtime frame
       // fp does not have to be safe (although it could be check for c1?)
 
+      // check for a valid frame_size, otherwise we are unlikely to get a valid sender_pc
+      if (_cb->frame_size() <= 0) {
+        return false;
+      }
+
       sender_sp = _unextended_sp + _cb->frame_size();
       // On Intel the return_address is always the word on the stack
       sender_pc = (address) *(sender_sp-1);
--- a/src/cpu/x86/vm/globals_x86.hpp	Wed Dec 11 11:18:28 2013 -0800
+++ b/src/cpu/x86/vm/globals_x86.hpp	Tue Dec 17 10:04:41 2013 -0800
@@ -62,7 +62,7 @@
 // due to lack of optimization caused by C++ compiler bugs
 define_pd_global(intx, StackShadowPages, NOT_WIN64(20) WIN64_ONLY(6) DEBUG_ONLY(+2));
 #else
-define_pd_global(intx, StackShadowPages, 4 DEBUG_ONLY(+5));
+define_pd_global(intx, StackShadowPages, 6 DEBUG_ONLY(+5));
 #endif // AMD64
 
 define_pd_global(intx, PreInflateSpin,           10);