mirror of
https://github.com/rcornwell/sims.git
synced 2026-01-13 15:27:04 +00:00
KA10: Fixed issue with OWBP and TWBP in zero section.
This commit is contained in:
parent
9704d847cf
commit
6427b2c9b5
101
PDP10/kx10_cpu.c
101
PDP10/kx10_cpu.c
@ -1988,7 +1988,7 @@ sim_debug(DEBUG_DATAIO, &cpu_dev, "Rl=%06o Pl=%06o, Rh=%06o, Ph=%06o\n", Rl, Pl,
|
||||
|
||||
#if KL
|
||||
int
|
||||
load_tlb(int uf, int page, int upmp, int wr)
|
||||
load_tlb(int uf, int page, int wr)
|
||||
{
|
||||
uint64 data;
|
||||
|
||||
@ -2046,7 +2046,7 @@ load_tlb(int uf, int page, int upmp, int wr)
|
||||
#define PG_WRT 0020000
|
||||
#define PG_KEP 0010000
|
||||
#define PG_CAC 0004000
|
||||
#define PG_STG 0000077
|
||||
#define PG_STG (0000077LL << 18)
|
||||
#define PG_IDX 0000777
|
||||
|
||||
#define PG_MASK 0000003777777LL
|
||||
@ -2067,7 +2067,7 @@ load_tlb(int uf, int page, int upmp, int wr)
|
||||
int base = 0540;
|
||||
#endif
|
||||
|
||||
//fprintf(stderr, "Lookup Page %o %03o upmp=%o u=%o w=%o %06o\r\n", sect, page, upmp, uf, wr, AB);
|
||||
//fprintf(stderr, "Lookup Page %o %03o u=%o w=%o %06o\r\n", sect, page, uf, wr, AB);
|
||||
/* Get segment pointer */
|
||||
/* And save it */
|
||||
#if KLB
|
||||
@ -2097,7 +2097,9 @@ sect_loop:
|
||||
case 2: /* Shared page */
|
||||
acc_bits &= (data >> 18) & RMASK;
|
||||
sim_interval--;
|
||||
data = M[(data & RMASK) + spt];
|
||||
index = data & RMASK;
|
||||
data = M[index + spt];
|
||||
//fprintf(stderr, "SMap1 %012llo %o %o\n\r", data, index, index + spt);
|
||||
break;
|
||||
|
||||
case 3: /* Indirect page */
|
||||
@ -2106,29 +2108,18 @@ sect_loop:
|
||||
sim_interval--;
|
||||
data = M[(data & RMASK) + spt];
|
||||
//fprintf(stderr, "IMap1 %012llo %o %o %o\n\r", data, pg << 9, index, page);
|
||||
if (((data >> 18) & PG_STG) != 0) {
|
||||
if ((data & PG_STG) != 0) {
|
||||
fault_data = 0;
|
||||
page_fault = 1;
|
||||
return 0;
|
||||
}
|
||||
pg = data & PG_PAG;
|
||||
if (cst) {
|
||||
sim_interval--;
|
||||
cst_val = M[cst + pg];
|
||||
if ((cst_val & PG_AGE) == 0) {
|
||||
//fprintf(stderr, "ZMap1 %012llo %012llo age\n\r", data, cst_val);
|
||||
fault_data = 0;
|
||||
page_fault = 1;
|
||||
return 0;
|
||||
}
|
||||
M[cst + pg] = (cst_val & cst_msk) | cst_dat;
|
||||
}
|
||||
sim_interval--;
|
||||
data = M[(pg << 9) | index];
|
||||
//fprintf(stderr, "JMap1 %012llo %o %o %o\n\r", data, pg << 9, index, page);
|
||||
goto sect_loop;
|
||||
}
|
||||
if (((data >> 18) & PG_STG) != 0) {
|
||||
if ((data & PG_STG) != 0) {
|
||||
fault_data = 0;
|
||||
page_fault = 1;
|
||||
return 0;
|
||||
@ -2171,7 +2162,9 @@ pg_loop:
|
||||
case 2: /* Shared page */
|
||||
acc_bits &= (data >> 18) & RMASK;
|
||||
sim_interval--;
|
||||
data = M[(data & RMASK) + spt];
|
||||
index = data & RMASK;
|
||||
data = M[index + spt];
|
||||
//fprintf(stderr, "SMap2 %012llo %o %o\n\r", data, index, index + spt);
|
||||
break;
|
||||
|
||||
case 3: /* Indirect page */
|
||||
@ -2180,23 +2173,12 @@ pg_loop:
|
||||
sim_interval--;
|
||||
data = M[(data & RMASK) + spt];
|
||||
//fprintf(stderr, "IMap2 %012llo %o %o %o\n\r", data, pg << 9, index, page);
|
||||
if (((data >> 18) & PG_STG) != 0) {
|
||||
if ((data & PG_STG) != 0) {
|
||||
fault_data = 0;
|
||||
page_fault = 1;
|
||||
return 0;
|
||||
}
|
||||
pg = data & RMASK;
|
||||
if (cst) {
|
||||
sim_interval--;
|
||||
cst_val = M[cst + pg];
|
||||
//fprintf(stderr, "ZMap2 %08o %012llo %012llo age\n\r", cst + pg, data, cst_val);
|
||||
if ((cst_val & PG_AGE) == 0) {
|
||||
fault_data = 0;
|
||||
page_fault = 1;
|
||||
return 0;
|
||||
}
|
||||
M[cst + pg] = (cst_val & cst_msk) | cst_dat;
|
||||
}
|
||||
sim_interval--;
|
||||
data = M[(pg << 9) | index];
|
||||
//fprintf(stderr, "JMap %012llo %o %o %o\n\r", data, pg << 9, index, page);
|
||||
@ -2204,14 +2186,8 @@ pg_loop:
|
||||
}
|
||||
|
||||
/* Now have final page */
|
||||
if ((data >> 18) & PG_STG) {
|
||||
fault_data = BIT2; /* BIT2 */
|
||||
if (acc_bits & PG_CAC)
|
||||
fault_data |= BIT7; /* BIT7 */
|
||||
if (acc_bits & PG_PUB)
|
||||
fault_data |= BIT6; /* BIT6 */
|
||||
if (acc_bits & PG_WRT)
|
||||
fault_data |= BIT4; /* BIT4 */
|
||||
if ((data & PG_STG) != 0) {
|
||||
fault_data = 0;
|
||||
page_fault = 1;
|
||||
return 0;
|
||||
}
|
||||
@ -2243,11 +2219,11 @@ pg_loop:
|
||||
}
|
||||
}
|
||||
/* Now construct a TBL entry */
|
||||
/* A = accessable */
|
||||
/* P = public */
|
||||
/* W = writable */
|
||||
/* S = user */
|
||||
/* C = cache */
|
||||
/* A = accessable */
|
||||
/* P = public */
|
||||
/* W = writable */
|
||||
/* S = user */
|
||||
/* C = cache */
|
||||
data = pg | KL_PAG_A;
|
||||
if (acc_bits & PG_PUB)
|
||||
data |= KL_PAG_P; /* P */
|
||||
@ -2272,7 +2248,7 @@ pg_loop:
|
||||
|
||||
/* Map the page */
|
||||
sim_interval--;
|
||||
if (uf | upmp) {
|
||||
if (uf) {
|
||||
data = M[ub_ptr + (page >> 1)];
|
||||
u_tlb[page & 01776] = (uint32)(RMASK & (data >> 18));
|
||||
u_tlb[page | 1] = (uint32)(RMASK & data);
|
||||
@ -2388,7 +2364,7 @@ int page_lookup(t_addr addr, int flag, t_addr *loc, int wr, int cur_context, int
|
||||
#endif
|
||||
/* If not valid, go refill it */
|
||||
if (data == 0) {
|
||||
data = load_tlb(uf, page, upmp, wr);
|
||||
data = load_tlb(uf | upmp, page, wr);
|
||||
if (data == 0 && page_fault) {
|
||||
fault_data |= ((uint64)addr);
|
||||
/* Ignore faults if flag set */
|
||||
@ -2419,13 +2395,15 @@ int page_lookup(t_addr addr, int flag, t_addr *loc, int wr, int cur_context, int
|
||||
/* Check if we need to modify TLB entry for TOPS 20 */
|
||||
if (t20_page && (data & KL_PAG_A) && (wr & ((data & KL_PAG_W) == 0)) && (data & KL_PAG_S)) {
|
||||
uint64 cst = FM[(06<<4)|2] & PG_MASK;
|
||||
uint64 cst_msk = FM[(06<<4)|0];
|
||||
uint64 cst_dat = FM[(06<<4)|1];
|
||||
/* Update CST entry if needed */
|
||||
if (cst) {
|
||||
uint64 cst_val;
|
||||
int pg = data & 017777;
|
||||
sim_interval--;
|
||||
cst_val = M[cst + pg];
|
||||
M[cst + pg] = cst_val | 1;
|
||||
M[cst + pg] = (cst_msk & cst_val) | cst_dat | 1;
|
||||
}
|
||||
data |= KL_PAG_W;
|
||||
/* Map the page */
|
||||
@ -2625,7 +2603,7 @@ int exec_page_lookup(t_addr addr, int wr, int *loc)
|
||||
/* If not valid, go refill it */
|
||||
if (data == 0 || (data & LMASK) != 0) {
|
||||
sect = 0;
|
||||
data = load_tlb(0, page, upmp, wr);
|
||||
data = load_tlb(upmp, page, wr);
|
||||
if (data == 0) {
|
||||
page_fault = 0;
|
||||
return 1;
|
||||
@ -5818,7 +5796,7 @@ unasign:
|
||||
FE = (AR >> 30) & 077; /* P */
|
||||
#if KLB
|
||||
f = 0;
|
||||
if (QKLB && FE > 36) {
|
||||
if (QKLB && t20_page && pc_sect != 0 && FE > 36) {
|
||||
if (FE == 077)
|
||||
goto muuo;
|
||||
f = 1;
|
||||
@ -5907,7 +5885,7 @@ fprintf(stderr, "ADJBP > 36 %d %d\n\r", SC, FE);
|
||||
AR = MB;
|
||||
SCAD = (AR >> 30) & 077;
|
||||
#if KL & KLB
|
||||
if (QKLB && t20_page && SCAD > 36) { /* Extended pointer */
|
||||
if (QKLB && t20_page && pc_sect != 0 && SCAD > 36) { /* Extended pointer */
|
||||
int i = SCAD - 37;
|
||||
//fprintf(stderr, "ILDB %012llo %d %d -> %d %d %d\n\r", AR, SCAD, i, _byte_adj[i].p, _byte_adj[i].s,_byte_adj[i].n);
|
||||
if (SCAD == 077)
|
||||
@ -5992,7 +5970,7 @@ fprintf(stderr, "ADJBP > 36 %d %d\n\r", SC, FE);
|
||||
SC = (AR >> 24) & 077;
|
||||
SCAD = (AR >> 30) & 077;
|
||||
#if KL & KLB
|
||||
if (QKLB && t20_page && SCAD > 36) { /* Extended pointer */
|
||||
if (QKLB && t20_page && pc_sect != 0 && SCAD > 36) { /* Extended pointer */
|
||||
int i = SCAD - 37;
|
||||
if (SCAD == 077)
|
||||
goto muuo;
|
||||
@ -6020,7 +5998,7 @@ ldb_ptr:
|
||||
#if KL
|
||||
ptr_flg = 1;
|
||||
#if KLB
|
||||
if (QKLB && t20_page && (SC < 36) && (glb_sect || cur_sect != 0) && (AR & BIT12) != 0) {
|
||||
if (QKLB && t20_page && (SC < 36) && pc_sect != 0 && (glb_sect || cur_sect != 0) && (AR & BIT12) != 0) {
|
||||
/* Full pointer */
|
||||
AB = (AB + 1) & RMASK;
|
||||
//fprintf(stderr, "LBP %o %o %06o %012llo\n\r", SC, SCAD, AB, MB);
|
||||
@ -7561,6 +7539,7 @@ jrstf:
|
||||
if (flag1) /* U */
|
||||
AR |= SMASK; /* BIT0 */
|
||||
AR |= BIT2|BIT3|BIT4|BIT8;
|
||||
fprintf(stderr, "Map reg %012llo %06o\r\n", AR, AB);
|
||||
set_reg(AC, AR);
|
||||
break;
|
||||
}
|
||||
@ -7572,12 +7551,13 @@ jrstf:
|
||||
flag3 = 1;
|
||||
}
|
||||
|
||||
AR = load_tlb(flag1, f, flag3, 0);
|
||||
AR = load_tlb(flag1 | flag3, f, 0);
|
||||
if (page_fault) {
|
||||
page_fault = 0;
|
||||
AR |= BIT8 | fault_data;
|
||||
AR |= fault_data;
|
||||
if (flag1) /* U */
|
||||
AR |= SMASK;
|
||||
fprintf(stderr, "Map fault %012llo %06o\r\n", AR, AB);
|
||||
set_reg(AC, AR);
|
||||
break;
|
||||
}
|
||||
@ -7599,6 +7579,7 @@ jrstf:
|
||||
} else
|
||||
AR = (f & 01740) ? 0 : 0377777LL;
|
||||
AR |= BIT8;
|
||||
fprintf(stderr, "Map ok %012llo %06o\r\n", AR, AB);
|
||||
#else
|
||||
/* Figure out if this is a user space access */
|
||||
if (xct_flag != 0 && !flag1) {
|
||||
@ -8708,7 +8689,7 @@ last:
|
||||
Mem_read_nopage();
|
||||
FLAGS = (MB >> 23) & 017777;
|
||||
/* If transistioning from user to executive adjust flags */
|
||||
if ((FLAGS & USER) != 0 && flag1)
|
||||
if ((FLAGS & USER) == 0 && flag1)
|
||||
FLAGS |= USERIO;
|
||||
if ((FLAGS & USER) == 0 && (flag3 || (FLAGS & OVR) != 0))
|
||||
FLAGS |= PRV_PUB|OVR;
|
||||
@ -8872,7 +8853,7 @@ do_byte_setup(int n, int wr, int *pos, int *sz)
|
||||
/* Advance pointer */
|
||||
//fprintf(stderr, "%s %012llo %012llo %2o %2o %03o\n\r", (wr)?"store":"load", val1, val2, s, p, np);
|
||||
#if KLB
|
||||
if (QKLB && t20_page) {
|
||||
if (QKLB && t20_page && pc_sect != 0) {
|
||||
if (p > 36) { /* Extended pointer */
|
||||
int i = p - 37;
|
||||
*sz = s = _byte_adj[i].s;
|
||||
@ -8890,7 +8871,7 @@ do_byte_setup(int n, int wr, int *pos, int *sz)
|
||||
sect = (MB >> 18) & 07777;
|
||||
glb_sect = 1;
|
||||
//fprintf(stderr, "Load_bytex %012llo %012llo %06 %2o %2o\n\r", val1, val2, sect, s, p);
|
||||
} else if (pc_sect != 0 && (val1 & BIT12) != 0) { /* Full pointer */
|
||||
} else if ((val1 & BIT12) != 0) { /* Full pointer */
|
||||
if (np & 0400) {
|
||||
np = p = ((0777 ^ s) + 044 + 1) & 0777;
|
||||
if (val2 & SMASK)
|
||||
@ -9198,7 +9179,7 @@ adj_byte(int n)
|
||||
/* Advance pointer */
|
||||
np = (p + (0777 ^ s) + 1) & 0777;
|
||||
#if KLB
|
||||
if (QKLB && t20_page) {
|
||||
if (QKLB && t20_page && pc_sect != 0) {
|
||||
if (p > 36) { /* Extended pointer */
|
||||
int i = p - 37;
|
||||
s = _byte_adj[i].s;
|
||||
@ -9209,7 +9190,7 @@ adj_byte(int n)
|
||||
set_reg(n+1, val1);
|
||||
set_reg(n+2, val2);
|
||||
return;
|
||||
} else if (pc_sect != 0 && (val1 & BIT12) != 0) { /* Full pointer */
|
||||
} else if ((val1 & BIT12) != 0) { /* Full pointer */
|
||||
if (np & 0400)
|
||||
val2 = (val2 & ~(SECTM|RMASK)) | ((val2 + 1) & (SECTM|RMASK));
|
||||
} else {
|
||||
@ -9258,7 +9239,7 @@ adv_byte(int n)
|
||||
/* Advance pointer */
|
||||
np = (p + (0777 ^ s) + 1) & 0777;
|
||||
#if KLB
|
||||
if (QKLB && t20_page) {
|
||||
if (QKLB && t20_page && pc_sect != 0) {
|
||||
if (p > 36) { /* Extended pointer */
|
||||
int i = p - 37;
|
||||
s = _byte_adj[i].s;
|
||||
@ -9270,7 +9251,7 @@ adv_byte(int n)
|
||||
np = ((0777 ^ s) + 044 + 1) & 0777;
|
||||
val2 = (val2 & ~(SECTM|RMASK)) | ((val2 + 1) & (SECTM|RMASK));
|
||||
}
|
||||
} else if (pc_sect != 0 && (val1 & BIT12) != 0) { /* Full pointer */
|
||||
} else if ((val1 & BIT12) != 0) { /* Full pointer */
|
||||
if (np & 0400) {
|
||||
np = ((0777 ^ s) + 044 + 1) & 0777;
|
||||
val2 = (val2 & ~(SECTM|RMASK)) | ((val2 + 1) & (SECTM|RMASK));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user