am 467f7e3a: Merge "Report problems as errors in dx (with exit codes)"
* commit '467f7e3aaf8aafe324744bfd825fe9941862b7b7':
Report problems as errors in dx (with exit codes)
diff --git a/dexlist/Android.mk b/dexlist/Android.mk
index 78d3c57..62b0087 100644
--- a/dexlist/Android.mk
+++ b/dexlist/Android.mk
@@ -44,6 +44,6 @@
LOCAL_SRC_FILES := $(dexdump_src_files)
LOCAL_C_INCLUDES := $(dexdump_c_includes)
LOCAL_SHARED_LIBRARIES := $(dexdump_shared_libraries)
-LOCAL_STATIC_LIBRARIES := $(dexdump_static_libraries) libcutils
+LOCAL_STATIC_LIBRARIES := $(dexdump_static_libraries) libcutils liblog
LOCAL_LDLIBS += -lpthread -lz
include $(BUILD_HOST_EXECUTABLE)
diff --git a/vm/Android.mk b/vm/Android.mk
index eb36c0f..e5d5448 100644
--- a/vm/Android.mk
+++ b/vm/Android.mk
@@ -65,6 +65,8 @@
include $(LOCAL_PATH)/ReconfigureDvm.mk
LOCAL_CFLAGS += -UNDEBUG -DDEBUG=1 -DLOG_NDEBUG=1 -DWITH_DALVIK_ASSERT \
-DWITH_JIT_TUNING $(target_smp_flag)
+# TODO: split out the asflags.
+LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
LOCAL_MODULE := libdvm_assert
include $(BUILD_SHARED_LIBRARY)
diff --git a/vm/Init.cpp b/vm/Init.cpp
index 90d1d3a..42901cf 100644
--- a/vm/Init.cpp
+++ b/vm/Init.cpp
@@ -28,6 +28,9 @@
#include <linux/fs.h>
#include <cutils/fs.h>
#include <unistd.h>
+#ifdef HAVE_ANDROID_OS
+#include <sys/prctl.h>
+#endif
#include "Dalvik.h"
#include "test/Test.h"
@@ -1633,6 +1636,33 @@
return true;
}
+/*
+ * Copied and modified slightly from system/core/toolbox/mount.c
+ */
+static std::string getMountsDevDir(const char *arg)
+{
+ char mount_dev[256];
+ char mount_dir[256];
+ int match;
+
+ FILE *fp = fopen("/proc/self/mounts", "r");
+ if (fp == NULL) {
+ ALOGE("Could not open /proc/self/mounts: %s", strerror(errno));
+ return "";
+ }
+
+ while ((match = fscanf(fp, "%255s %255s %*s %*s %*d %*d\n", mount_dev, mount_dir)) != EOF) {
+ mount_dev[255] = 0;
+ mount_dir[255] = 0;
+ if (match == 2 && (strcmp(arg, mount_dir) == 0)) {
+ fclose(fp);
+ return mount_dev;
+ }
+ }
+
+ fclose(fp);
+ return "";
+}
/*
* Do zygote-mode-only initialization.
@@ -1668,6 +1698,40 @@
}
}
+ // Mark /system as NOSUID | NODEV
+ const char* android_root = getenv("ANDROID_ROOT");
+
+ if (android_root == NULL) {
+ SLOGE("environment variable ANDROID_ROOT does not exist?!?!");
+ return -1;
+ }
+
+ std::string mountDev(getMountsDevDir(android_root));
+ if (mountDev.empty()) {
+ SLOGE("Unable to find mount point for %s", android_root);
+ return -1;
+ }
+
+ if (mount(mountDev.c_str(), android_root, "none",
+ MS_REMOUNT | MS_NOSUID | MS_NODEV | MS_RDONLY | MS_BIND, NULL) == -1) {
+ SLOGE("Remount of %s failed: %s", android_root, strerror(errno));
+ return -1;
+ }
+
+#ifdef HAVE_ANDROID_OS
+ if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
+ if (errno == EINVAL) {
+ SLOGW("PR_SET_NO_NEW_PRIVS failed. "
+ "Is your kernel compiled correctly?: %s", strerror(errno));
+ // Don't return -1 here, since it's expected that not all
+ // kernels will support this option.
+ } else {
+ SLOGW("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
+ return -1;
+ }
+ }
+#endif
+
return true;
}
diff --git a/vm/Thread.cpp b/vm/Thread.cpp
index 7c8395e..9671b84 100644
--- a/vm/Thread.cpp
+++ b/vm/Thread.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#define ATRACE_TAG ATRACE_TAG_DALVIK
+
/*
* Thread support.
*/
@@ -39,6 +41,7 @@
#include "interp/Jit.h" // need for self verification
#endif
+ #include <cutils/trace.h>
/* desktop Linux needs a little help with gettid() */
#if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS)
@@ -2854,6 +2857,7 @@
ThreadStatus oldStatus = self->status; /* should be RUNNING */
self->status = THREAD_SUSPENDED;
+ ATRACE_BEGIN("DVM Suspend");
while (self->suspendCount != 0) {
/*
* Wait for wakeup signal, releasing lock. The act of releasing
@@ -2863,6 +2867,7 @@
dvmWaitCond(&gDvm.threadSuspendCountCond,
&gDvm.threadSuspendCountLock);
}
+ ATRACE_END();
assert(self->suspendCount == 0 && self->dbgSuspendCount == 0);
self->status = oldStatus;
LOG_THREAD("threadid=%d: self-reviving, status=%d",
diff --git a/vm/alloc/Heap.cpp b/vm/alloc/Heap.cpp
index 9bbe8a5..4a8d165 100644
--- a/vm/alloc/Heap.cpp
+++ b/vm/alloc/Heap.cpp
@@ -13,6 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+#define ATRACE_TAG ATRACE_TAG_DALVIK
+
/*
* Garbage-collecting memory allocator.
*/
@@ -31,6 +34,8 @@
#include <limits.h>
#include <errno.h>
+#include <cutils/trace.h>
+
static const GcSpec kGcForMallocSpec = {
true, /* isPartial */
false, /* isConcurrent */
@@ -456,9 +461,23 @@
return;
}
+ // Trace the beginning of the top-level GC.
+ if (spec == GC_FOR_MALLOC) {
+ ATRACE_BEGIN("GC (alloc)");
+ } else if (spec == GC_CONCURRENT) {
+ ATRACE_BEGIN("GC (concurrent)");
+ } else if (spec == GC_EXPLICIT) {
+ ATRACE_BEGIN("GC (explicit)");
+ } else if (spec == GC_BEFORE_OOM) {
+ ATRACE_BEGIN("GC (before OOM)");
+ } else {
+ ATRACE_BEGIN("GC (unknown)");
+ }
+
gcHeap->gcRunning = true;
rootStart = dvmGetRelativeTimeMsec();
+ ATRACE_BEGIN("GC: Threads Suspended"); // Suspend A
dvmSuspendAllThreads(SUSPEND_FOR_GC);
/*
@@ -478,6 +497,8 @@
/* Set up the marking context.
*/
if (!dvmHeapBeginMarkStep(spec->isPartial)) {
+ ATRACE_END(); // Suspend A
+ ATRACE_END(); // Top-level GC
LOGE_HEAP("dvmHeapBeginMarkStep failed; aborting");
dvmAbort();
}
@@ -504,6 +525,7 @@
dvmClearCardTable();
dvmUnlockHeap();
dvmResumeAllThreads(SUSPEND_FOR_GC);
+ ATRACE_END(); // Suspend A
rootEnd = dvmGetRelativeTimeMsec();
}
@@ -521,6 +543,7 @@
*/
dirtyStart = dvmGetRelativeTimeMsec();
dvmLockHeap();
+ ATRACE_BEGIN("GC: Threads Suspended"); // Suspend B
dvmSuspendAllThreads(SUSPEND_FOR_GC);
/*
* As no barrier intercepts root updates, we conservatively
@@ -582,6 +605,7 @@
if (spec->isConcurrent) {
dvmUnlockHeap();
dvmResumeAllThreads(SUSPEND_FOR_GC);
+ ATRACE_END(); // Suspend B
dirtyEnd = dvmGetRelativeTimeMsec();
}
dvmHeapSweepUnmarkedObjects(spec->isPartial, spec->isConcurrent,
@@ -622,6 +646,7 @@
if (!spec->isConcurrent) {
dvmResumeAllThreads(SUSPEND_FOR_GC);
+ ATRACE_END(); // Suspend A
dirtyEnd = dvmGetRelativeTimeMsec();
/*
* Restore the original thread scheduling priority if it was
@@ -675,6 +700,8 @@
LOGD_HEAP("Dumping native heap to DDM");
dvmDdmSendHeapSegments(false, true);
}
+
+ ATRACE_END(); // Top-level GC
}
/*
@@ -699,6 +726,7 @@
*/
bool dvmWaitForConcurrentGcToComplete()
{
+ ATRACE_BEGIN("GC: Wait For Concurrent");
bool waited = gDvm.gcHeap->gcRunning;
Thread *self = dvmThreadSelf();
assert(self != NULL);
@@ -712,5 +740,6 @@
if (end - start > 0) {
ALOGD("WAIT_FOR_CONCURRENT_GC blocked %ums", end - start);
}
+ ATRACE_END();
return waited;
}