binutils-gdb/gdb/testsuite/gdb.python
Andrew Burgess 61e2dde2db gdb/python: handle saving user registers in a frame unwinder
This patch came about because I wanted to write a frame unwinder that
would corrupt the backtrace in a particular way.  In order to achieve
what I wanted I ended up trying to write an unwinder like this:

  class FrameId(object):
      .... snip class definition ....

  class TestUnwinder(Unwinder):
      def __init__(self):
          Unwinder.__init__(self, "some name")

      def __call__(self, pending_frame):
          pc_desc = pending_frame.architecture().registers().find("pc")
          pc = pending_frame.read_register(pc_desc)

          sp_desc = pending_frame.architecture().registers().find("sp")
          sp = pending_frame.read_register(sp_desc)

          # ... snip code to decide if this unwinder applies or not.

          fid = FrameId(pc, sp)
          unwinder = pending_frame.create_unwind_info(fid)
          unwinder.add_saved_register(pc_desc, pc)
          unwinder.add_saved_register(sp_desc, sp)
          return unwinder

The important things here are the two calls:

          unwinder.add_saved_register(pc_desc, pc)
          unwinder.add_saved_register(sp_desc, sp)

On x86-64 these would fail with an assertion error:

  gdb/regcache.c:168: internal-error: int register_size(gdbarch*, int): Assertion `regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch)' failed.

What happens is that in unwind_infopy_add_saved_register (py-unwind.c)
we call register_size, as register_size should only be called on
cooked (real or pseudo) registers, and 'pc' and 'sp' are implemented
as user registers (at least on x86-64), we trigger the assertion.

A simple fix would be to check in unwind_infopy_add_saved_register if
the register number we are handling is a cooked register or not, if
not we can throw a 'Bad register' error back to the Python code.

However, I think we can do better.

Consider that at the CLI we can do this:

  (gdb) set $pc=0x1234

This works because GDB first evaluates '$pc' to get a register value,
then evaluates '0x1234' to create a value encapsulating the
immediate.  The contents of the immediate value are then copied back
to the location of the register value representing '$pc'.

The value location for a user-register will (usually) be the location
of the real register that was accessed, so on x86-64 we'd expect this
to be $rip.

So, in this patch I propose that in the unwinder code, when
add_saved_register is called, if it is passed a
user-register (i.e. non-cooked) then we first fetch the register,
extract the real register number from the value's location, and use
that new register number when handling the add_saved_register call.

If either the value location that we get for the user-register is not
a cooked register then we can throw a 'Bad register' error back to the
Python code, but in most cases this will not happen.

gdb/ChangeLog:

	* python/py-unwind.c (unwind_infopy_add_saved_register): Handle
	saving user registers.

gdb/testsuite/ChangeLog:

	* gdb.python/py-unwind-user-regs.c: New file.
	* gdb.python/py-unwind-user-regs.exp: New file.
	* gdb.python/py-unwind-user-regs.py: New file.
2021-06-21 16:09:05 +01:00
..
amd64-py-framefilter-invalidarg.S Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
compare-enum-type-a.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
compare-enum-type-b.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
compare-enum-type.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
compare-enum-type.h Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
flexible-array-member.c gdb: fix getting range of flexible array member in Python 2021-04-22 15:01:28 -04:00
flexible-array-member.exp gdb/testsuite: adjust gdb.python/flexible-array-member.exp expected pattern 2021-05-04 11:20:19 -04:00
lib-types.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
lib-types.exp gdb/testsuite: check the correct Python variable in test 2021-03-12 12:18:33 +00:00
libpy-autoloaded-pretty-printers-in-newobjfile-event.so-gdb.py gdb: do autoload before notifying Python side in new_objfile event 2021-04-27 11:22:32 -04:00
py-arch-reg-groups.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-arch-reg-names.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-arch.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-arch.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-as-string.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-as-string.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-auto-load-chaining-f1.c gdb: use make_scoped_restore to restore gdbpy_current_objfile 2021-03-15 09:21:37 +00:00
py-auto-load-chaining-f1.o-gdb.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-auto-load-chaining-f2.c gdb: use make_scoped_restore to restore gdbpy_current_objfile 2021-03-15 09:21:37 +00:00
py-auto-load-chaining-f2.o-gdb.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-auto-load-chaining.c gdb: use make_scoped_restore to restore gdbpy_current_objfile 2021-03-15 09:21:37 +00:00
py-auto-load-chaining.exp gdb: use make_scoped_restore to restore gdbpy_current_objfile 2021-03-15 09:21:37 +00:00
py-autoloaded-pretty-printers-in-newobjfile-event-lib.cc gdb: do autoload before notifying Python side in new_objfile event 2021-04-27 11:22:32 -04:00
py-autoloaded-pretty-printers-in-newobjfile-event-lib.h gdb: do autoload before notifying Python side in new_objfile event 2021-04-27 11:22:32 -04:00
py-autoloaded-pretty-printers-in-newobjfile-event-main.cc gdb: do autoload before notifying Python side in new_objfile event 2021-04-27 11:22:32 -04:00
py-autoloaded-pretty-printers-in-newobjfile-event.exp gdb: do autoload before notifying Python side in new_objfile event 2021-04-27 11:22:32 -04:00
py-autoloaded-pretty-printers-in-newobjfile-event.py gdb: do autoload before notifying Python side in new_objfile event 2021-04-27 11:22:32 -04:00
py-bad-printers.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-bad-printers.exp gdb/testsuite: resolve remaining duplicate test names in gdb.python/*.exp 2021-03-12 12:18:34 +00:00
py-bad-printers.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-block.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-block.exp gdb/testsuite: make test names unique in gdb.python/py-block.exp 2021-03-12 12:18:33 +00:00
py-breakpoint-create-fail.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-breakpoint-create-fail.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-breakpoint-create-fail.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-breakpoint.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-breakpoint.exp Add Python support for hardware breakpoints 2021-01-21 18:55:45 +01:00
py-caller-is.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-caller-is.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-cmd.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-cmd.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-completion.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-completion.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-error.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-error.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-events-shlib.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-events.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-events.exp gdb: fix eval.c assert during inferior exit event 2021-06-03 21:22:08 +01:00
py-events.py gdb: fix eval.c assert during inferior exit event 2021-06-03 21:22:08 +01:00
py-evsignal.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-evthreads.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-evthreads.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-explore-cc.exp gdb/testsuite: make test names unique in gdb.python/py-explore-cc.exp 2021-03-12 12:18:33 +00:00
py-explore.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-explore.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-explore.exp gdb/testsuite: make test names unique in gdb.python/py-explore.exp 2021-03-12 12:18:33 +00:00
py-finish-breakpoint.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-finish-breakpoint.exp gdb/testsuite: make test names unique in gdb.python/py-finish-breakpoint.exp 2021-03-12 12:18:33 +00:00
py-finish-breakpoint.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-finish-breakpoint2.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-finish-breakpoint2.exp gdb/testsuite: resolve remaining duplicate test names in gdb.python/*.exp 2021-03-12 12:18:34 +00:00
py-finish-breakpoint2.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-format-string.c gdb: fix pretty printing max depth behaviour 2021-05-14 06:51:21 +01:00
py-format-string.exp gdb: fix pretty printing max depth behaviour 2021-05-14 06:51:21 +01:00
py-format-string.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-frame-args.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-frame-args.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-frame-args.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-frame-inline.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-frame-inline.exp gdb/testsuite: resolve remaining duplicate test names in gdb.python/*.exp 2021-03-12 12:18:34 +00:00
py-frame.c
py-frame.exp gdb/testsuite: resolve remaining duplicate test names in gdb.python/*.exp 2021-03-12 12:18:34 +00:00
py-framefilter-addr.c gdb/python: fix FrameDecorator regression on Python 2 2021-03-16 09:31:56 +00:00
py-framefilter-addr.exp gdb/python: fix FrameDecorator regression on Python 2 2021-03-16 09:31:56 +00:00
py-framefilter-addr.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-framefilter-gdb.py gdb/testsuite: rename .py.in files to .py 2021-05-17 14:58:26 -04:00
py-framefilter-invalidarg-gdb.py gdb/testsuite: rename .py.in files to .py 2021-05-17 14:58:26 -04:00
py-framefilter-invalidarg.exp gdb/testsuite: rename .py.in files to .py 2021-05-17 14:58:26 -04:00
py-framefilter-invalidarg.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-framefilter-mi.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-framefilter-mi.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-framefilter.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-framefilter.exp gdb/testsuite: rename .py.in files to .py 2021-05-17 14:58:26 -04:00
py-framefilter.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-function.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-inferior.c
py-inferior.exp gdb/python: add a 'connection_num' attribute to Inferior objects 2021-05-14 15:33:23 +02:00
py-infthread.c
py-infthread.exp gdb/testsuite: resolve remaining duplicate test names in gdb.python/*.exp 2021-03-12 12:18:34 +00:00
py-lazy-string.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-lazy-string.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-linetable.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-linetable.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-linetable.S Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-lookup-type.exp gdb/testsuite: remove a duplicate test 2021-03-12 12:18:33 +00:00
py-mi-events-gdb.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-mi-events.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-mi-events.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-mi-objfile-gdb.py Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-mi-objfile.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-mi-objfile.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-mi-var-info-path-expression.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-mi-var-info-path-expression.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-mi-var-info-path-expression.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-mi.exp gdb/testsuite: make test names unique in gdb.python/py-mi.exp 2021-03-12 12:18:33 +00:00
py-nested-maps.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-nested-maps.exp gdb: fix pretty printing max depth behaviour 2021-05-14 06:51:21 +01:00
py-nested-maps.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-objfile-script-gdb.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-objfile-script.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-objfile-script.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-objfile.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-objfile.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-parameter.exp gdb/testsuite: don't include paths in test names 2021-04-15 21:33:58 +01:00
py-pp-integral.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-pp-integral.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-pp-integral.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-pp-maint.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-pp-maint.exp gdb/testsuite: make test names unique in gdb.python/py-pp-maint.exp 2021-03-12 12:18:33 +00:00
py-pp-maint.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-pp-re-notag.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-pp-re-notag.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-pp-re-notag.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-pp-registration.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-pp-registration.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-pp-registration.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-prettyprint.c gdb/testsuite: more testing of pretty printer 'array' display_hint 2021-03-26 17:43:14 +00:00
py-prettyprint.exp gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-prettyprint.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-progspace.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-progspace.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-prompt.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-prompt.exp gdb/testsuite: make test names unique in gdb.python/py-prompt.exp 2021-03-12 12:18:33 +00:00
py-rbreak-func2.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-rbreak.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-rbreak.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-record-btrace-threads.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-record-btrace-threads.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-record-btrace.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-record-btrace.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-record-full.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-record-full.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-recurse-unwind.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-recurse-unwind.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-recurse-unwind.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-rvalue-ref-value-cc.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-rvalue-ref-value-cc.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-section-script.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-section-script.exp gdb: Remove arm-symbianelf support 2021-02-11 07:23:42 +10:30
py-section-script.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-shared-sl.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-shared.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-shared.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-startup-opt.exp gdb/testsuite: update expected results in gdb.python/py-startup-opt.exp 2021-05-03 12:21:00 +01:00
py-strfns.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-strfns.exp gdb/testsuite: make test names unique in gdb.python/py-strfns.exp 2021-03-12 12:18:33 +00:00
py-symbol-2.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-symbol.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-symbol.exp Fix symbol constants tests for Python 3 2021-06-05 14:46:30 +02:00
py-symtab.exp gdb/testsuite: make test names unique in gdb.python/py-symtab.exp 2021-03-12 12:18:33 +00:00
py-sync-interp.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-sync-interp.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-template.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-template.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-thrhandle.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-thrhandle.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-type.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-type.exp gdb: update Type.fields doc based on actual GDB behavior 2021-05-04 22:19:05 -04:00
py-typeprint.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-typeprint.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-typeprint.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-unwind-inline.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-unwind-inline.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-unwind-inline.py Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
py-unwind-maint.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-unwind-maint.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-unwind-maint.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-unwind-user-regs.c gdb/python: handle saving user registers in a frame unwinder 2021-06-21 16:09:05 +01:00
py-unwind-user-regs.exp gdb/python: handle saving user registers in a frame unwinder 2021-06-21 16:09:05 +01:00
py-unwind-user-regs.py gdb/python: handle saving user registers in a frame unwinder 2021-06-21 16:09:05 +01:00
py-unwind.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-unwind.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-unwind.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
py-value-cc.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-value-cc.exp gdb/testsuite: remove duplicate test from gdb.python/py-value-cc.exp 2021-03-12 12:18:34 +00:00
py-value.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-value.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-xmethods.cc Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-xmethods.exp Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
py-xmethods.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
python-1.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
python.c Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
python.exp Use is/is not to check for None in python code. 2021-06-08 23:49:05 +01:00
source1 Update copyright year range in all GDB files 2021-01-01 12:12:21 +04:00
source2.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
tui-window-disabled.c gdb: return true in TuiWindow.is_valid only if TUI is enabled 2021-02-08 11:56:16 +00:00
tui-window-disabled.exp gdb: return true in TuiWindow.is_valid only if TUI is enabled 2021-02-08 11:56:16 +00:00
tui-window-disabled.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00
tui-window.exp gdb/python: don't allow the user to delete window title attributes 2021-02-08 11:55:05 +00:00
tui-window.py gdb: re-format Python files using black 21.4b0 2021-05-07 10:56:20 -04:00