From patchwork Tue Sep 5 01:19:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 809885 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3xmTSZ43DRz9s7f for ; Tue, 5 Sep 2017 11:21:18 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 0F285C21F2F; Tue, 5 Sep 2017 01:20:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 30917C21F4E; Tue, 5 Sep 2017 01:20:54 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 62215C21F4A; Tue, 5 Sep 2017 01:20:43 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lists.denx.de (Postfix) with ESMTPS id 53796C21DA0 for ; Tue, 5 Sep 2017 01:20:40 +0000 (UTC) Received: from laptop1.fritz.box ([94.197.121.125]) by mail.gmx.com (mrgmx001 [212.227.17.184]) with ESMTPSA (Nemesis) id 0LiTm8-1dCOrj1aCS-00cesU; Tue, 05 Sep 2017 03:20:31 +0200 From: Heinrich Schuchardt To: Alexander Graf Date: Tue, 5 Sep 2017 03:19:37 +0200 Message-Id: <20170905011939.5794-2-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170905011939.5794-1-xypron.glpk@gmx.de> References: <20170905011939.5794-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:DSrBC8PJkz2cgzGndRFWk5tULb1RNY7++TLAVZvu5yEMH8yFjW8 +FEKb8IsdqSS41F7mNrJxGCQY2iALCeGCT2+qzJOBg3H7JetEwvpttONz6KvmfjntRq8TOI uyj0ZumuCOLoj4HQxvwMZP9x3geMla+tTQtm0AAia0uh1pkfgNGOQ2426HmAAkP38yQdpc2 jnDMTe1/NSDMBhmOkzStQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:nHSIx4zoGd0=:8kvqA2NZXArpichC59No5x CNgCB29mMg2yxt3ha15KXsZJ2wMXVnChur+MNyr+yKRbCSEapXNDzzSWPoMAErfcVp4ktny0/ vW92GjppsgLKydpoRwF1EN01t6SOVuCoI+1ZKqjUboTXordPh8IpvKn5KxI1LKVbdZJkmYwbF 5gFBzej6gofGaKi+9B4/p8+gP84QX9aouLKJOMSCl68oZjgddX0lbtBCPb2XcBVwBMEmZs5iM zSt82VM0Ag7ug0V9WLsy5SSTQ3ifm8F9qVY+kHPQm/ziSd/5+gja476/RPUqP3ccUzUpu+Nd8 9ec1FqnckQdDRfL2zdeFokJcvH1C8V2kZSPSuFw5BNDaOKwVlPDsZliTb4mDMyKB4bpYmv206 5CTdxZoF/Ye4LYdcdPdML7CbY1vL+bOHvwU1kVoZCJ9d4GRneFpr3exBY6TjLlY5zsuYHAegt KnZ+cLeAyEYoNYBDXxW6lmjvahmp7WL1XspvyLk31N2L0trHZDmRcox4f7PQlWRkbW5ecYDkS yV0YcJyB1PoDaaIzBPij5U947X+JTUlum3r3jW5ro4T51LXpOPfHxa9R1EDdzDAifYS1MzhmH +ENrKoysp1vPHyZV0Xg2j3YbkMebehJ2plu1z42xmPJX+qsXXCmzAtvoycXpWN5GDPTUcUKM9 1fCC8wja0vIvS24smdNXv5HVID7ub/NbID97dPmVLPPaDJmDLBtsRPWqEUh6m/g0Nr8XheXa0 fTCG8/fzhZR97iyYqiX+Y4cD3sR7PBEq7QJjpn/YpW1Ab8cs3BVGmGkSPhqpbBHSZ7lnGP4Zn u8Aj8Le6N0Sk+9v8kFRcuUkQNNRXxaFSzC3ok6bqtg8rWI6e0w= Cc: Mark Kettenis , Heinrich Schuchardt , Andy Shevchenko , u-boot@lists.denx.de Subject: [U-Boot] [PATCH 1/3] efi_loader: rename __efi_hello_world_* X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" In scripts/Makefile.lib we build section including helloworld.efi. This allows to load the EFI binary with command 'bootefi hello'. scripts/Makefile.lib contains explicit references to strings containing helloworld and hello_world. This makes it impossible to generalize the coding to accomodate additional built in EFI binaries. Let us rename the variables __efi_hello_world_* to __efi_helloworld_*. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass --- cmd/bootefi.c | 4 ++-- include/asm-generic/sections.h | 4 ++-- scripts/Makefile.lib | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index a3768158a2..c5bfab1147 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -298,14 +298,14 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return CMD_RET_USAGE; #ifdef CONFIG_CMD_BOOTEFI_HELLO if (!strcmp(argv[1], "hello")) { - ulong size = __efi_hello_world_end - __efi_hello_world_begin; + ulong size = __efi_helloworld_end - __efi_helloworld_begin; saddr = env_get("loadaddr"); if (saddr) addr = simple_strtoul(saddr, NULL, 16); else addr = CONFIG_SYS_LOAD_ADDR; - memcpy((char *)addr, __efi_hello_world_begin, size); + memcpy((char *)addr, __efi_helloworld_begin, size); } else #endif { diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h index daf021b647..b6535705a5 100644 --- a/include/asm-generic/sections.h +++ b/include/asm-generic/sections.h @@ -22,8 +22,8 @@ extern char __kprobes_text_start[], __kprobes_text_end[]; extern char __entry_text_start[], __entry_text_end[]; extern char __initdata_begin[], __initdata_end[]; extern char __start_rodata[], __end_rodata[]; -extern char __efi_hello_world_begin[]; -extern char __efi_hello_world_end[]; +extern char __efi_helloworld_begin[]; +extern char __efi_helloworld_end[]; /* Start and end of .ctors section - used for constructor calls. */ extern char __ctors_start[], __ctors_end[]; diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 7f97e8ebf3..164c234b4c 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -350,11 +350,11 @@ cmd_S_efi= \ ( \ echo '.section .rodata.efi.init,"a"'; \ echo '.balign 16'; \ - echo '.global __efi_hello_world_begin'; \ - echo '__efi_hello_world_begin:'; \ + echo '.global __efi_helloworld_begin'; \ + echo '__efi_helloworld_begin:'; \ echo '.incbin "$<" '; \ - echo '__efi_hello_world_end:'; \ - echo '.global __efi_hello_world_end'; \ + echo '__efi_helloworld_end:'; \ + echo '.global __efi_helloworld_end'; \ echo '.balign 16'; \ ) > $@ From patchwork Tue Sep 5 01:19:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 809887 X-Patchwork-Delegate: agraf@suse.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3xmTTL6TbFz9s7f for ; Tue, 5 Sep 2017 11:21:58 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id A606BC21E52; Tue, 5 Sep 2017 01:21:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 045A1C21F4A; Tue, 5 Sep 2017 01:20:55 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A241EC21F1F; Tue, 5 Sep 2017 01:20:43 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lists.denx.de (Postfix) with ESMTPS id 306CDC21F12 for ; Tue, 5 Sep 2017 01:20:40 +0000 (UTC) Received: from laptop1.fritz.box ([94.197.121.125]) by mail.gmx.com (mrgmx001 [212.227.17.184]) with ESMTPSA (Nemesis) id 0MJSx9-1dn6T40JiN-0032g9; Tue, 05 Sep 2017 03:20:33 +0200 From: Heinrich Schuchardt To: Alexander Graf Date: Tue, 5 Sep 2017 03:19:38 +0200 Message-Id: <20170905011939.5794-3-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170905011939.5794-1-xypron.glpk@gmx.de> References: <20170905011939.5794-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:LczoANj9KgH9u+oY7Gn2TEpXn6qS1cyyNBswc5hhh9q+9kvR4Ib AVtSQQ2LizMlymFNYDRKYL7UyxPGyu5eRPzwkttdocw7JivnQj34k8/kUn607UnR/9/LJxV oJ5iIJOliGpbo17y/L0Dtr07bIld2fs5lFm/IDOW4mQtbt9uORl7NmU3GuN///GzDUNGoBP xYRB0Cnqb+FEnZB6UvGEw== X-UI-Out-Filterresults: notjunk:1; V01:K0:Xy9l7ldCWa8=:tCGCynoNgJ699ldj9xuhOR osuw8S9RnZlNW4UI77qdz7wc2XGIwwBJt4wNuShV52auj51Zlz/6Ak2hl7nkE4eJYFh0pGp93 1AAdCioy1GMtxZHx2w6Sm3AKadvmXjZtUjOe+aynr7H/s+daGf5BjBUgzZHJ1GYAjqnc95BPI CBOq6+nJcA9anRqgtTkiRrYY64QupIMaBHr/kMv9pumUQMIXbr61AR/T3ZRos7WzG2ttf/z5x Jv8xGLxi8oUI+tNcUNENm49H6ABcdGIQjkAArm+qvj6SZ4k+/SkJYCmkVjEoYa68BulW582ad CVD5pIq2V4Aub1620UcfF5x/FZ3uPc7kIhCOXPXAWzC7x7P2B1B9lULorl6wJ4reArZtNnF7Q 0PX4roM1XKmNzKwjgSyfMhQhPAduLSFZzY69poEKfXpZLl0UWxHGo7N6zlLkww6MEQLt6lGBH gjppKbjpnRUdMk46n6VKOYX7ylrFrEml9YcPVKlzFu2OBtlK0xnc/Cye3xiP0oBUe89b2UKPf dm8Vwlnve6L6VlZ0DRgAI5SGWZ8dKcrbCCwFHq1MlsJc5XvLroTF1a0vqH3PeMa5BMM+W39Oi rC/DFDHMeqsYA4iIsEuz4wUInFIhIyA8ZRKnesxPPE5AjMaDrtwPqBVcN08d0R+ZAdsoqg6rZ YuOQWCxBqVj0DdPT/9S4GHpvuKgdEC2B3W8LHSAMIZ2Feb/8ZYZEsSDl/enBcRYpZJ4txYYQa 95WfYEUEApghM+MaAVgfEi/iw8Ewtprtu1glNE7Mex9Pq7LOGdjg5GXNMwItGtgQtUtI2qasp QXWpVbpG+jeayHBJ9HNVYDy9yKrgDj/0t2PsA6rMLWuxwpwblQ= Cc: Mark Kettenis , Heinrich Schuchardt , Andy Shevchenko , u-boot@lists.denx.de Subject: [U-Boot] [PATCH 2/3] scripts/Makefile.lib: generalize building built in EFI app X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Replace all occurences of helloworld by generalized forms. This allows us to build additional EFI applications that are included into the U-Boot binary without loading scripts/Makefile.lib with specific filenames. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass --- scripts/Makefile.lib | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 164c234b4c..c73464b854 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -342,20 +342,22 @@ cmd_S_ttf= \ $(obj)/%.S: $(src)/%.ttf $(call cmd,S_ttf) -# EFI Hello World application +# EFI applications +# A Makefile target *.efi is built as EFI application. +# A Makefile target *_efi.S wraps *.efi as built-in EFI application. # --------------------------------------------------------------------------- # Generate an assembly file to wrap the EFI app -cmd_S_efi= \ -( \ - echo '.section .rodata.efi.init,"a"'; \ - echo '.balign 16'; \ - echo '.global __efi_helloworld_begin'; \ - echo '__efi_helloworld_begin:'; \ - echo '.incbin "$<" '; \ - echo '__efi_helloworld_end:'; \ - echo '.global __efi_helloworld_end'; \ - echo '.balign 16'; \ +cmd_S_efi= \ +( \ + echo '.section .rodata.$*.init,"a"'; \ + echo '.balign 16'; \ + echo '.global __efi_$*_begin'; \ + echo '__efi_$*_begin:'; \ + echo '.incbin "$<" '; \ + echo '__efi_$*_end:'; \ + echo '.global __efi_$*_end'; \ + echo '.balign 16'; \ ) > $@ $(obj)/%_efi.S: $(obj)/%.efi @@ -366,7 +368,7 @@ cmd_efi_objcopy = $(OBJCOPY) -j .header -j .text -j .sdata -j .data -j \ .dynamic -j .dynsym -j .rel* -j .rela* -j .reloc \ $(if $(EFI_TARGET),$(EFI_TARGET),-O binary) $^ $@ -$(obj)/%.efi: $(obj)/%.so +$(obj)/%.efi: $(obj)/%_efi.so $(call cmd,efi_objcopy) quiet_cmd_efi_ld = LD $@ @@ -375,7 +377,7 @@ cmd_efi_ld = $(LD) -nostdlib -znocombreloc -T $(EFI_LDS_PATH) -shared \ EFI_LDS_PATH = $(srctree)/arch/$(ARCH)/lib/$(EFI_LDS) -$(obj)/helloworld.so: $(obj)/helloworld.o arch/$(ARCH)/lib/$(EFI_CRT0) \ +$(obj)/%_efi.so: $(obj)/%.o $(%_deps) arch/$(ARCH)/lib/$(EFI_CRT0) \ arch/$(ARCH)/lib/$(EFI_RELOC) $(call cmd,efi_ld) From patchwork Tue Sep 5 01:19:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 809886 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3xmTTJ430tz9s7f for ; Tue, 5 Sep 2017 11:21:56 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 55FE0C21C6D; Tue, 5 Sep 2017 01:21:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id C73D9C21F55; Tue, 5 Sep 2017 01:20:57 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 5B411C21EE1; Tue, 5 Sep 2017 01:20:45 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) by lists.denx.de (Postfix) with ESMTPS id 357D5C21D96 for ; Tue, 5 Sep 2017 01:20:42 +0000 (UTC) Received: from laptop1.fritz.box ([94.197.121.125]) by mail.gmx.com (mrgmx001 [212.227.17.184]) with ESMTPSA (Nemesis) id 0LlDb4-1dF9l62qmc-00b0zA; Tue, 05 Sep 2017 03:20:35 +0200 From: Heinrich Schuchardt To: Alexander Graf Date: Tue, 5 Sep 2017 03:19:39 +0200 Message-Id: <20170905011939.5794-4-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170905011939.5794-1-xypron.glpk@gmx.de> References: <20170905011939.5794-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:jWBP43oMH349zHuWHaZbppht31X75+A7mx6pRQmbAZGcVr4swjD Dvnv/uhiXRZuTQVY0dqz4jgwkoZ7FgFkdKw9EXlAQYrvu/DIygIEVDcJL9b/USXbEjWXeuH Yzim0vv8GiVK5JZIRkC/tKjw+q4U2SMeLeQqgzj4IMBWNfbd6r3gMUoLW5t59vjYNrJIjR1 afig/D/IM6KIYiqpzPbtw== X-UI-Out-Filterresults: notjunk:1; V01:K0:kc1T0Cb7RSg=:tN8phbZtBIQjvt6VBRCfp0 zGM7asr59rR+tI9d6Lk5R41PIGUGLjJEsrev4/qKTyEkRHczcyafZAN6m0t/4wVaCv+tNmV58 +qMgA4Sl0KVveIHsopGfahA0Vn6XbSLusj5VBoI7zMItDSa1D3aF8sfHcUsBrl2iX/y78pIeI rJSWNtA5BrdECLrh6sQCrfbQ+NCABwUPDbvWFl+MtOWRJGJj69ytoh/jo1UrA3FwPWnQPisAL 9GbGEyViLjoPK7+nRJwIktMjnN3nhxs991zEEdj3+wZ+nlBvksoJyglSx1g4mw65wJJNIuuYa bVPLzrsqK4UM3OmgJzY51mxhTvAc7g4C7U5kaYJe99OZY0Yxu22ONeCyaSvoiHudhivgwwJ+z rbWQyT5MsPklZWjhDRf/bUq6sdZO3qc9LGalWpMT/xCnAq2qWy5aams4VUWt8PJCfduDTtx1U QUC5PCeJr3xHXWC9RR+HzL0VuTkxrtVLsYA47Te7UJ2L7DxfndmB1YD1dSmJs+0YoDNCScJBU 5JF5npd7DRQVbndOzItxC3olx4aeDMvJnDqW1TP7HuKqehC4s+lzXrjTRtVqUufARLE/G0rTY 98F2MELuRCiYaFs2TbqHylY9gE6qZZQ7sSyLNOmtOEOIuzKLc5DNkV4SDf1eN6uRRZDx2V6bf qyDl/Qjo1jAhZQCZIZ67mNYMUBkfaLfZLRiKFlNKsP79iKLAaCnr1pocvqJx8QM3+GZ3vHVbh HGqRsWwI2jQbbErrqSwgJd+1ggSR3tp8K/e4lfbUtCg8Mc+2uMiQ25f55ImnKXmMYQmG+c8vJ tQIbsjxGuEhOWC9v0qtGEOMVCpIMjRnFsAumdHfR+n4ZZej0Gw= Cc: Mark Kettenis , Heinrich Schuchardt , Andy Shevchenko , u-boot@lists.denx.de Subject: [U-Boot] [PATCH 3/3] efi_loader: usage of always in Makefile X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Variable always should only be appended but not overwritten by lib/efi_loader/Makefile. Remove variable efiprogs which is not otherwise used. Signed-off-by: Heinrich Schuchardt Reviewed-by: Simon Glass --- lib/efi_loader/Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index 6bca05aeb4..5200497230 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -10,8 +10,9 @@ CFLAGS_helloworld.o := $(CFLAGS_EFI) CFLAGS_REMOVE_helloworld.o := $(CFLAGS_NON_EFI) -efiprogs-$(CONFIG_CMD_BOOTEFI_HELLO_COMPILE) += helloworld.efi -always := $(efiprogs-y) +ifneq ($(CONFIG_CMD_BOOTEFI_HELLO_COMPILE),) +always += helloworld.efi +endif obj-$(CONFIG_CMD_BOOTEFI_HELLO) += helloworld_efi.o obj-y += efi_image_loader.o efi_boottime.o efi_runtime.o efi_console.o