From: Alexander Graf <agraf@suse.de>
To: qemu-ppc@nongnu.org
Cc: peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 41/52] PPC: Cuda: Use cuda timer to expose tbfreq to guest
Date: Thu, 4 Sep 2014 19:20:29 +0200 [thread overview]
Message-ID: <1409851240-48126-42-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1409851240-48126-1-git-send-email-agraf@suse.de>
Mac OS X calibrates a number of frequencies on bootup based on reading
tb values on bootup and comparing them to via cuda timer values.
The only variable we can really steer well (thanks to KVM) is the cuda
frequency. So let's use that one to fake Mac OS X into believing the
bus frequency is tbfreq * 4. That way Mac OS X will automatically
calculate the correct timebase frequency.
With this patch and the patch set I posted earlier I can successfully
run Mac OS X 10.2, 10.3 and 10.4 guests with -M mac99 on TCG and KVM.
Suggested-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
---
hw/misc/macio/cuda.c | 23 ++++++++++++++++++++---
hw/misc/macio/macio.c | 10 ++++++++++
hw/ppc/mac.h | 2 ++
hw/ppc/mac_newworld.c | 1 +
hw/ppc/mac_oldworld.c | 1 +
5 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index ff6051d..b4273aa 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -123,13 +123,22 @@ static void cuda_update_irq(CUDAState *s)
}
}
+static uint64_t get_tb(uint64_t freq)
+{
+ return muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL),
+ freq, get_ticks_per_sec());
+}
+
static unsigned int get_counter(CUDATimer *s)
{
int64_t d;
unsigned int counter;
+ uint64_t tb_diff;
+
+ /* Reverse of the tb calculation algorithm that Mac OS X uses on bootup. */
+ tb_diff = get_tb(s->frequency) - s->load_time;
+ d = (tb_diff * 0xBF401675E5DULL) / (s->frequency << 24);
- d = muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) - s->load_time,
- CUDA_TIMER_FREQ, get_ticks_per_sec());
if (s->index == 0) {
/* the timer goes down from latch to -1 (period of latch + 2) */
if (d <= (s->counter_value + 1)) {
@@ -147,7 +156,7 @@ static unsigned int get_counter(CUDATimer *s)
static void set_counter(CUDAState *s, CUDATimer *ti, unsigned int val)
{
CUDA_DPRINTF("T%d.counter=%d\n", 1 + (ti->timer == NULL), val);
- ti->load_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+ ti->load_time = get_tb(s->frequency);
ti->counter_value = val;
cuda_timer_update(s, ti, ti->load_time);
}
@@ -688,6 +697,8 @@ static void cuda_realizefn(DeviceState *dev, Error **errp)
struct tm tm;
s->timers[0].timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, cuda_timer1, s);
+ s->timers[0].frequency = s->frequency;
+ s->timers[1].frequency = s->frequency;
qemu_get_timedate(&tm, 0);
s->tick_offset = (uint32_t)mktimegm(&tm) + RTC_OFFSET;
@@ -713,6 +724,11 @@ static void cuda_initfn(Object *obj)
DEVICE(obj), "adb.0");
}
+static Property cuda_properties[] = {
+ DEFINE_PROP_UINT64("frequency", CUDAState, frequency, 0),
+ DEFINE_PROP_END_OF_LIST()
+};
+
static void cuda_class_init(ObjectClass *oc, void *data)
{
DeviceClass *dc = DEVICE_CLASS(oc);
@@ -720,6 +736,7 @@ static void cuda_class_init(ObjectClass *oc, void *data)
dc->realize = cuda_realizefn;
dc->reset = cuda_reset;
dc->vmsd = &vmstate_cuda;
+ dc->props = cuda_properties;
}
static const TypeInfo cuda_type_info = {
diff --git a/hw/misc/macio/macio.c b/hw/misc/macio/macio.c
index 35eaa00..e0f1e88 100644
--- a/hw/misc/macio/macio.c
+++ b/hw/misc/macio/macio.c
@@ -42,6 +42,7 @@ typedef struct MacIOState
void *dbdma;
MemoryRegion *pic_mem;
MemoryRegion *escc_mem;
+ uint64_t frequency;
} MacIOState;
#define OLDWORLD_MACIO(obj) \
@@ -351,12 +352,19 @@ static void macio_newworld_class_init(ObjectClass *oc, void *data)
pdc->device_id = PCI_DEVICE_ID_APPLE_UNI_N_KEYL;
}
+static Property macio_properties[] = {
+ DEFINE_PROP_UINT64("frequency", MacIOState, frequency, 0),
+ DEFINE_PROP_END_OF_LIST()
+};
+
static void macio_class_init(ObjectClass *klass, void *data)
{
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
+ DeviceClass *dc = DEVICE_CLASS(klass);
k->vendor_id = PCI_VENDOR_ID_APPLE;
k->class_id = PCI_CLASS_OTHERS << 8;
+ dc->props = macio_properties;
}
static const TypeInfo macio_oldworld_type_info = {
@@ -403,6 +411,8 @@ void macio_init(PCIDevice *d,
macio_state->escc_mem = escc_mem;
/* Note: this code is strongly inspirated from the corresponding code
in PearPC */
+ qdev_prop_set_uint64(DEVICE(&macio_state->cuda), "frequency",
+ macio_state->frequency);
qdev_init_nofail(DEVICE(d));
}
diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h
index 23536f4..aff2b9a 100644
--- a/hw/ppc/mac.h
+++ b/hw/ppc/mac.h
@@ -57,6 +57,7 @@ typedef struct CUDATimer {
uint16_t counter_value;
int64_t load_time;
int64_t next_irq_time;
+ uint64_t frequency;
QEMUTimer *timer;
} CUDATimer;
@@ -97,6 +98,7 @@ typedef struct CUDAState {
CUDATimer timers[2];
uint32_t tick_offset;
+ uint64_t frequency;
uint8_t last_b;
uint8_t last_acr;
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index d525247..8453bfa 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -395,6 +395,7 @@ static void ppc_core99_init(MachineState *machine)
qdev_connect_gpio_out(dev, 2, pic[0x02]); /* IDE DMA */
qdev_connect_gpio_out(dev, 3, pic[0x0e]); /* IDE */
qdev_connect_gpio_out(dev, 4, pic[0x03]); /* IDE DMA */
+ qdev_prop_set_uint64(dev, "frequency", tbfreq);
macio_init(macio, pic_mem, escc_bar);
/* We only emulate 2 out of 3 IDE controllers for now */
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index 863dd2f..630a9f9 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -286,6 +286,7 @@ static void ppc_heathrow_init(MachineState *machine)
qdev_connect_gpio_out(dev, 2, pic[0x02]); /* IDE-0 DMA */
qdev_connect_gpio_out(dev, 3, pic[0x0E]); /* IDE-1 */
qdev_connect_gpio_out(dev, 4, pic[0x03]); /* IDE-1 DMA */
+ qdev_prop_set_uint64(dev, "frequency", tbfreq);
macio_init(macio, pic_mem, escc_bar);
macio_ide = MACIO_IDE(object_resolve_path_component(OBJECT(macio),
--
1.8.1.4
next prev parent reply other threads:[~2014-09-04 17:21 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-04 17:19 [Qemu-devel] [PULL 00/52] ppc patch queue 2014-09-04 Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 01/52] PPC: KVM: Fix g3beige and mac99 when HV is loaded Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 02/52] ppc: spapr-rtas - implement os-term rtas call Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 03/52] linux-user: Fix Stack Pointer Bug in PPC setup_rt_frame Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 04/52] linux-user: Split PPC Trampoline Encoding from Register Save Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 05/52] linux-user: Enable Signal Handlers on PPC64 Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 06/52] linux-user: Properly Dereference PPC64 ELFv1 Signal Handler Pointer Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 07/52] linux-user: Implement do_setcontext for PPC64 Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 08/52] linux-user: Handle PPC64 ELFv2 Function Pointers Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 09/52] hw/ppc/spapr_hcall.c: Fix typo in function names Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 10/52] spapr: add uuid/host details to device tree Alexander Graf
2014-09-04 17:19 ` [Qemu-devel] [PULL 11/52] PPC: mac99: Move NVRAM to page boundary when necessary Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 12/52] spapr: fix possible memory leak Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 13/52] spapr: Move DT memory node rendering to a helper Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 14/52] spapr: Use DT memory node rendering helper for other nodes Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 15/52] spapr: Refactor spapr_populate_memory() to allow memoryless nodes Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 16/52] spapr: Split memory nodes to power-of-two blocks Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 17/52] spapr: Add a helper for node0_size calculation Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 18/52] spapr: Fix ibm, associativity for memory nodes Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 19/52] loader: Add load_image_size() to replace load_image() Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 20/52] spapr: Locate RTAS and device-tree based on real RMA Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 21/52] ppc: debug stub: Get trap instruction opcode from KVM Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 22/52] ppc: synchronize excp_vectors for injecting exception Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 23/52] ppc: Add software breakpoint support Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 24/52] ppc: Add hw breakpoint watchpoint support Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 25/52] ppc/spapr: Fix MAX_CPUS to 255 Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 26/52] target-ppc: Bug Fix: rlwinm Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 27/52] target-ppc: Bug Fix: rlwnm Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 28/52] target-ppc: Bug Fix: rlwimi Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 29/52] target-ppc: Bug Fix: mullwo Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 30/52] target-ppc: Bug Fix: mullw Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 31/52] target-ppc: Bug Fix: mulldo OV Detection Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 32/52] target-ppc: Bug Fix: srawi Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 33/52] target-ppc: Bug Fix: srad Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 34/52] KVM: Add helper to run KVM_CHECK_EXTENSION on vm fd Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 35/52] PPC: KVM: Use vm check_extension for pv hcall Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 36/52] PPC: mac99: Fix core99 timer frequency Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 37/52] PPC: mac_nvram: Remove unused functions Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 38/52] PPC: mac_nvram: Allow 2 and 4 byte accesses Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 39/52] PPC: mac_nvram: Split NVRAM into OF and OSX parts Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 40/52] PPC: Mac: Move tbfreq into local variable Alexander Graf
2014-09-04 17:20 ` Alexander Graf [this message]
2014-09-04 17:20 ` [Qemu-devel] [PULL 42/52] spapr_pci: Fix config space corruption Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 43/52] spapr-vlan: Don't touch last entry in buffer list Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 44/52] target-ppc: Special Case of rlwimi Should Use Deposit Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 45/52] target-ppc: Optimize rlwinm MB=0 ME=31 Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 46/52] target-ppc: Optimize rlwnm " Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 47/52] target-ppc: Clean Up mullw Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 48/52] target-ppc: Clean up mullwo Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 49/52] target-ppc: Implement mulldo with TCG Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 50/52] spapr_pci: map the MSI window in each PHB Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 51/52] PPC: Fix default config ordering and add eTSEC for ppc64 Alexander Graf
2014-09-04 17:20 ` [Qemu-devel] [PULL 52/52] hypervisor property clashes with hypervisor node Alexander Graf
2014-09-04 18:38 ` [Qemu-devel] [PULL 00/52] ppc patch queue 2014-09-04 Peter Maydell
2014-09-04 19:13 ` Alexander Graf
2014-09-04 19:53 ` [Qemu-devel] [Qemu-ppc] " Tom Musta
2014-09-04 22:17 ` Alexander Graf
2014-09-05 10:36 ` Peter Maydell
2014-09-08 10:52 ` Alexander Graf
2014-09-08 12:14 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1409851240-48126-42-git-send-email-agraf@suse.de \
--to=agraf@suse.de \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).