aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES.TXT11
-rw-r--r--android/avd/info.c35
-rw-r--r--exec-all.h8
-rw-r--r--target-arm/it_helper.h83
-rw-r--r--target-arm/translate.c64
5 files changed, 69 insertions, 132 deletions
diff --git a/CHANGES.TXT b/CHANGES.TXT
index c759716..7c9785b 100644
--- a/CHANGES.TXT
+++ b/CHANGES.TXT
@@ -17,7 +17,13 @@ Versions:
1.11 => SDK 1.6_r1
1.12 => SDK 2.0
1.13 => SDK 2.0.1 (but wrongly tagged 1.12)
- 5.0 => current
+
+ Starting from here, the emulator version number will match
+ the corresponding SDK Tools release level, i.e.:
+
+ 5.0 => SDK Tools release 5
+ 6.0 => SDK Tools release 6
+ etc...
==============================================================================
Changes between 6.0 and 5.0
@@ -28,6 +34,9 @@ IMPORTANT CHANGES:
order to detect buffer under/overflows. This requires a new version of the
C library that is only available in Froyo and above.
+- Fix '-http-proxy' on Win32. This was actually a regression introduced
+ with the Donut SDK.
+
OTHER:
- Add a '--static' option to both android-configure.sh and android-rebuild.sh
diff --git a/android/avd/info.c b/android/avd/info.c
index 6766c96..d726112 100644
--- a/android/avd/info.c
+++ b/android/avd/info.c
@@ -139,6 +139,7 @@ struct AvdInfo {
char* contentPath;
IniFile* rootIni; /* root <foo>.ini file */
IniFile* configIni; /* virtual device's config.ini */
+ IniFile* hardwareIni; /* skin-specific hardware.ini */
/* for both */
char* skinName; /* skin name */
@@ -172,6 +173,11 @@ avdInfo_free( AvdInfo* i )
i->configIni = NULL;
}
+ if (i->hardwareIni) {
+ iniFile_free(i->hardwareIni);
+ i->hardwareIni = NULL;
+ }
+
if (i->rootIni) {
iniFile_free(i->rootIni);
i->rootIni = NULL;
@@ -1328,6 +1334,30 @@ _getBuildSkin( AvdInfo* i, AvdInfoParams* params )
return 0;
}
+/* Read a hardware.ini if it is located in the skin directory */
+static int
+_getBuildHardwareIni( AvdInfo* i )
+{
+ char temp[PATH_MAX], *p=temp, *end=p+sizeof(temp);
+
+ if (i->skinDirPath == NULL || i->skinName == NULL)
+ return 0;
+
+ p = bufprint(temp, end, "%s/%s/hardware.ini", i->skinDirPath, i->skinName);
+ if (p >= end || !path_exists(temp)) {
+ DD("no skin-specific hardware.ini in %s", i->skinDirPath);
+ return 0;
+ }
+
+ D("found skin-specific hardware.ini: %s", temp);
+ i->hardwareIni = iniFile_newFromFile(temp);
+ if (i->hardwareIni == NULL)
+ return -1;
+
+ return 0;
+}
+
+
AvdInfo*
avdInfo_newForAndroidBuild( const char* androidBuildRoot,
const char* androidOut,
@@ -1351,6 +1381,7 @@ avdInfo_newForAndroidBuild( const char* androidBuildRoot,
/* we don't need to fail if there is no valid skin */
_getBuildSkin(i, params);
+ _getBuildHardwareIni(i);
return i;
@@ -1424,6 +1455,10 @@ avdInfo_getHwConfig( AvdInfo* i, AndroidHwConfig* hw )
if (ini != i->configIni)
iniFile_free(ini);
+ if (ret == 0 && i->hardwareIni != NULL) {
+ ret = androidHwConfig_read(hw, i->hardwareIni);
+ }
+
/* special product-specific hardware configuration */
if (i->androidOut != NULL)
{
diff --git a/exec-all.h b/exec-all.h
index f5d416c..c686554 100644
--- a/exec-all.h
+++ b/exec-all.h
@@ -172,14 +172,6 @@ struct TranslationBlock {
#endif // CONFIG_MEMCHECK
uint32_t icount;
-
- /* ITSTATE at the beginning of the translated block.
- * This field is set to CPU's condexec_bits value when this TB is first
- * translating. This field is then used to properly calculate ITSTATE when
- * this TB gets "retranslated" because of an exception, or other
- * conditions that cause gen_intermediate_code_pc to be called for this TB.
- */
- uint8_t itstate;
};
static inline unsigned int tb_jmp_cache_hash_page(target_ulong pc)
diff --git a/target-arm/it_helper.h b/target-arm/it_helper.h
deleted file mode 100644
index 7982174..0000000
--- a/target-arm/it_helper.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Copyright (C) 2007-2010 The Android Open Source Project
-**
-** This software is licensed under the terms of the GNU General Public
-** License version 2, as published by the Free Software Foundation, and
-** may be copied, distributed, and modified under those terms.
-**
-** This program is distributed in the hope that it will be useful,
-** but WITHOUT ANY WARRANTY; without even the implied warranty of
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-** GNU General Public License for more details.
-*/
-
-/*
- * Contains implementation of helper routines for IT block support.
- */
-
-#ifndef QEMU_TARGET_ARM_IT_HELPER_H
-#define QEMU_TARGET_ARM_IT_HELPER_H
-
-/* Gets condition bits from ITSTATE.
- * Return:
- * ITSTATE condition bits in the low 4 bits of the returned value.
- */
-static inline uint8_t
-itstate_cond(uint8_t itstate)
-{
- return (itstate >> 4) & 0xf;
-}
-
-/* Checks if ITSTATE defines the last instruction in an IT block.
- * Param:
- * itstate - ITSTATE for an instruction in an IT block.
- * Return:
- * boolean: 1 if an instruction is the last instruction in its IT block,
- * or zero if there are more instruction in the IT block.
- */
-static inline int
-itstate_is_last_it_insn(uint8_t itstate)
-{
- return (itstate & 0x7) == 0;
-}
-
-/* Checks if ITSTATE suggests that an IT block instruction is being translated.
- * Return:
- * boolean: 1 if an IT block instruction is being translated, or zero if
- * a "normal" instruction is being translated.
- */
-static inline int
-itstate_is_in_it_block(uint8_t itstate)
-{
- return (itstate & 0xff) != 0;
-}
-
-/* Advances ITSTATE to the next instruction in an IT block.
- * Param:
- * itstate - ITSTATE of the currently executing instruction.
- * Retunn:
- * ITSTATE for the next instruction in an IT block, or zero is currently
- * executing instruction was the last IT block instruction.
- */
-static inline uint8_t
-itstate_advance(uint8_t itstate)
-{
- if (itstate_is_last_it_insn(itstate)) {
- return 0;
- } else {
- return (itstate & 0xe0) | ((itstate & 0xf) << 1);
- }
-}
-
-/* Checks if given THUMB instruction is an IT instruction.
- * Param:
- * insn - THUMB instruction to check.
- * Return:
- * boolean: 1 if instruction is IT instruction, or zero otherwise.
- */
-static inline int
-is_it_insn(uint16_t insn)
-{
- return (insn & 0xff00) == 0xbf00 && (insn & 0x000f) != 0;
-}
-
-#endif // QEMU_TARGET_ARM_IT_HELPER_H
diff --git a/target-arm/translate.c b/target-arm/translate.c
index ca04700..84600f7 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -30,7 +30,6 @@
#include "disas.h"
#include "tcg-op.h"
#include "qemu-log.h"
-#include "it_helper.h"
#ifdef CONFIG_TRACE
#include "trace.h"
@@ -58,15 +57,8 @@ typedef struct DisasContext {
int condlabel;
/* Thumb-2 condtional execution bits. */
int condexec_mask;
- /* Set to 1 iff currently translated instruction is IT instruction.
- * This flag is then used to properly adjust condexec_mask field after
- * instruction has been translated*/
- int is_it_insn;
- /* Set to 1 iff condexec_mask should be updated to CPU's condexec_bits.
- * This flag is set to 1 if condexec_mask field has changed as the result
- * of an instruction translation, so it must be saved to CPU's condexec_bits
- * field after translated instruction has been executed. */
- int save_condexec_mask;
+ int condexec_cond;
+ int condexec_mask_prev; /* mask at start of instruction/block */
struct TranslationBlock *tb;
int singlestep_enabled;
int thumb;
@@ -3532,11 +3524,16 @@ static void gen_rfe(DisasContext *s, TCGv pc, TCGv cpsr)
static inline void
gen_set_condexec (DisasContext *s)
{
- if (s->save_condexec_mask) {
+ if (s->condexec_mask) {
+ uint32_t val = (s->condexec_cond << 4) | (s->condexec_mask >> 1);
TCGv tmp = new_tmp();
- tcg_gen_movi_i32(tmp, s->condexec_mask);
+ tcg_gen_movi_i32(tmp, val);
+ store_cpu_field(tmp, condexec_bits);
+ }
+ else if (s->condexec_mask_prev != 0) {
+ TCGv tmp = new_tmp();
+ tcg_gen_movi_i32(tmp, 0);
store_cpu_field(tmp, condexec_bits);
- s->save_condexec_mask = 0;
}
}
@@ -8183,12 +8180,10 @@ static void disas_thumb_insn(CPUState *env, DisasContext *s)
TCGv tmp2;
TCGv addr;
- if (itstate_is_in_it_block(s->condexec_mask)) {
- /* We're translating an IT block instruction. Make it branch as
- * requried by the current ITSTATE. */
- const uint32_t it_cond = itstate_cond(s->condexec_mask);
+ if (s->condexec_mask) {
+ cond = s->condexec_cond;
s->condlabel = gen_new_label();
- gen_test_cc(it_cond ^ 1, s->condlabel);
+ gen_test_cc(cond ^ 1, s->condlabel);
s->condjmp = 1;
}
@@ -8707,9 +8702,8 @@ static void disas_thumb_insn(CPUState *env, DisasContext *s)
break;
}
/* If Then. */
- s->condexec_mask = insn & 0xff;
- /* Let the translator know that this was an IT instruction. */
- s->is_it_insn = 1;
+ s->condexec_cond = (insn >> 4) & 0xe;
+ s->condexec_mask = insn & 0x1f;
/* No actual code generated for this insn, just setup state. */
break;
@@ -8885,11 +8879,9 @@ static inline void gen_intermediate_code_internal(CPUState *env,
dc->singlestep_enabled = env->singlestep_enabled;
dc->condjmp = 0;
dc->thumb = env->thumb;
- if (!search_pc) {
- /* Store current ITSTATE value. */
- tb->itstate = env->condexec_bits;
- }
- dc->condexec_mask = tb->itstate;
+ dc->condexec_mask = (env->condexec_bits & 0xf) << 1;
+ dc->condexec_mask_prev = dc->condexec_mask;
+ dc->condexec_cond = env->condexec_bits >> 4;
#if !defined(CONFIG_USER_ONLY)
if (IS_M(env)) {
dc->user = ((env->v7m.exception == 0) && (env->v7m.control & 1));
@@ -8924,9 +8916,6 @@ static inline void gen_intermediate_code_internal(CPUState *env,
#endif
do {
- /* Clear IT related flags at the beginning of insn translation. */
- dc->save_condexec_mask = 0;
- dc->is_it_insn = 0;
#ifdef CONFIG_USER_ONLY
/* Intercept jump to the magic kernel page. */
if (dc->pc >= 0xffff0000) {
@@ -8986,13 +8975,13 @@ static inline void gen_intermediate_code_internal(CPUState *env,
if (env->thumb) {
disas_thumb_insn(env, dc);
+ dc->condexec_mask_prev = dc->condexec_mask;
if (dc->condexec_mask) {
- /* We just translated an IT-related instruction. We must save
- * updated ITSTATE into CPU's condexec_bits field at the end
- * this instruction translation. */
- dc->save_condexec_mask = 1;
- if (!dc->is_it_insn) {
- dc->condexec_mask = itstate_advance(dc->condexec_mask);
+ dc->condexec_cond = (dc->condexec_cond & 0xe)
+ | ((dc->condexec_mask >> 4) & 1);
+ dc->condexec_mask = (dc->condexec_mask << 1) & 0x1f;
+ if (dc->condexec_mask == 0) {
+ dc->condexec_cond = 0;
}
}
} else {
@@ -9008,11 +8997,6 @@ static inline void gen_intermediate_code_internal(CPUState *env,
gen_set_label(dc->condlabel);
dc->condjmp = 0;
}
-
- /* Update CPU's condexec_bits after we've moved beyond executed
- * command for both, "fall through" and "branch" cases. */
- gen_set_condexec(dc);
-
/* Translation stops when a conditional branch is encountered.
* Otherwise the subsequent code could get translated several times.
* Also stop translation when a page boundary is reached. This