mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
target/hppa: Enhancements and fixes
Some enhancements and fixes for the hppa target. The major change is, that this patchset adds a new SeaBIOS-hppa firmware which is built as 32- and 64-bit firmware. The new 64-bit firmware is necessary to fully support 64-bit operating systems (HP-UX, Linux, NetBSD,...). -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZcquAQAKCRD3ErUQojoP X9pjAQCVsWyuYlGCW2paIGVWKV0vsOpwetUrbhRtFUZGqZxb4AD9FbMsXRcCN/oq CotBPY/a8MEzIQcwYl5QbcI5nNW4ygs= =RA0B -----END PGP SIGNATURE----- Merge tag 'hppa64-pull-request' of https://github.com/hdeller/qemu-hppa into staging target/hppa: Enhancements and fixes Some enhancements and fixes for the hppa target. The major change is, that this patchset adds a new SeaBIOS-hppa firmware which is built as 32- and 64-bit firmware. The new 64-bit firmware is necessary to fully support 64-bit operating systems (HP-UX, Linux, NetBSD,...). # -----BEGIN PGP SIGNATURE----- # # iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCZcquAQAKCRD3ErUQojoP # X9pjAQCVsWyuYlGCW2paIGVWKV0vsOpwetUrbhRtFUZGqZxb4AD9FbMsXRcCN/oq # CotBPY/a8MEzIQcwYl5QbcI5nNW4ygs= # =RA0B # -----END PGP SIGNATURE----- # gpg: Signature made Mon 12 Feb 2024 23:47:13 GMT # gpg: using EDDSA key BCE9123E1AD29F07C049BBDEF712B510A23A0F5F # gpg: Good signature from "Helge Deller <deller@gmx.de>" [unknown] # gpg: aka "Helge Deller <deller@kernel.org>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 4544 8228 2CD9 10DB EF3D 25F8 3E5F 3D04 A7A2 4603 # Subkey fingerprint: BCE9 123E 1AD2 9F07 C049 BBDE F712 B510 A23A 0F5F * tag 'hppa64-pull-request' of https://github.com/hdeller/qemu-hppa: hw/hppa/machine: Load 64-bit firmware on 64-bit machines target/hppa: Update SeaBIOS-hppa to version 16 hw/net/tulip: add chip status register values target/hppa: PDC_BTLB_INFO uses 32-bit ints target/hppa: Allow read-access to PSW with rsm 0,reg instruction lasi: Add reset I/O ports for LASI audio and FDC target/hppa: Implement do_transaction_failed handler for I/O errors lasi: allow access to LAN MAC address registers hw/pci-host/astro: Implement Hard Fail and Soft Fail mode hw/pci-host/astro: Avoid aborting on access failure target/hppa: Add "diag 0x101" for console output support disas/hppa: Add disassembly for qemu specific instructions Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
bc2e8b18fb
16 changed files with 150 additions and 43 deletions
|
@ -191,6 +191,7 @@ static const TCGCPUOps hppa_tcg_ops = {
|
|||
.cpu_exec_interrupt = hppa_cpu_exec_interrupt,
|
||||
.do_interrupt = hppa_cpu_do_interrupt,
|
||||
.do_unaligned_access = hppa_cpu_do_unaligned_access,
|
||||
.do_transaction_failed = hppa_cpu_do_transaction_failed,
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
};
|
||||
|
||||
|
|
|
@ -381,6 +381,11 @@ bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
|||
int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx,
|
||||
int type, hwaddr *pphys, int *pprot,
|
||||
HPPATLBEntry **tlb_entry);
|
||||
void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
|
||||
vaddr addr, unsigned size,
|
||||
MMUAccessType access_type,
|
||||
int mmu_idx, MemTxAttrs attrs,
|
||||
MemTxResult response, uintptr_t retaddr);
|
||||
extern const MemoryRegionOps hppa_io_eir_ops;
|
||||
extern const VMStateDescription vmstate_hppa_cpu;
|
||||
void hppa_cpu_alarm_timer(void *);
|
||||
|
|
|
@ -103,4 +103,5 @@ DEF_HELPER_FLAGS_1(ptlbe, TCG_CALL_NO_RWG, void, env)
|
|||
DEF_HELPER_FLAGS_2(lpa, TCG_CALL_NO_WG, tl, env, tl)
|
||||
DEF_HELPER_FLAGS_1(change_prot_id, TCG_CALL_NO_RWG, void, env)
|
||||
DEF_HELPER_1(diag_btlb, void, env)
|
||||
DEF_HELPER_1(diag_console_output, void, env)
|
||||
#endif
|
||||
|
|
|
@ -353,6 +353,25 @@ raise_exception_with_ior(CPUHPPAState *env, int excp, uintptr_t retaddr,
|
|||
cpu_loop_exit_restore(cs, retaddr);
|
||||
}
|
||||
|
||||
void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
|
||||
vaddr addr, unsigned size,
|
||||
MMUAccessType access_type,
|
||||
int mmu_idx, MemTxAttrs attrs,
|
||||
MemTxResult response, uintptr_t retaddr)
|
||||
{
|
||||
CPUHPPAState *env = cpu_env(cs);
|
||||
|
||||
qemu_log_mask(LOG_GUEST_ERROR, "HPMC at " TARGET_FMT_lx ":" TARGET_FMT_lx
|
||||
" while accessing I/O at %#08" HWADDR_PRIx "\n",
|
||||
env->iasq_f, env->iaoq_f, physaddr);
|
||||
|
||||
/* FIXME: Enable HPMC exceptions when firmware has clean device probing */
|
||||
if (0) {
|
||||
raise_exception_with_ior(env, EXCP_HPMC, retaddr, addr,
|
||||
MMU_IDX_MMU_DISABLED(mmu_idx));
|
||||
}
|
||||
}
|
||||
|
||||
bool hppa_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
|
||||
MMUAccessType type, int mmu_idx,
|
||||
bool probe, uintptr_t retaddr)
|
||||
|
@ -665,7 +684,7 @@ void HELPER(diag_btlb)(CPUHPPAState *env)
|
|||
case 0:
|
||||
/* return BTLB parameters */
|
||||
qemu_log_mask(CPU_LOG_MMU, "PDC_BLOCK_TLB: PDC_BTLB_INFO\n");
|
||||
vaddr = probe_access(env, env->gr[24], 4 * sizeof(target_ulong),
|
||||
vaddr = probe_access(env, env->gr[24], 4 * sizeof(uint32_t),
|
||||
MMU_DATA_STORE, mmu_idx, ra);
|
||||
if (vaddr == NULL) {
|
||||
env->gr[28] = -10; /* invalid argument */
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
#include "exec/helper-proto.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "chardev/char-fe.h"
|
||||
|
||||
void HELPER(write_interval_timer)(CPUHPPAState *env, target_ulong val)
|
||||
{
|
||||
|
@ -109,3 +111,37 @@ void HELPER(rfi_r)(CPUHPPAState *env)
|
|||
helper_getshadowregs(env);
|
||||
helper_rfi(env);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
/*
|
||||
* diag_console_output() is a helper function used during the initial bootup
|
||||
* process of the SeaBIOS-hppa firmware. During the bootup phase, addresses of
|
||||
* serial ports on e.g. PCI busses are unknown and most other devices haven't
|
||||
* been initialized and configured yet. With help of a simple "diag" assembler
|
||||
* instruction and an ASCII character code in register %r26 firmware can easily
|
||||
* print debug output without any dependencies to the first serial port and use
|
||||
* that as serial console.
|
||||
*/
|
||||
void HELPER(diag_console_output)(CPUHPPAState *env)
|
||||
{
|
||||
CharBackend *serial_backend;
|
||||
Chardev *serial_port;
|
||||
unsigned char c;
|
||||
|
||||
/* find first serial port */
|
||||
serial_port = serial_hd(0);
|
||||
if (!serial_port) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* get serial_backend for the serial port */
|
||||
serial_backend = serial_port->be;
|
||||
if (!serial_backend ||
|
||||
!qemu_chr_fe_backend_connected(serial_backend)) {
|
||||
return;
|
||||
}
|
||||
|
||||
c = (unsigned char)env->gr[26];
|
||||
qemu_chr_fe_write(serial_backend, &c, sizeof(c));
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -2156,10 +2156,16 @@ static bool trans_ldsid(DisasContext *ctx, arg_ldsid *a)
|
|||
|
||||
static bool trans_rsm(DisasContext *ctx, arg_rsm *a)
|
||||
{
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
#else
|
||||
TCGv_i64 tmp;
|
||||
|
||||
/* HP-UX 11i and HP ODE use rsm for read-access to PSW */
|
||||
if (a->i) {
|
||||
CHECK_MOST_PRIVILEGED(EXCP_PRIV_OPR);
|
||||
}
|
||||
|
||||
nullify_over(ctx);
|
||||
|
||||
tmp = tcg_temp_new_i64();
|
||||
|
@ -4411,6 +4417,12 @@ static bool trans_diag(DisasContext *ctx, arg_diag *a)
|
|||
gen_helper_diag_btlb(tcg_env);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
if (a->i == 0x101) {
|
||||
/* print char in %r26 to first serial console, used by SeaBIOS-hppa */
|
||||
nullify_over(ctx);
|
||||
gen_helper_diag_console_output(tcg_env);
|
||||
return nullify_end(ctx);
|
||||
}
|
||||
#endif
|
||||
qemu_log_mask(LOG_UNIMP, "DIAG opcode 0x%04x ignored\n", a->i);
|
||||
return true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue