Reverted the mainline PCEM CPU flat segment speedup commit - it's still buggy (Duke Nukem 3D and Little Big Adventure 2 like crashing), I'll recommit it when Sarah Walker fixes the bugs.
This commit is contained in:
@@ -616,10 +616,6 @@ static void CHECK_SEG_READ(x86seg *seg)
|
||||
return;
|
||||
if (seg->checked)
|
||||
return;
|
||||
if ((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS))
|
||||
return;
|
||||
if ((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS))
|
||||
return;
|
||||
|
||||
addbyte(0x83); /*CMP seg->base, -1*/
|
||||
addbyte(0x05|0x38);
|
||||
@@ -641,10 +637,6 @@ static void CHECK_SEG_WRITE(x86seg *seg)
|
||||
return;
|
||||
if (seg->checked)
|
||||
return;
|
||||
if ((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS))
|
||||
return;
|
||||
if ((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS))
|
||||
return;
|
||||
|
||||
addbyte(0x83); /*CMP seg->base, -1*/
|
||||
addbyte(0x05|0x38);
|
||||
@@ -658,11 +650,6 @@ static void CHECK_SEG_WRITE(x86seg *seg)
|
||||
}
|
||||
static void CHECK_SEG_LIMITS(x86seg *seg, int end_offset)
|
||||
{
|
||||
if ((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS))
|
||||
return;
|
||||
if ((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS))
|
||||
return;
|
||||
|
||||
addbyte(0x3b); /*CMP EAX, seg->limit_low*/
|
||||
addbyte(0x05);
|
||||
addlong((uint32_t)&seg->limit_low);
|
||||
@@ -688,18 +675,9 @@ static void CHECK_SEG_LIMITS(x86seg *seg, int end_offset)
|
||||
|
||||
static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_b*/
|
||||
addlong(mem_load_addr_ea_b - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
@@ -707,18 +685,9 @@ static void MEM_LOAD_ADDR_EA_B(x86seg *seg)
|
||||
}
|
||||
static int MEM_LOAD_ADDR_EA_B_NO_ABRT(x86seg *seg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_b_no_abrt*/
|
||||
addlong(mem_load_addr_ea_b_no_abrt - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
@@ -728,18 +697,9 @@ static int MEM_LOAD_ADDR_EA_B_NO_ABRT(x86seg *seg)
|
||||
}
|
||||
static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_w*/
|
||||
addlong(mem_load_addr_ea_w - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
@@ -747,18 +707,9 @@ static void MEM_LOAD_ADDR_EA_W(x86seg *seg)
|
||||
}
|
||||
static void MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0x83); /*ADD EAX, offset*/
|
||||
addbyte(0xc0);
|
||||
addbyte(offset);
|
||||
@@ -769,18 +720,9 @@ static void MEM_LOAD_ADDR_EA_W_OFFSET(x86seg *seg, int offset)
|
||||
}
|
||||
static int MEM_LOAD_ADDR_EA_W_NO_ABRT(x86seg *seg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_w_no_abrt*/
|
||||
addlong(mem_load_addr_ea_w_no_abrt - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
@@ -790,18 +732,9 @@ static int MEM_LOAD_ADDR_EA_W_NO_ABRT(x86seg *seg)
|
||||
}
|
||||
static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_l*/
|
||||
addlong(mem_load_addr_ea_l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
@@ -810,18 +743,9 @@ static void MEM_LOAD_ADDR_EA_L(x86seg *seg)
|
||||
}
|
||||
static int MEM_LOAD_ADDR_EA_L_NO_ABRT(x86seg *seg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_l_no_abrt*/
|
||||
addlong(mem_load_addr_ea_l_no_abrt - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
@@ -832,18 +756,9 @@ static int MEM_LOAD_ADDR_EA_L_NO_ABRT(x86seg *seg)
|
||||
|
||||
static void MEM_LOAD_ADDR_EA_Q(x86seg *seg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL EDX, seg->base*/
|
||||
addbyte(0x05 | (REG_EDX << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_load_addr_ea_q*/
|
||||
addlong(mem_load_addr_ea_q - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
|
||||
@@ -871,18 +786,9 @@ static void MEM_LOAD_ADDR_IMM_L(x86seg *seg, uint32_t addr)
|
||||
|
||||
static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
@@ -893,18 +799,9 @@ static void MEM_STORE_ADDR_EA_B(x86seg *seg, int host_reg)
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_B_NO_ABRT(x86seg *seg, int host_reg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
@@ -915,18 +812,9 @@ static void MEM_STORE_ADDR_EA_B_NO_ABRT(x86seg *seg, int host_reg)
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
@@ -937,18 +825,9 @@ static void MEM_STORE_ADDR_EA_W(x86seg *seg, int host_reg)
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_W_NO_ABRT(x86seg *seg, int host_reg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
@@ -959,18 +838,9 @@ static void MEM_STORE_ADDR_EA_W_NO_ABRT(x86seg *seg, int host_reg)
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
@@ -981,18 +851,9 @@ static void MEM_STORE_ADDR_EA_L(x86seg *seg, int host_reg)
|
||||
}
|
||||
static void MEM_STORE_ADDR_EA_L_NO_ABRT(x86seg *seg, int host_reg)
|
||||
{
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
if (host_reg != REG_ECX)
|
||||
{
|
||||
addbyte(0x89); /*MOV ECX, host_reg*/
|
||||
@@ -1013,18 +874,9 @@ static void MEM_STORE_ADDR_EA_Q(x86seg *seg, int host_reg, int host_reg2)
|
||||
addbyte(0x89); /*MOV ECX, host_reg2*/
|
||||
addbyte(0xc0 | REG_ECX | (host_reg2 << 3));
|
||||
}
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_store_addr_ea_q*/
|
||||
addlong(mem_store_addr_ea_q - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
}
|
||||
@@ -3940,18 +3792,9 @@ static void LOAD_EA()
|
||||
static void MEM_CHECK_WRITE(x86seg *seg)
|
||||
{
|
||||
CHECK_SEG_WRITE(seg);
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_check_write*/
|
||||
addlong(mem_check_write - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
LOAD_EA();
|
||||
@@ -3959,18 +3802,9 @@ static void MEM_CHECK_WRITE(x86seg *seg)
|
||||
static void MEM_CHECK_WRITE_W(x86seg *seg)
|
||||
{
|
||||
CHECK_SEG_WRITE(seg);
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_check_write_w*/
|
||||
addlong(mem_check_write_w - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
LOAD_EA();
|
||||
@@ -3978,18 +3812,9 @@ static void MEM_CHECK_WRITE_W(x86seg *seg)
|
||||
static void MEM_CHECK_WRITE_L(x86seg *seg)
|
||||
{
|
||||
CHECK_SEG_WRITE(seg);
|
||||
if (((seg == &_ds) && (cpu_cur_status & CPU_STATUS_FLATDS)) ||
|
||||
((seg == &_ss) && (cpu_cur_status & CPU_STATUS_FLATSS)))
|
||||
{
|
||||
addbyte(0x31); /*XOR ESI, ESI*/
|
||||
addbyte(0xf6);
|
||||
}
|
||||
else
|
||||
{
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
}
|
||||
addbyte(0x8b); /*MOVL ESI, seg->base*/
|
||||
addbyte(0x05 | (REG_ESI << 3));
|
||||
addlong((uint32_t)&seg->base);
|
||||
addbyte(0xe8); /*CALL mem_check_write_l*/
|
||||
addlong(mem_check_write_l - (uint32_t)(&codeblock[block_current].data[block_pos + 4]));
|
||||
LOAD_EA();
|
||||
|
||||
Reference in New Issue
Block a user