{"id":14295,"date":"2023-12-03T10:11:36","date_gmt":"2023-12-03T10:11:36","guid":{"rendered":"https:\/\/blog.bachi.net\/?p=14295"},"modified":"2023-12-03T15:15:35","modified_gmt":"2023-12-03T15:15:35","slug":"udoo-bolt-bios-upgrade","status":"publish","type":"post","link":"https:\/\/blog.bachi.net\/?p=14295","title":{"rendered":"UDOO Bolt BIOS Upgrade"},"content":{"rendered":"<h3>Forum<\/h3>\n<p><a href=\"https:\/\/www.udoo.org\/forum\/threads\/failure-to-compile-firmware-1-0-8.34941\/\">Failure to compile firmware 1.0.8<\/a><\/p>\n<h3>github<\/h3>\n<p><a href=\"https:\/\/github.com\/flohoff\/amifldrv\">github.com\/flohoff\/amifldrv<\/a><br \/>\n<a href=\"https:\/\/github.com\/RomanHargrave\/amifldrv\">github.com\/RomanHargrave\/amifldrv<\/a><\/p>\n<h3>Extract from EtaAfuOemLnx64<\/h3>\n<p><a href=\"https:\/\/blog.bachi.net\/download\/amifldrv.tgz\">blog.bachi.net\/download\/amifldrv.tgz<\/a><\/p>\n<h3>Terminal<\/h3>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n# pwd\r\n\/home\/andreas\/Downloads\/UDOOBOLT_C40_UEFI_Update_rel108\/updater_andreas\r\n\r\n# uname -a\r\nLinux andreas-C40 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64 x86_64 x86_64 GNU\/Linux\r\n\r\n# dpkg -l | grep linux-headers\r\nii  linux-headers-5.15.0-76          5.15.0-76.83     all      Header files related to Linux kernel version 5.15.0\r\nii  linux-headers-5.15.0-76-generic  5.15.0-76.83     amd64   Linux kernel headers for version 5.15.0 on 64 bit x86 SMP\r\nii  linux-headers-5.15.0-89          5.15.0-89.99     all     Header files related to Linux kernel version 5.15.0\r\nii  linux-headers-5.15.0-89-generic  5.15.0-89.99     amd64   Linux kernel headers for version 5.15.0 on 64 bit x86 SMP\r\nii  linux-headers-6.1.0-4639-amd+    6.1.0-4639       amd64   Linux kernel headers for 6.1.0-4639-amd+ on amd64\r\nii  linux-headers-generic            5.15.0.89.86     amd64   Generic Linux kernel headers\r\n\r\n# ls -la\r\ntotal 8852\r\ndrwxrwxr-x 2 andreas andreas    4096 Dec  3 10:59 .\r\ndrwxrwxr-x 6 andreas andreas    4096 Dec  3 10:57 ..\r\n-rwxrwxr-x 1 andreas andreas     450 Jul 17  2018 bios_updater_x64.sh\r\n-rw-rw-r-- 1 andreas andreas 8388608 Apr 24  2020 C4000000.108\r\n-rwxrwxr-x 1 andreas andreas  657344 Jun 29  2020 EtaAfuOemLnx64\r\n-rw-rw-r-- 1 andreas andreas     999 Apr 24  2020 History.txt\r\n\r\n# .\/bios_updater_x64.sh C4000000.108 \r\n\r\nGHO BIOS updater - Linux 64 bit Version\r\n\r\nDriverSource\/amifldrv.c:128:9: error: \u2018struct file_operations\u2019 has no member named \u2018ioctl\u2019\r\n  128 |         ioctl                   : amifldrv_ioctl,\r\n      |         ^~~~~\r\nDriverSource\/amifldrv.c:128:35: error: positional initialization of field in \u2018struct\u2019 declared with \u2018designated_init\u2019 attribute &#x5B;-Werror=designated-init]\r\n  128 |         ioctl                   : amifldrv_ioctl,\r\n      |                                   ^~~~~~~~~~~~~~\r\nDriverSource\/amifldrv.c:128:35: note: (near initialization for \u2018amifldrv_fops\u2019)\r\nDriverSource\/amifldrv.c:128:35: error: initialization of \u2018int (*)(struct file *, loff_t,  loff_t,  int)\u2019 {aka \u2018int (*)(struct file *, long long int,  long long int,  int)\u2019} from incompatible pointer type \u2018int (*)(struct inode *, struct file *, unsigned int,  long unsigned int)\u2019 &#x5B;-Werror=incompatible-pointer-types]\r\nDriverSource\/amifldrv.c:128:35: note: (near initialization for \u2018amifldrv_fops.fsync\u2019)\r\ncc1: some warnings being treated as errors\r\nmake&#x5B;2]: *** &#x5B;scripts\/Makefile.build:297: DriverSource\/amifldrv.o] Error 1\r\nmake&#x5B;1]: *** &#x5B;Makefile:1909: DriverSource] Error 2\r\nmv: cannot stat 'amifldrv_mod.ko': No such file or directory\r\nmake: *** &#x5B;Makefile:20: default] Error 1\r\n+---------------------------------------------------------------------------+\r\n|           AMI Firmware Update Utility Manufacture v5.12.05.2125           |\r\n|                         for SECO S.p.A. 64 bits                           |\r\n|      Copyright (c) 1985-2020, American Megatrends International LLC.      |\r\n|         All rights reserved. Subject to AMI licensing agreement.          |\r\n+---------------------------------------------------------------------------+\r\n Reading flash ...................... Done                \r\n - System Secure Flash .............. Enabled\r\n - FFS Checksums .................... Pass\r\n - Check RomLayout .................. Pass\r\n Loading File To Verify Memory ...... Done                \r\n Erasing Main Block ................. Done                \r\n Updating Main Block ................ Done                \r\n Verifying Main Block ............... Done                \r\n Erasing Boot Block ................. Done                \r\n Updating Boot Block ................ Done                \r\n Verifying Boot Block ............... Done                \r\n Erasing NVRAM Block ................ Done                \r\n Updating NVRAM Block ............... Done                \r\n Verifying NVRAM Block .............. Done                \r\n Erasing NCB Block .................. Done                \r\n Updating NCB Block ................. Done                \r\n Verifying NCB Block ................ Done                \r\n Erasing RomHole Block .............. Done                \r\n Updating RomHole Block ............. Done                \r\n Verifying RomHole Block ............ Done                \r\n\r\n Process completed.\r\n\r\nPlease reboot the system\r\n\r\n# sudo dmidecode -t bios\r\n&#x5B;sudo] password for andreas:         \r\n# dmidecode 3.3\r\nGetting SMBIOS data from sysfs.\r\nSMBIOS 3.1.1 present.\r\n\r\nHandle 0x0000, DMI type 0, 26 bytes\r\nBIOS Information\r\n\tVendor: American Megatrends Inc.\r\n\tVersion: 1.04 R.C. 2\r\n\tRelease Date: 07\/10\/2019\r\n\tAddress: 0xF0000\r\n\tRuntime Size: 64 kB\r\n\tROM Size: 8 MB\r\n\tCharacteristics:\r\n\t\tPCI is supported\r\n\t\tBIOS is upgradeable\r\n\t\tBIOS shadowing is allowed\r\n\t\tBoot from CD is supported\r\n\t\tSelectable boot is supported\r\n\t\tBIOS ROM is socketed\r\n\t\tEDD is supported\r\n\t\t5.25&quot;\/1.2 MB floppy services are supported (int 13h)\r\n\t\t3.5&quot;\/720 kB floppy services are supported (int 13h)\r\n\t\t3.5&quot;\/2.88 MB floppy services are supported (int 13h)\r\n\t\tPrint screen service is supported (int 5h)\r\n\t\tSerial services are supported (int 14h)\r\n\t\tPrinter services are supported (int 17h)\r\n\t\tACPI is supported\r\n\t\tUSB legacy is supported\r\n\t\tBIOS boot specification is supported\r\n\t\tTargeted content distribution is supported\r\n\t\tUEFI is supported\r\n\tBIOS Revision: 5.13\r\n\tFirmware Revision: 0.6\r\n\r\nHandle 0x0019, DMI type 13, 22 bytes\r\nBIOS Language Information\r\n\tLanguage Description Format: Long\r\n\tInstallable Languages: 1\r\n\t\ten|US|iso8859-1\r\n\r\n<\/pre>\n<h3>Disassembly<\/h3>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n# strings EtaAfuOemLnx64 | grep DriverSource\r\nDriverSource\r\nrm -rf DriverSource\r\n\r\n\r\n# strings EtaAfuOemLnx64 | grep amifldrv\r\n.\/amifldrv_mod.o\r\n.\/amifldrv_mod.o\r\namifldrv.tgz\r\ntar --no-same-owner -zxvf amifldrv.tgz\r\nrm -f amifldrv.tgz\r\n.\/amifldrv_mod\r\ngrep amifldrv \/proc\/devices\r\namifldrv\r\n&#x5B;...]\r\n\r\n\r\n# strings EtaAfuOemLnx64 | grep http\r\n# strings EtaAfuOemLnx64 | grep -i http\r\n# strings EtaAfuOemLnx64 | grep -i tgz\r\nD$(.tgz\r\namifldrv.tgz\r\ntar --no-same-owner -zxvf amifldrv.tgz &gt; \/dev\/null\r\nrm -f amifldrv.tgz\r\n\r\n\r\n# strings EtaAfuOemLnx64 | grep -i ftp\r\nEFI_TFTP_ERROR\r\n\r\n\r\n# strings EtaAfuOemLnx64 | grep -i wget\r\n# strings EtaAfuOemLnx64 | grep -i curl\r\n# strings EtaAfuOemLnx64 | grep -i amifldrv_ioctl\r\n\r\n strings EtaAfuOemLnx64 | grep -i make\r\ngnu_dev_makedev\r\n\/makedrvH\r\n\/MAKEDRV\r\n|   \/MAKEDRV - Make BGTLNX driver with user defined environment.            |\r\n\/makedrv\r\n|%*s - Make AFULNX driver with user defined environment.            |\r\n\/makedrv\r\nError: Unable to make kernel driver.\r\n\/makedrv\r\n - Make AMI Linux driver .... \r\nmake &gt; \/dev\/null\r\nmake \r\nmake gendrv \r\n\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\r\nundefined8 amifldrv_0(void)\r\n\r\n{\r\n  bool bVar1;\r\n  char cVar2;\r\n  int iVar3;\r\n  uint __major;\r\n  undefined8 uVar4;\r\n  ulonglong uVar5;\r\n  long in_FS_OFFSET;\r\n  undefined4 local_28;\r\n  undefined4 local_24;\r\n  undefined2 local_20;\r\n  undefined local_1e;\r\n  long local_10;\r\n  \r\n  local_10 = *(long *)(in_FS_OFFSET + 0x28);\r\n  local_28 = 0x7665642f;\r\n  local_24 = 0x696d612f;\r\n  local_20 = 0x6c66;\r\n  local_1e = 0;\r\n  iVar3 = access(&quot;.\/amifldrv_mod.o&quot;,0);\r\n  if (iVar3 == 0) {\r\n    FUN_00459b7e(&quot;.\/amifldrv_mod&quot;,&quot;.\/amifldrv_mod.o&quot;);\r\n  }\r\n  else {\r\n    cVar2 = amifldrv_1();\r\n    if (cVar2 == '&#92;&#48;') {\r\nLAB_004565a4:\r\n      bVar1 = true;\r\n    }\r\n    else {\r\n      cVar2 = amifldrv_build();\r\n      if (cVar2 == '&#92;&#48;') goto LAB_004565a4;\r\n      bVar1 = false;\r\n    }\r\n    if (bVar1) {\r\n      uVar4 = 0xf;\r\n      goto LAB_004566a2;\r\n    }\r\n  }\r\n  system(&quot;insmod .\/amifldrv_mod &gt; \/dev\/null&quot;);\r\n  __major = FUN_00456100();\r\n  if (__major == 0) {\r\n    uVar4 = 0x10;\r\n  }\r\n  else {\r\n    uVar5 = gnu_dev_makedev(__major,0);\r\n    iVar3 = FUN_0046d500(&amp;local_28,0x21b6,uVar5);\r\n    if (iVar3 == 0) {\r\n      DAT_0069e330 = open((char *)&amp;local_28,2);\r\n      if (DAT_0069e330 == -1) {\r\n        remove((char *)&amp;local_28);\r\n        system(&quot;rmmod amifldrv_mod&quot;);\r\n        uVar4 = 0x10;\r\n      }\r\n      else {\r\n        cVar2 = FUN_004561c0();\r\n        if (cVar2 == '&#92;&#48;') {\r\n          FUN_004564f2();\r\n          DAT_0069e330 = -1;\r\n          uVar4 = 0x10;\r\n        }\r\n        else {\r\n          uVar4 = 0;\r\n        }\r\n      }\r\n    }\r\n    else {\r\n      remove((char *)&amp;local_28);\r\n      system(&quot;rmmod amifldrv_mod&quot;);\r\n      uVar4 = 0x10;\r\n    }\r\n  }\r\nLAB_004566a2:\r\n  if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {\r\n                    \/* WARNING: Subroutine does not return *\/\r\n    __stack_chk_fail();\r\n  }\r\n  return uVar4;\r\n}\r\n\r\n\r\n\r\n\r\nundefined8 amifldrv_1(void)\r\n\r\n{\r\n  bool bVar1;\r\n  FILE *pFVar2;\r\n  undefined8 uVar3;\r\n  long in_FS_OFFSET;\r\n  undefined4 local_38;\r\n  undefined local_34;\r\n  undefined4 local_28;\r\n  undefined4 local_24;\r\n  undefined4 local_20;\r\n  undefined local_1c;\r\n  long local_10;\r\n  \r\n  local_10 = *(long *)(in_FS_OFFSET + 0x28);\r\n  local_38 = 0x44464140;\r\n  local_34 = 0;\r\n  local_28 = 0x66696d61;\r\n  local_24 = 0x7672646c;\r\n  local_20 = 0x7a67742e;\r\n  local_1c = 0;\r\n  bVar1 = amifldrv_start(&amp;local_38,&amp;local_28,'\\x01');\r\n  if (!bVar1) {\r\n    if (DAT_0069faf0 == 0) {\r\n      uVar3 = 0;\r\n      goto LAB_00456081;\r\n    }\r\n    pFVar2 = (FILE *)amifldrv_fopen();\r\n    amifldrv_seek_write(pFVar2,0,DAT_0069faf0,&amp;DAT_0069e760);\r\n    amifldrv_fclose();\r\n  }\r\n  system(&quot;tar --no-same-owner -zxvf amifldrv.tgz &gt; \/dev\/null&quot;);\r\n  system(&quot;rm -f amifldrv.tgz&quot;);\r\n  uVar3 = 1;\r\nLAB_00456081:\r\n  if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {\r\n                    \/* WARNING: Subroutine does not return *\/\r\n    __stack_chk_fail();\r\n  }\r\n  return uVar3;\r\n}\r\n\r\n\r\n\r\n\r\nundefined8 amifldrv_build(void)\r\n\r\n{\r\n  int iVar1;\r\n  undefined8 uVar2;\r\n  \r\n  iVar1 = chdir(&quot;DriverSource&quot;);\r\n  if (iVar1 == 0) {\r\n    system(&quot;make &gt; \/dev\/null&quot;);\r\n    chdir(&quot;..\/&quot;);\r\n    system(&quot;rm -rf DriverSource&quot;);\r\n    iVar1 = access(&quot;.\/amifldrv_mod&quot;,0);\r\n    if (iVar1 == 0) {\r\n      uVar2 = 1;\r\n    }\r\n    else {\r\n      uVar2 = 0;\r\n    }\r\n  }\r\n  else {\r\n    uVar2 = 0;\r\n  }\r\n  return uVar2;\r\n}\r\n\r\n\r\n<\/pre>\n<pre class=\"brush: python; title: extract.py; notranslate\" title=\"extract.py\">\r\nfp_read = open(&quot;EtaAfuOemLnx64&quot;, &quot;rb&quot;)\r\nfp_write = open(&quot;amifldrv.tgz&quot;, &quot;wb&quot;)\r\n\r\nfp_read.seek(0x9E760)\r\nsize = 0x9FAEF - 0x9E760\r\nextracted_bytes = fp_read.read(size)\r\n\r\nfp_write.write(extracted_bytes)\r\n\r\nfp_write.close()\r\nfp_read.close()\r\n<\/pre>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n$ tar xzf amifldrv.tgz \r\n$ ls -la DriverSource\/\r\ntotal 60\r\ndrwxrwxr-x 2 andreas andreas 4096 Mar  9  2020 .\r\ndrwxrwxr-x 3 andreas andreas 4096 Dec  3 14:19 ..\r\n-rwxrwxr-x 1 andreas andreas 4953 Jul 18  2019 amifldrv.c\r\n-rwxrwxr-x 1 andreas andreas 3380 Apr 12  2019 amifldrvdefs.h\r\n-rwxrwxr-x 1 andreas andreas 3757 Apr 12  2019 amifldrv.h\r\n-rwxrwxr-x 1 andreas andreas 5338 Jun 20  2018 amiiodrv.c\r\n-rwxrwxr-x 1 andreas andreas 6471 Jun 20  2018 amimemdrv.c\r\n-rwxrwxr-x 1 andreas andreas 2840 May 16  2019 amiother.c\r\n-rwxrwxr-x 1 andreas andreas  313 Feb 27  2019 DriverSource.cif\r\n-rwxrwxr-x 1 andreas andreas  189 Apr 24  2018 DriverSource.sdl\r\n-rwxrwxr-x 1 andreas andreas 1568 Apr 23  2019 Makefile\r\n-rwxrwxr-x 1 andreas andreas  564 Apr 23  2019 Makefile.Shipped\r\n<\/pre>\n<h3>amifldrv<\/h3>\n<pre class=\"brush: cpp; title: amifldrv.c; notranslate\" title=\"amifldrv.c\">\r\nstatic struct file_operations amifldrv_fops =\r\n{\r\n\towner\t\t\t: THIS_MODULE,\r\n\topen\t\t\t: amifldrv_open,\r\n\trelease\t\t\t: amifldrv_release,\r\n#if defined(HAVE_UNLOCKED_IOCTL)\r\n\tunlocked_ioctl\t: amifldrv_unlocked_ioctl,\r\n#else\r\n\tioctl\t\t\t: amifldrv_ioctl,\r\n#endif\r\n\tmmap\t\t\t: amifldrv_mmap\r\n};\r\n<\/pre>\n<h3>Linux Kernel 5.15<\/h3>\n<p><a href=\"https:\/\/elixir.bootlin.com\/linux\/v5.5.15\/source\/include\/linux\/fs.h#L1822\">inux\/v5.5.15\/source\/include\/linux\/fs.h<\/a><\/p>\n<pre class=\"brush: cpp; title: include\/linux\/fs.h; notranslate\" title=\"include\/linux\/fs.h\">\r\nstruct file_operations {\r\n\tstruct module *owner;\r\n\tloff_t (*llseek) (struct file *, loff_t, int);\r\n\tssize_t (*read) (struct file *, char __user *, size_t, loff_t *);\r\n\tssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);\r\n\tssize_t (*read_iter) (struct kiocb *, struct iov_iter *);\r\n\tssize_t (*write_iter) (struct kiocb *, struct iov_iter *);\r\n\tint (*iopoll)(struct kiocb *kiocb, bool spin);\r\n\tint (*iterate) (struct file *, struct dir_context *);\r\n\tint (*iterate_shared) (struct file *, struct dir_context *);\r\n\t__poll_t (*poll) (struct file *, struct poll_table_struct *);\r\n\tlong (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);\r\n\tlong (*compat_ioctl) (struct file *, unsigned int, unsigned long);\r\n\tint (*mmap) (struct file *, struct vm_area_struct *);\r\n\tunsigned long mmap_supported_flags;\r\n\tint (*open) (struct inode *, struct file *);\r\n\tint (*flush) (struct file *, fl_owner_t id);\r\n\tint (*release) (struct inode *, struct file *);\r\n\tint (*fsync) (struct file *, loff_t, loff_t, int datasync);\r\n\tint (*fasync) (int, struct file *, int);\r\n\tint (*lock) (struct file *, int, struct file_lock *);\r\n\tssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);\r\n\tunsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);\r\n\tint (*check_flags)(int);\r\n\tint (*flock) (struct file *, int, struct file_lock *);\r\n\tssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);\r\n\tssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);\r\n\tint (*setlease)(struct file *, long, struct file_lock **, void **);\r\n\tlong (*fallocate)(struct file *file, int mode, loff_t offset,\r\n\t\t\t  loff_t len);\r\n\tvoid (*show_fdinfo)(struct seq_file *m, struct file *f);\r\n#ifndef CONFIG_MMU\r\n\tunsigned (*mmap_capabilities)(struct file *);\r\n#endif\r\n\tssize_t (*copy_file_range)(struct file *, loff_t, struct file *,\r\n\t\t\tloff_t, size_t, unsigned int);\r\n\tloff_t (*remap_file_range)(struct file *file_in, loff_t pos_in,\r\n\t\t\t\t   struct file *file_out, loff_t pos_out,\r\n\t\t\t\t   loff_t len, unsigned int remap_flags);\r\n\tint (*fadvise)(struct file *, loff_t, loff_t, int);\r\n} __randomize_layout;\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Forum Failure to compile firmware 1.0.8 github github.com\/flohoff\/amifldrv github.com\/RomanHargrave\/amifldrv Extract from EtaAfuOemLnx64 blog.bachi.net\/download\/amifldrv.tgz Terminal # pwd \/home\/andreas\/Downloads\/UDOOBOLT_C40_UEFI_Update_rel108\/updater_andreas # uname -a Linux andreas-C40 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64 x86_64 x86_64 GNU\/Linux # dpkg -l | grep linux-headers ii linux-headers-5.15.0-76 5.15.0-76.83 all Header files related to Linux kernel version 5.15.0 ii linux-headers-5.15.0-76-generic [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-14295","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/14295","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=14295"}],"version-history":[{"count":18,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/14295\/revisions"}],"predecessor-version":[{"id":14313,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=\/wp\/v2\/posts\/14295\/revisions\/14313"}],"wp:attachment":[{"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.bachi.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}