--- trunk/src/cpus/cpu_alpha_palcode.c 2007/10/08 16:19:28 21 +++ trunk/src/cpus/cpu_alpha_palcode.c 2007/10/08 16:19:37 22 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005 Anders Gavare. All rights reserved. + * Copyright (C) 2005-2006 Anders Gavare. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -25,7 +25,7 @@ * SUCH DAMAGE. * * - * $Id: cpu_alpha_palcode.c,v 1.1 2005/08/29 14:36:41 debug Exp $ + * $Id: cpu_alpha_palcode.c,v 1.5 2006/01/14 13:15:32 debug Exp $ * * Alpha PALcode-related functionality. */ @@ -86,6 +86,7 @@ case 0x3c: snprintf(buf, buflen, "PAL_OSF1_whami"); break; case 0x3d: snprintf(buf, buflen, "PAL_OSF1_retsys"); break; case 0x3f: snprintf(buf, buflen, "PAL_OSF1_rti"); break; + case 0x81: snprintf(buf, buflen, "PAL_bugchk"); break; case 0x83: snprintf(buf, buflen, "PAL_OSF1_callsys"); break; case 0x86: snprintf(buf, buflen, "PAL_OSF1_imb"); break; case 0x92: snprintf(buf, buflen, "PAL_OSF1_urti"); break; @@ -104,7 +105,7 @@ switch (cpu->cd.alpha.r[ALPHA_A0]) { case 0x02: - /* put string. a1 = channel, a2 = ptr to buf, a3 = len */ + /* puts: a1 = channel, a2 = ptr to buf, a3 = len */ for (addr = cpu->cd.alpha.r[ALPHA_A2]; addr < cpu->cd.alpha.r[ALPHA_A2] + cpu->cd.alpha.r[ALPHA_A3]; addr ++) { @@ -116,6 +117,7 @@ cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.r[ALPHA_A3]; break; case 0x22: + /* getenv */ fatal("[ Alpha PALcode: GXemul PROM call 0x22: TODO ]\n"); break; default:fatal("[ Alpha PALcode: GXemul PROM call, a0=0x%llx ]\n", @@ -132,7 +134,7 @@ * alpha_palcode(): * * Execute an Alpha PALcode instruction. (Most of these correspond to - * NetBSD/alpha code). + * OSF1 palcodes, used by for example NetBSD/alpha.) */ void alpha_palcode(struct cpu *cpu, uint32_t palcode) { @@ -147,6 +149,14 @@ /* Floating point enable: a0 = 1 or 0. */ /* TODO */ break; + case 0x31: /* PAL_OSF1_wrval */ + /* a0 = value */ + cpu->cd.alpha.sysvalue = cpu->cd.alpha.r[ALPHA_A0]; + break; + case 0x32: /* PAL_OSF1_rdval */ + /* return: v0 = value */ + cpu->cd.alpha.r[ALPHA_V0] = cpu->cd.alpha.sysvalue; + break; case 0x33: /* PAL_OSF1_tbi */ /* a0 = op, a1 = vaddr */ debug("[ Alpha PALcode: PAL_OSF1_tbi: a0=%lli a1=0x%llx ]\n", @@ -180,6 +190,9 @@ /* Returns CPU id in v0: */ cpu->cd.alpha.r[ALPHA_V0] = cpu->cpu_id; break; + case 0x81: /* PAL_bugchk */ + cpu->running = 0; + break; case 0x83: /* PAL_OSF1_syscall */ if (cpu->machine->userland_emul != NULL) useremul_syscall(cpu, 0);