From nobody Mon Jul 24 20:53:15 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4R8snR4t5cz4pSg9; Mon, 24 Jul 2023 20:53:15 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4R8snR3vvvz3l14; Mon, 24 Jul 2023 20:53:15 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690231995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=dsRro2LHlHHM67dnFNfd8TBrEAva893V+wmr9O15ZGQ=; b=WujmVUDwrBs5MkMqVu+KwZHreT54lHVielMBdeWx4Pn08WrFEctgDs4970MAhUSm2a+r1n cmKe+k7SfGSwzdymdATBPlcl3CKjObvp8dsbo3+0Jw86c8LXsHgrWecL91iFNLPEn968WR BYmHNLnBe9vM/7Gj9yLPqGSVFWNgqgK3F499SIYShRD/sdi4e547kk7R17imZRNw5qLzck FnplWwuKfvKzvmaFOAag/z8ywQPixnLVVR6r82VT4mIXpR3cWaCP8/E5L1LYS5fflKIkOH x/ZG94SlJnSJfJYticduFGPmRYmdv+GTH7FRYANHuaIePwGl3pctT9q9RMVJng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1690231995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=dsRro2LHlHHM67dnFNfd8TBrEAva893V+wmr9O15ZGQ=; b=iSK1amZtuvgHqxoBFlcgXPhEUOWSKGxlNa4K6avihLZDwDHc+VT8XRRNoJ6RrSOqwsHmth VOAnpNVdS1s8qjcOH0MghYj0hkN+qchgnyKAILSLWvI3rKzNtjSBbXdBhCDpM0aWbmmz0X +TBbq/VwF68VgecSDw4C33hlh/zXwxylI0ID5qwJHdOIpLR/rkG4lUijbDAlbkh/nFexVw C912V3w/oY8+NMNwE4UY39ZFUMWktLNU7Mq6l7kazWDKOL5pmUspa/KLPpAlE3ExFk8BEY UVgqLDTYBTNZPGB7ASr/3vX4li/jlg2hcZhGX5iF+2apInaISf2oITOVdxmHgg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1690231995; a=rsa-sha256; cv=none; b=meCAT73PxMfij4F8pof3voSmC7jcs1plhOhvHCTWhRvclF5dtB/w6WtQSXPQToI0/lgPib kcrikGTXkJyIXLs2SDqCM7LpkSzxvMoc1vlWN/Rmom9ZTZAZJFuoFr3yibvGXibuObEkee xEtA3bpaAk/tOgL7CNZJc9k0Ibjs97EcPSjFFncRFjPTSADI8PGjuX1Nn4d7eqi3hmn8pj 2oBsEtA8SMVNIZWxaWq2TLz3qcRPGglr/ZnCTqF7My3tnWtaBufdI6HnvPREqtFwd8/8of iZkXSmT3OnER10moerIRLNwaSlmdwqGWYPS6mA0j7a0oTv4aQfJkCex8ecKe+A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4R8snR2QVHzY2F; Mon, 24 Jul 2023 20:53:15 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 36OKrF3r092365; Mon, 24 Jul 2023 20:53:15 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 36OKrFjG092364; Mon, 24 Jul 2023 20:53:15 GMT (envelope-from git) Date: Mon, 24 Jul 2023 20:53:15 GMT Message-Id: <202307242053.36OKrFjG092364@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mitchell Horne Subject: git: 4a07c778632b - main - arm64/disassem.c: add extended register instruction definitions List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mhorne X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4a07c778632bddb86a82f3e1fe144d889dae69c5 Auto-Submitted: auto-generated The branch main has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=4a07c778632bddb86a82f3e1fe144d889dae69c5 commit 4a07c778632bddb86a82f3e1fe144d889dae69c5 Author: Mykola Hohsadze AuthorDate: 2023-07-24 20:49:24 +0000 Commit: Mitchell Horne CommitDate: 2023-07-24 20:51:11 +0000 arm64/disassem.c: add extended register instruction definitions Add disassembly support for the following extended register instructions: add, adds, sub, subs, cmp, cmn. Reviewed by: mhorne MFC after: 1 week Pull Request: https://reviews.freebsd.org/D40967 --- sys/arm64/arm64/disassem.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/sys/arm64/arm64/disassem.c b/sys/arm64/arm64/disassem.c index c1e38266a2e0..a86fef1d96a6 100644 --- a/sys/arm64/arm64/disassem.c +++ b/sys/arm64/arm64/disassem.c @@ -73,6 +73,11 @@ static const char *shift_2[] = { "lsl", "lsr", "asr", "ror" }; +static const char *extend_types[] = { + "uxtb", "uxth", "uxtw", "uxtx", + "sxtb", "sxth", "sxtw", "sxtx", +}; + /* * Structure representing single token (operand) inside instruction. * name - name of operand @@ -107,6 +112,12 @@ enum arm64_format_type { /* OP , #imm SF32/64 */ TYPE_03, + + /* + * OP , , {, { # } } + * OP , , {, { # } } + */ + TYPE_04, }; /* @@ -260,6 +271,18 @@ static struct arm64_insn arm64_i[] = { TYPE_01, OP_SHIFT_ROR }, /* eon shifted register */ { "eor", "SF(1)|1001010|SHIFT(2)|0|RM(5)|IMM(6)|RN(5)|RD(5)", TYPE_01, OP_SHIFT_ROR }, /* eor shifted register */ + { "add", "SF(1)|0001011001|RM(5)|OPTION(3)|IMM(3)|RN(5)|RD(5)", + TYPE_04, OP_RD_SP }, /* add extended register */ + { "cmn", "SF(1)|0101011001|RM(5)|OPTION(3)|IMM(3)|RN(5)|11111", + TYPE_04, 0 }, /* cmn extended register */ + { "adds", "SF(1)|0101011001|RM(5)|OPTION(3)|IMM(3)|RN(5)|RD(5)", + TYPE_04, 0 }, /* adds extended register */ + { "sub", "SF(1)|1001011001|RM(5)|OPTION(3)|IMM(3)|RN(5)|RD(5)", + TYPE_04, OP_RD_SP }, /* sub extended register */ + { "cmp", "SF(1)|1101011001|RM(5)|OPTION(3)|IMM(3)|RN(5)|11111", + TYPE_04, 0 }, /* cmp extended register */ + { "subs", "SF(1)|1101011001|RM(5)|OPTION(3)|IMM(3)|RN(5)|RD(5)", + TYPE_04, 0 }, /* subs extended register */ { NULL, NULL } }; @@ -408,6 +431,27 @@ arm64_disasm_read_token_sign_ext(struct arm64_insn *insn, u_int opcode, return (EINVAL); } +static const char * +arm64_disasm_reg_extend(int sf, int option, int rd, int rn, int amount) +{ + bool is_sp, lsl_preferred_uxtw, lsl_preferred_uxtx, lsl_preferred; + + is_sp = rd == 31 || rn == 31; + lsl_preferred_uxtw = sf == 0 && option == 2; + lsl_preferred_uxtx = sf == 1 && option == 3; + lsl_preferred = is_sp && (lsl_preferred_uxtw || lsl_preferred_uxtx); + + /* + * LSL may be omitted when is 0. + * In all other cases is required. + */ + if (lsl_preferred && amount == 0) + return (NULL); + if (lsl_preferred) + return ("lsl"); + return (extend_types[option]); +} + static const char * arm64_w_reg(int num, int wsp) { @@ -432,6 +476,18 @@ arm64_reg(int b64, int num, int sp) return (arm64_w_reg(num, sp)); } +/* + * Decodes OPTION(3) to get register or + * for extended register instruction. + */ +static const char * +arm64_disasm_reg_width(int option, int reg) +{ + if (option == 3 || option == 7) + return (arm64_x_reg(reg, 0)); + return (arm64_w_reg(reg, 0)); +} + vm_offset_t disasm(const struct disasm_interface *di, vm_offset_t loc, int altfmt) { @@ -451,10 +507,13 @@ disasm(const struct disasm_interface *di, vm_offset_t loc, int altfmt) /* Indicate if shift type ror is supported */ bool has_shift_ror; + const char *extend; + /* Initialize defaults, all are 0 except SF indicating 64bit access */ shift = rd = rm = rn = imm = idx = option = amount = scale = 0; sign_ext = 0; sf = 1; + extend = NULL; matchp = 0; insn = di->di_readword(loc); @@ -669,6 +728,37 @@ disasm(const struct disasm_interface *di, vm_offset_t loc, int altfmt) di->di_printf("#%d", imm); break; + + case TYPE_04: + /* + * OP , , {, { # } } + * OP , , {, { # } } + */ + + arm64_disasm_read_token(i_ptr, insn, "RN", &rn); + arm64_disasm_read_token(i_ptr, insn, "RM", &rm); + arm64_disasm_read_token(i_ptr, insn, "OPTION", &option); + + rd_absent = arm64_disasm_read_token(i_ptr, insn, "RD", &rd); + extend = arm64_disasm_reg_extend(sf, option, rd, rn, imm); + + di->di_printf("%s\t", i_ptr->name); + + if (!rd_absent) + di->di_printf("%s, ", arm64_reg(sf, rd, rd_sp)); + + di->di_printf("%s, ", arm64_reg(sf, rn, 1)); + + if (sf != 0) + di->di_printf("%s", + arm64_disasm_reg_width(option, rm)); + else + di->di_printf("%s", arm64_w_reg(rm, 0)); + + if (extend != NULL) + di->di_printf(", %s #%d", extend, imm); + + break; default: goto undefined; }